cms-block-editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/CMSBlockEditor.tsx","../src/core/EditorShell.tsx","../src/plugins/SlashCommandPlugin.tsx","../src/blocks/ImageNode.tsx","../src/blocks/YouTubeNode.tsx","../src/blocks/QuoteNode.ts","../src/blocks/ColumnsNode.ts","../src/plugins/ToolbarPlugin.tsx","../src/plugins/ColorPickerPlugin.tsx","../src/plugins/SpacingPlugin.tsx","../src/plugins/ExportImportPlugin.tsx","../src/utils/htmlExport.ts","../src/utils/markdownExport.ts","../src/utils/htmlImport.ts","../src/utils/markdownImport.ts","../src/plugins/SectionCreatorPlugin.tsx","../src/blocks/SectionNode.tsx","../src/utils/sectionTemplates.ts","../src/plugins/ImageUploadPlugin.tsx","../src/plugins/LinkPlugin.tsx","../src/plugins/SectionEditorPlugin.tsx","../src/plugins/EmbedPlugin.tsx","../src/blocks/EmbedNode.tsx","../src/core/EditorConfig.ts","../src/core/CMSRenderer.tsx"],"sourcesContent":["import { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport EditorShell from \"./EditorShell\";\nimport { createEditorConfig } from \"./EditorConfig\";\n\ninterface CMSBlockEditorProps {\n value?: string;\n onChange?: (state: any) => void;\n}\n\nexport default function CMSBlockEditor({ value, onChange }: CMSBlockEditorProps) {\n return (\n <LexicalComposer initialConfig={createEditorConfig(value)}>\n <EditorShell onChange={onChange} />\n </LexicalComposer>\n );\n}","import { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { LinkPlugin as LexicalLinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport LexicalErrorBoundary from \"@lexical/react/LexicalErrorBoundary\";\nimport SlashCommandPlugin from \"../plugins/SlashCommandPlugin\";\nimport ToolbarPlugin from \"../plugins/ToolbarPlugin\";\nimport ImageUploadPlugin from \"../plugins/ImageUploadPlugin\";\nimport LinkPlugin from \"../plugins/LinkPlugin\";\nimport SectionEditorPlugin from \"../plugins/SectionEditorPlugin\";\nimport EmbedPlugin from \"../plugins/EmbedPlugin\";\nimport \"../styles/editor.css\";\n\nexport default function EditorShell({ onChange }: { onChange?: (state: any) => void }) {\n return (\n <div className=\"cms-editor-shell\">\n <ToolbarPlugin />\n <RichTextPlugin\n contentEditable={<ContentEditable className=\"cms-editor-content\" />}\n placeholder={<div className=\"cms-editor-placeholder\">Start typing or press / for commands...</div>}\n ErrorBoundary={LexicalErrorBoundary}\n />\n <HistoryPlugin />\n <ListPlugin />\n <LexicalLinkPlugin />\n <SlashCommandPlugin />\n <ImageUploadPlugin />\n <LinkPlugin />\n <SectionEditorPlugin />\n <EmbedPlugin />\n {onChange && (\n <OnChangePlugin\n onChange={(editorState) => {\n onChange(editorState);\n }}\n />\n )}\n </div>\n );\n}","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect, useState } from \"react\";\nimport { \n $createParagraphNode, \n $getSelection, \n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n TextNode,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_ENTER_COMMAND,\n} from \"lexical\";\nimport { $createHeadingNode } from \"@lexical/rich-text\";\nimport { $createListNode, $createListItemNode } from \"@lexical/list\";\nimport { ImageNode } from \"../blocks/ImageNode\";\nimport { YouTubeNode } from \"../blocks/YouTubeNode\";\nimport { QuoteNode } from \"../blocks/QuoteNode\";\nimport { ColumnsNode, ColumnNode } from \"../blocks/ColumnsNode\";\n\ninterface SlashCommand {\n title: string;\n description: string;\n keywords: string[];\n onSelect: (editor: any) => void;\n}\n\nexport default function SlashCommandPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showMenu, setShowMenu] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const commands: SlashCommand[] = [\n {\n title: \"Heading 1\",\n description: \"Large section heading\",\n keywords: [\"h1\", \"heading\", \"title\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const heading = $createHeadingNode(\"h1\");\n selection.insertNodes([heading]);\n }\n });\n },\n },\n {\n title: \"Heading 2\",\n description: \"Medium section heading\",\n keywords: [\"h2\", \"heading\", \"subtitle\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const heading = $createHeadingNode(\"h2\");\n selection.insertNodes([heading]);\n }\n });\n },\n },\n {\n title: \"Heading 3\",\n description: \"Small section heading\",\n keywords: [\"h3\", \"heading\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const heading = $createHeadingNode(\"h3\");\n selection.insertNodes([heading]);\n }\n });\n },\n },\n {\n title: \"Bullet List\",\n description: \"Create a bulleted list\",\n keywords: [\"ul\", \"list\", \"bullet\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const list = $createListNode(\"bullet\");\n const listItem = $createListItemNode();\n list.append(listItem);\n selection.insertNodes([list]);\n }\n });\n },\n },\n {\n title: \"Numbered List\",\n description: \"Create a numbered list\",\n keywords: [\"ol\", \"list\", \"number\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const list = $createListNode(\"number\");\n const listItem = $createListItemNode();\n list.append(listItem);\n selection.insertNodes([list]);\n }\n });\n },\n },\n {\n title: \"Quote\",\n description: \"Insert a quote block\",\n keywords: [\"quote\", \"blockquote\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const quote = new QuoteNode();\n const paragraph = $createParagraphNode();\n quote.append(paragraph);\n selection.insertNodes([quote]);\n }\n });\n },\n },\n {\n title: \"Image\",\n description: \"Insert an image\",\n keywords: [\"image\", \"img\", \"picture\", \"photo\"],\n onSelect: (editor) => {\n // Create a file input element\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n \n input.onchange = (e: any) => {\n const file = e.target?.files?.[0];\n if (file) {\n // Convert to base64 or object URL\n const reader = new FileReader();\n reader.onload = (event) => {\n const url = event.target?.result as string;\n const alt = file.name.replace(/\\.[^/.]+$/, \"\"); // filename without extension\n \n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const imageNode = new ImageNode(url, alt);\n const nodes = [imageNode];\n selection.insertNodes(nodes);\n }\n });\n };\n reader.readAsDataURL(file);\n }\n };\n \n input.click();\n },\n },\n {\n title: \"Image from URL\",\n description: \"Insert an image from a URL\",\n keywords: [\"image\", \"url\", \"link\", \"web\"],\n onSelect: (editor) => {\n const url = prompt(\"Enter image URL:\");\n if (url) {\n const alt = prompt(\"Enter alt text (optional):\") || \"\";\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const imageNode = new ImageNode(url, alt);\n selection.insertNodes([imageNode]);\n }\n });\n }\n },\n },\n {\n title: \"YouTube\",\n description: \"Embed a YouTube video\",\n keywords: [\"youtube\", \"video\", \"embed\"],\n onSelect: (editor) => {\n const id = prompt(\"Enter YouTube video ID:\");\n if (id) {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const youtubeNode = new YouTubeNode(id);\n selection.insertNodes([youtubeNode]);\n }\n });\n }\n },\n },\n {\n title: \"Columns\",\n description: \"Create a two-column layout\",\n keywords: [\"columns\", \"layout\", \"grid\"],\n onSelect: (editor) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const columns = new ColumnsNode();\n const col1 = new ColumnNode();\n const col2 = new ColumnNode();\n const p1 = $createParagraphNode();\n const p2 = $createParagraphNode();\n col1.append(p1);\n col2.append(p2);\n columns.append(col1, col2);\n selection.insertNodes([columns]);\n }\n });\n },\n },\n ];\n\n const filteredCommands = commands.filter((cmd) => {\n const searchLower = search.toLowerCase();\n return (\n cmd.title.toLowerCase().includes(searchLower) ||\n cmd.description.toLowerCase().includes(searchLower) ||\n cmd.keywords.some((kw) => kw.includes(searchLower))\n );\n });\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = selection.anchor.getNode();\n const text = node.getTextContent();\n \n // Check if we just typed \"/\"\n if (text.endsWith(\"/\")) {\n setShowMenu(true);\n setSearch(\"\");\n setSelectedIndex(0);\n } else if (showMenu) {\n // Extract search term after \"/\"\n const lastSlashIndex = text.lastIndexOf(\"/\");\n if (lastSlashIndex !== -1) {\n const searchTerm = text.substring(lastSlashIndex + 1);\n setSearch(searchTerm);\n }\n }\n }\n });\n });\n }, [editor, showMenu]);\n\n useEffect(() => {\n if (!showMenu) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedIndex((prev) => \n prev < filteredCommands.length - 1 ? prev + 1 : prev\n );\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n if (filteredCommands[selectedIndex]) {\n executeCommand(filteredCommands[selectedIndex]);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setShowMenu(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [showMenu, selectedIndex, filteredCommands]);\n\n const executeCommand = (command: SlashCommand) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = selection.anchor.getNode();\n const text = node.getTextContent();\n const lastSlashIndex = text.lastIndexOf(\"/\");\n \n if (lastSlashIndex !== -1) {\n // Remove the slash command text\n const textNode = node as TextNode;\n const newText = text.substring(0, lastSlashIndex);\n textNode.setTextContent(newText);\n }\n }\n });\n\n command.onSelect(editor);\n setShowMenu(false);\n setSearch(\"\");\n setSelectedIndex(0);\n };\n\n if (!showMenu || filteredCommands.length === 0) {\n return null;\n }\n\n return (\n <div className=\"slash-menu\">\n <div className=\"slash-menu-title\">Commands</div>\n {filteredCommands.map((cmd, index) => (\n <div\n key={cmd.title}\n className={`slash-menu-item ${index === selectedIndex ? \"selected\" : \"\"}`}\n onClick={() => executeCommand(cmd)}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"slash-menu-item-title\">{cmd.title}</div>\n <div className=\"slash-menu-item-description\">{cmd.description}</div>\n </div>\n ))}\n </div>\n );\n}","import { DecoratorNode, NodeKey, SerializedLexicalNode, Spread, LexicalEditor } from \"lexical\";\nimport React, { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type SerializedImageNode = Spread<\n {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n },\n SerializedLexicalNode\n>;\n\nfunction ImageComponent({ \n src, \n alt, \n width: initialWidth,\n height: initialHeight,\n nodeKey,\n editor\n}: { \n src: string; \n alt: string; \n width?: number;\n height?: number;\n nodeKey: NodeKey;\n editor: LexicalEditor;\n}) {\n const imageRef = useRef<HTMLImageElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [size, setSize] = useState({ \n width: initialWidth || 0, \n height: initialHeight || 0 \n });\n\n useEffect(() => {\n // Load natural dimensions if not set\n if (imageRef.current && (!size.width || !size.height)) {\n const img = imageRef.current;\n const onLoad = () => {\n setSize({\n width: initialWidth || img.naturalWidth,\n height: initialHeight || img.naturalHeight\n });\n };\n \n if (img.complete) {\n onLoad();\n } else {\n img.addEventListener('load', onLoad);\n return () => img.removeEventListener('load', onLoad);\n }\n }\n }, [initialWidth, initialHeight, size.width, size.height]);\n\n const onResizeStart = useCallback((e: React.MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n\n const startX = e.clientX;\n const startY = e.clientY;\n const startWidth = size.width;\n const startHeight = size.height;\n const aspectRatio = startWidth / startHeight;\n\n let finalWidth = startWidth;\n let finalHeight = startHeight;\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n \n let newWidth = startWidth;\n let newHeight = startHeight;\n\n // Handle different resize directions\n if (direction === 'e' || direction === 'ne' || direction === 'se') {\n newWidth = Math.max(100, startWidth + deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'w' || direction === 'nw' || direction === 'sw') {\n newWidth = Math.max(100, startWidth - deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'n') {\n newHeight = Math.max(100, startHeight - deltaY);\n newWidth = newHeight * aspectRatio;\n } else if (direction === 's') {\n newHeight = Math.max(100, startHeight + deltaY);\n newWidth = newHeight * aspectRatio;\n }\n\n finalWidth = newWidth;\n finalHeight = newHeight;\n setSize({ width: newWidth, height: newHeight });\n };\n\n const onMouseUp = () => {\n setIsResizing(false);\n \n // Update the node with new dimensions\n editor.update(() => {\n const node = editor.getEditorState()._nodeMap.get(nodeKey);\n if (node && node instanceof ImageNode) {\n const writable = node.getWritable() as ImageNode;\n writable.__width = finalWidth;\n writable.__height = finalHeight;\n }\n });\n \n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [size, editor, nodeKey]);\n\n const onDragStart = useCallback((e: React.MouseEvent) => {\n // Don't start drag if clicking on resize handles\n if ((e.target as HTMLElement).className.includes('resize-handle')) {\n return;\n }\n \n e.preventDefault();\n setIsDragging(true);\n \n const wrapper = wrapperRef.current;\n if (!wrapper) return;\n\n // Create a dragging clone\n const clone = wrapper.cloneNode(true) as HTMLElement;\n clone.style.position = 'fixed';\n clone.style.pointerEvents = 'none';\n clone.style.opacity = '0.5';\n clone.style.zIndex = '9999';\n clone.style.left = `${e.clientX - wrapper.offsetWidth / 2}px`;\n clone.style.top = `${e.clientY - wrapper.offsetHeight / 2}px`;\n document.body.appendChild(clone);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n clone.style.left = `${moveEvent.clientX - wrapper.offsetWidth / 2}px`;\n clone.style.top = `${moveEvent.clientY - wrapper.offsetHeight / 2}px`;\n };\n\n const onMouseUp = (upEvent: MouseEvent) => {\n setIsDragging(false);\n document.body.removeChild(clone);\n \n // Find the drop target in the editor\n const dropTarget = document.elementFromPoint(upEvent.clientX, upEvent.clientY);\n if (dropTarget && dropTarget.closest('.editor-content')) {\n // Move the node in Lexical\n editor.update(() => {\n const node = editor.getEditorState()._nodeMap.get(nodeKey);\n if (node) {\n // Remove from current position\n node.remove();\n \n // Insert at new position (simplified - inserts at end)\n const root = editor.getEditorState()._nodeMap.get('root');\n if (root) {\n const newNode = new ImageNode(src, alt, size.width, size.height);\n //@ts-ignore\n root.append(newNode);\n }\n }\n });\n }\n \n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [src, alt, size, nodeKey, editor]);\n\n return (\n <div \n ref={wrapperRef}\n className={`image-node-wrapper ${isSelected ? 'selected' : ''} ${isResizing ? 'resizing' : ''} ${isDragging ? 'dragging' : ''}`}\n onClick={() => setIsSelected(!isSelected)}\n onMouseDown={isSelected ? onDragStart : undefined}\n style={{ \n width: size.width ? `${size.width}px` : 'auto',\n maxWidth: '100%',\n position: 'relative',\n display: 'inline-block',\n margin: '16px 0',\n cursor: isSelected ? 'move' : 'pointer'\n }}\n >\n <img \n ref={imageRef}\n src={src} \n alt={alt}\n draggable={false}\n style={{\n width: '100%',\n height: 'auto',\n display: 'block',\n borderRadius: '4px',\n border: isSelected ? '2px solid #667eea' : '2px solid transparent',\n transition: 'border-color 0.2s'\n }}\n />\n {isSelected && (\n <>\n {/* Corner handles */}\n <div \n className=\"image-resize-handle image-resize-handle-nw\"\n onMouseDown={(e) => onResizeStart(e, 'nw')}\n style={{\n position: 'absolute',\n left: '-4px',\n top: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nwse-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-ne\"\n onMouseDown={(e) => onResizeStart(e, 'ne')}\n style={{\n position: 'absolute',\n right: '-4px',\n top: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nesw-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-sw\"\n onMouseDown={(e) => onResizeStart(e, 'sw')}\n style={{\n position: 'absolute',\n left: '-4px',\n bottom: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nesw-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-se\"\n onMouseDown={(e) => onResizeStart(e, 'se')}\n style={{\n position: 'absolute',\n right: '-4px',\n bottom: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nwse-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white'\n }}\n />\n \n {/* Edge handles */}\n <div \n className=\"image-resize-handle image-resize-handle-n\"\n onMouseDown={(e) => onResizeStart(e, 'n')}\n style={{\n position: 'absolute',\n left: '50%',\n top: '-4px',\n transform: 'translateX(-50%)',\n width: '40px',\n height: '8px',\n background: '#667eea',\n cursor: 'ns-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-s\"\n onMouseDown={(e) => onResizeStart(e, 's')}\n style={{\n position: 'absolute',\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n width: '40px',\n height: '8px',\n background: '#667eea',\n cursor: 'ns-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-e\"\n onMouseDown={(e) => onResizeStart(e, 'e')}\n style={{\n position: 'absolute',\n right: '-4px',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '40px',\n background: '#667eea',\n cursor: 'ew-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}\n />\n <div \n className=\"image-resize-handle image-resize-handle-w\"\n onMouseDown={(e) => onResizeStart(e, 'w')}\n style={{\n position: 'absolute',\n left: '-4px',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '40px',\n background: '#667eea',\n cursor: 'ew-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}\n />\n </>\n )}\n </div>\n );\n}\n\nexport class ImageNode extends DecoratorNode<JSX.Element> {\n __src: string;\n __alt: string;\n __width?: number;\n __height?: number;\n\n static getType() { return \"image\"; }\n \n static clone(node: ImageNode): ImageNode { \n return new ImageNode(node.__src, node.__alt, node.__width, node.__height, node.__key); \n }\n\n static isInline(): boolean {\n return true;\n }\n\n constructor(src: string, alt: string = \"\", width?: number, height?: number, key?: NodeKey) {\n super(key);\n this.__src = src;\n this.__alt = alt;\n this.__width = width;\n this.__height = height;\n }\n\n createDOM(): HTMLElement {\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.maxWidth = '100%';\n return span;\n }\n\n updateDOM(): boolean {\n return false;\n }\n\n decorate(editor: LexicalEditor): JSX.Element {\n return (\n <ImageComponent \n src={this.__src} \n alt={this.__alt}\n width={this.__width}\n height={this.__height}\n nodeKey={this.__key}\n editor={editor}\n />\n );\n }\n\n exportJSON(): SerializedImageNode {\n return { \n type: \"image\", \n src: this.__src, \n alt: this.__alt,\n width: this.__width,\n height: this.__height,\n version: 1 \n };\n }\n\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\n return new ImageNode(\n serializedNode.src, \n serializedNode.alt,\n serializedNode.width,\n serializedNode.height\n );\n }\n}\n","import { DecoratorNode, NodeKey, SerializedLexicalNode, Spread, LexicalEditor } from \"lexical\";\nimport React, { JSX, useCallback, useRef, useState } from \"react\";\n\nexport type SerializedYouTubeNode = Spread<\n {\n id: string;\n width?: number;\n height?: number;\n },\n SerializedLexicalNode\n>;\n\nfunction YouTubeComponent({\n id,\n width: initialWidth,\n height: initialHeight,\n nodeKey,\n editor\n}: {\n id: string;\n width?: number;\n height?: number;\n nodeKey: NodeKey;\n editor: LexicalEditor;\n}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [size, setSize] = useState({\n width: initialWidth || 560,\n height: initialHeight || 315\n });\n\n const onResizeStart = useCallback((e: React.MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n\n const startX = e.clientX;\n const startY = e.clientY;\n const startWidth = size.width;\n const startHeight = size.height;\n const aspectRatio = 560 / 315; // YouTube aspect ratio\n\n let finalWidth = startWidth;\n let finalHeight = startHeight;\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n \n let newWidth = startWidth;\n let newHeight = startHeight;\n\n // Handle different resize directions\n if (direction === 'e' || direction === 'ne' || direction === 'se') {\n newWidth = Math.max(280, startWidth + deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'w' || direction === 'nw' || direction === 'sw') {\n newWidth = Math.max(280, startWidth - deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'n') {\n newHeight = Math.max(158, startHeight - deltaY);\n newWidth = newHeight * aspectRatio;\n } else if (direction === 's') {\n newHeight = Math.max(158, startHeight + deltaY);\n newWidth = newHeight * aspectRatio;\n }\n\n finalWidth = newWidth;\n finalHeight = newHeight;\n setSize({ width: newWidth, height: newHeight });\n };\n\n const onMouseUp = () => {\n setIsResizing(false);\n \n // Update the node with new dimensions\n editor.update(() => {\n const node = editor.getEditorState()._nodeMap.get(nodeKey);\n if (node && node instanceof YouTubeNode) {\n const writable = node.getWritable() as YouTubeNode;\n writable.__width = finalWidth;\n writable.__height = finalHeight;\n }\n });\n \n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [size, editor, nodeKey]);\n\n const onDragStart = useCallback((e: React.MouseEvent) => {\n // Don't start drag if clicking on resize handles\n if ((e.target as HTMLElement).className.includes('resize-handle')) {\n return;\n }\n \n e.preventDefault();\n setIsDragging(true);\n \n const wrapper = wrapperRef.current;\n if (!wrapper) return;\n\n // Create a dragging clone\n const clone = wrapper.cloneNode(true) as HTMLElement;\n clone.style.position = 'fixed';\n clone.style.pointerEvents = 'none';\n clone.style.opacity = '0.5';\n clone.style.zIndex = '9999';\n clone.style.left = `${e.clientX - wrapper.offsetWidth / 2}px`;\n clone.style.top = `${e.clientY - wrapper.offsetHeight / 2}px`;\n document.body.appendChild(clone);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n clone.style.left = `${moveEvent.clientX - wrapper.offsetWidth / 2}px`;\n clone.style.top = `${moveEvent.clientY - wrapper.offsetHeight / 2}px`;\n };\n\n const onMouseUp = (upEvent: MouseEvent) => {\n setIsDragging(false);\n document.body.removeChild(clone);\n \n // Find the drop target in the editor\n const dropTarget = document.elementFromPoint(upEvent.clientX, upEvent.clientY);\n if (dropTarget && dropTarget.closest('.editor-content')) {\n // Move the node in Lexical\n editor.update(() => {\n const node = editor.getEditorState()._nodeMap.get(nodeKey);\n if (node) {\n // Remove from current position\n node.remove();\n \n // Insert at new position (simplified - inserts at end)\n const root = editor.getEditorState()._nodeMap.get('root');\n if (root) {\n const newNode = new YouTubeNode(id, size.width, size.height);\n //@ts-ignore\n root.append(newNode);\n }\n }\n });\n }\n \n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [id, size, nodeKey, editor]);\n\n return (\n <div\n ref={wrapperRef}\n className={`youtube-node-wrapper ${isSelected ? 'selected' : ''} ${isResizing ? 'resizing' : ''} ${isDragging ? 'dragging' : ''}`}\n onClick={() => setIsSelected(!isSelected)}\n onMouseDown={isSelected ? onDragStart : undefined}\n style={{\n width: `${size.width}px`,\n maxWidth: '100%',\n position: 'relative',\n display: 'inline-block',\n margin: '16px 0',\n cursor: isSelected ? 'move' : 'pointer'\n }}\n >\n <iframe\n src={`https://www.youtube.com/embed/${id}`}\n width={size.width}\n height={size.height}\n allowFullScreen\n style={{\n width: '100%',\n height: `${size.height}px`,\n display: 'block',\n borderRadius: '8px',\n border: isSelected ? '2px solid #667eea' : '2px solid transparent',\n transition: 'border-color 0.2s'\n }}\n />\n {isSelected && (\n <>\n {/* Corner handles */}\n <div\n className=\"youtube-resize-handle youtube-resize-handle-nw\"\n onMouseDown={(e) => onResizeStart(e, 'nw')}\n style={{\n position: 'absolute',\n left: '-4px',\n top: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nwse-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-ne\"\n onMouseDown={(e) => onResizeStart(e, 'ne')}\n style={{\n position: 'absolute',\n right: '-4px',\n top: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nesw-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-sw\"\n onMouseDown={(e) => onResizeStart(e, 'sw')}\n style={{\n position: 'absolute',\n left: '-4px',\n bottom: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nesw-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-se\"\n onMouseDown={(e) => onResizeStart(e, 'se')}\n style={{\n position: 'absolute',\n right: '-4px',\n bottom: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nwse-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n \n {/* Edge handles */}\n <div\n className=\"youtube-resize-handle youtube-resize-handle-n\"\n onMouseDown={(e) => onResizeStart(e, 'n')}\n style={{\n position: 'absolute',\n left: '50%',\n top: '-4px',\n transform: 'translateX(-50%)',\n width: '40px',\n height: '8px',\n background: '#667eea',\n cursor: 'ns-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-s\"\n onMouseDown={(e) => onResizeStart(e, 's')}\n style={{\n position: 'absolute',\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n width: '40px',\n height: '8px',\n background: '#667eea',\n cursor: 'ns-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-e\"\n onMouseDown={(e) => onResizeStart(e, 'e')}\n style={{\n position: 'absolute',\n right: '-4px',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '40px',\n background: '#667eea',\n cursor: 'ew-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n zIndex: 10\n }}\n />\n <div\n className=\"youtube-resize-handle youtube-resize-handle-w\"\n onMouseDown={(e) => onResizeStart(e, 'w')}\n style={{\n position: 'absolute',\n left: '-4px',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '8px',\n height: '40px',\n background: '#667eea',\n cursor: 'ew-resize',\n borderRadius: '4px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n zIndex: 10\n }}\n />\n </>\n )}\n </div>\n );\n}\n\nexport class YouTubeNode extends DecoratorNode<JSX.Element> {\n __id: string;\n __width?: number;\n __height?: number;\n\n static getType() { return \"youtube\"; }\n\n static clone(node: YouTubeNode): YouTubeNode {\n return new YouTubeNode(node.__id, node.__width, node.__height, node.__key);\n }\n\n static isInline(): boolean {\n return true;\n }\n\n constructor(id: string, width?: number, height?: number, key?: NodeKey) {\n super(key);\n this.__id = id;\n this.__width = width;\n this.__height = height;\n }\n\n createDOM(): HTMLElement {\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.maxWidth = '100%';\n return span;\n }\n\n updateDOM(): boolean {\n return false;\n }\n\n decorate(editor: LexicalEditor): JSX.Element {\n return (\n <YouTubeComponent\n id={this.__id}\n width={this.__width}\n height={this.__height}\n nodeKey={this.__key}\n editor={editor}\n />\n );\n }\n\n exportJSON(): SerializedYouTubeNode {\n return {\n type: \"youtube\",\n id: this.__id,\n width: this.__width,\n height: this.__height,\n version: 1\n };\n }\n\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\n return new YouTubeNode(\n serializedNode.id,\n serializedNode.width,\n serializedNode.height\n );\n }\n}\n","import { ElementNode, NodeKey, LexicalNode, EditorConfig, DOMConversionMap, DOMExportOutput } from \"lexical\";\n\nexport class QuoteNode extends ElementNode {\n static getType() { return \"quote\"; }\n \n static clone(node: QuoteNode): QuoteNode { \n return new QuoteNode(node.__key); \n }\n\n constructor(key?: NodeKey) {\n super(key);\n }\n\n createDOM(config: EditorConfig): HTMLElement {\n const dom = document.createElement(\"blockquote\");\n dom.className = \"quote-block\";\n return dom;\n }\n\n updateDOM(): boolean { return false; }\n\n static importJSON(serializedNode: any): QuoteNode {\n return new QuoteNode();\n }\n\n exportJSON() {\n return {\n ...super.exportJSON(),\n type: \"quote\",\n version: 1,\n };\n }\n}","import { ElementNode, NodeKey, EditorConfig, SerializedElementNode, Spread } from \"lexical\";\n\nexport type LayoutType = '2-column' | '3-column' | '4-column' | 'grid-2x2' | 'grid-3x3';\n\nexport type SerializedColumnsNode = Spread<\n {\n layoutType: LayoutType;\n },\n SerializedElementNode\n>;\n\nexport class ColumnsNode extends ElementNode {\n __layoutType: LayoutType;\n\n static getType() { return \"columns\"; }\n \n static clone(node: ColumnsNode): ColumnsNode { \n return new ColumnsNode(node.__layoutType, node.__key); \n }\n\n constructor(layoutType: LayoutType = '2-column', key?: NodeKey) {\n super(key);\n this.__layoutType = layoutType;\n }\n\n createDOM(config: EditorConfig): HTMLElement {\n const dom = document.createElement(\"div\");\n dom.className = `columns-block columns-${this.__layoutType}`;\n return dom;\n }\n\n updateDOM(prevNode: ColumnsNode): boolean { \n return prevNode.__layoutType !== this.__layoutType;\n }\n\n getLayoutType(): LayoutType {\n return this.__layoutType;\n }\n\n setLayoutType(layoutType: LayoutType): void {\n const writable = this.getWritable();\n writable.__layoutType = layoutType;\n }\n\n static importJSON(serializedNode: SerializedColumnsNode): ColumnsNode {\n return new ColumnsNode(serializedNode.layoutType);\n }\n\n exportJSON(): SerializedColumnsNode {\n return {\n ...super.exportJSON(),\n type: \"columns\",\n layoutType: this.__layoutType,\n version: 1,\n };\n }\n}\n\nexport class ColumnNode extends ElementNode {\n static getType() { return \"column\"; }\n\n static clone(node: ColumnNode): ColumnNode {\n return new ColumnNode(node.__key);\n }\n\n constructor(key?: NodeKey) {\n super(key);\n }\n\n createDOM(config: EditorConfig): HTMLElement {\n const dom = document.createElement(\"div\");\n dom.className = \"column\";\n return dom;\n }\n\n updateDOM(): boolean { return false; }\n\n static importJSON(serializedNode: any): ColumnNode {\n return new ColumnNode();\n }\n\n exportJSON() {\n return {\n ...super.exportJSON(),\n type: \"column\",\n version: 1,\n };\n }\n}\n\nexport function $createColumnsNode(layoutType: LayoutType = '2-column'): ColumnsNode {\n return new ColumnsNode(layoutType);\n}\n\nexport function $createColumnNode(): ColumnNode {\n return new ColumnNode();\n}\n\nexport function $isColumnsNode(node: any): node is ColumnsNode {\n return node instanceof ColumnsNode;\n}\n\nexport function $isColumnNode(node: any): node is ColumnNode {\n return node instanceof ColumnNode;\n}","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { \n $getSelection, \n $isRangeSelection,\n FORMAT_TEXT_COMMAND,\n FORMAT_ELEMENT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n $createParagraphNode\n} from \"lexical\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { \n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND\n} from \"@lexical/list\";\nimport { $createCodeNode, $isCodeNode } from \"@lexical/code\";\nimport { ImageNode } from \"../blocks/ImageNode\";\nimport { $createColumnsNode, $createColumnNode, LayoutType } from \"../blocks/ColumnsNode\";\nimport ColorPickerPlugin from \"./ColorPickerPlugin\";\nimport SpacingPlugin from \"./SpacingPlugin\";\nimport ExportImportPlugin from \"./ExportImportPlugin\";\nimport SectionCreatorPlugin from \"./SectionCreatorPlugin\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport { \n MdUndo, \n MdRedo, \n MdFormatBold, \n MdFormatItalic, \n MdFormatUnderlined,\n MdFormatStrikethrough,\n MdCode,\n MdFormatListBulleted,\n MdFormatListNumbered,\n MdFormatAlignLeft,\n MdFormatAlignCenter,\n MdFormatAlignRight,\n MdFormatAlignJustify,\n MdFormatQuote,\n MdLink,\n MdImage,\n MdViewColumn\n} from \"react-icons/md\";\nimport { \n BiParagraph,\n BiCodeBlock\n} from \"react-icons/bi\";\nimport { \n LuHeading1,\n LuHeading2,\n LuHeading3\n} from \"react-icons/lu\";\n\nexport default function ToolbarPlugin() {\n const [editor] = useLexicalComposerContext();\n const [isBold, setIsBold] = useState(false);\n const [isItalic, setIsItalic] = useState(false);\n const [isUnderline, setIsUnderline] = useState(false);\n const [isStrikethrough, setIsStrikethrough] = useState(false);\n const [isCode, setIsCode] = useState(false);\n const [blockType, setBlockType] = useState('paragraph');\n const [showLayoutMenu, setShowLayoutMenu] = useState(false);\n const [layoutMenuPosition, setLayoutMenuPosition] = useState({ top: 0, left: 0 });\n\n // Update toolbar state based on selection\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n setIsBold(selection.hasFormat('bold'));\n setIsItalic(selection.hasFormat('italic'));\n setIsUnderline(selection.hasFormat('underline'));\n setIsStrikethrough(selection.hasFormat('strikethrough'));\n setIsCode(selection.hasFormat('code'));\n }\n });\n });\n }, [editor]);\n\n const handleImageUpload = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.multiple = false;\n \n input.onchange = (e: any) => {\n const file = e.target?.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const url = event.target?.result as string;\n const alt = file.name.replace(/\\.[^/.]+$/, \"\");\n \n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const imageNode = new ImageNode(url, alt);\n selection.insertNodes([imageNode]);\n }\n });\n };\n reader.readAsDataURL(file);\n }\n };\n \n input.click();\n }, [editor]);\n\n const formatHeading = useCallback((level: 'h1' | 'h2' | 'h3') => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createHeadingNode(level));\n }\n });\n setBlockType(level);\n }, [editor]);\n\n const formatParagraph = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createParagraphNode());\n }\n });\n setBlockType('paragraph');\n }, [editor]);\n\n const formatQuote = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode());\n }\n });\n setBlockType('quote');\n }, [editor]);\n\n const formatCode = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createCodeNode());\n }\n });\n setBlockType('code');\n }, [editor]);\n\n const formatBold = useCallback(() => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\n }, [editor]);\n\n const formatItalic = useCallback(() => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\n }, [editor]);\n\n const formatUnderline = useCallback(() => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\n }, [editor]);\n\n const formatStrikethrough = useCallback(() => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\n }, [editor]);\n\n const formatInlineCode = useCallback(() => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\n }, [editor]);\n\n const formatBulletList = useCallback(() => {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n }, [editor]);\n\n const formatNumberedList = useCallback(() => {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n }, [editor]);\n\n const formatAlignLeft = useCallback(() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\n }, [editor]);\n\n const formatAlignCenter = useCallback(() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\n }, [editor]);\n\n const formatAlignRight = useCallback(() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\n }, [editor]);\n\n const formatAlignJustify = useCallback(() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\n }, [editor]);\n\n const insertLink = useCallback(() => {\n if ((window as any).__insertLink) {\n (window as any).__insertLink();\n }\n }, []);\n\n const insertLayout = useCallback((layoutType: LayoutType) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const columnsNode = $createColumnsNode(layoutType);\n \n // Determine number of columns based on layout type\n let columnCount = 2;\n if (layoutType === '3-column') columnCount = 3;\n else if (layoutType === '4-column') columnCount = 4;\n else if (layoutType === 'grid-2x2') columnCount = 4;\n else if (layoutType === 'grid-3x3') columnCount = 9;\n\n // Create columns with paragraph nodes\n for (let i = 0; i < columnCount; i++) {\n const columnNode = $createColumnNode();\n const paragraphNode = $createParagraphNode();\n columnNode.append(paragraphNode);\n columnsNode.append(columnNode);\n }\n\n selection.insertNodes([columnsNode]);\n }\n });\n setShowLayoutMenu(false);\n }, [editor]);\n\n const toggleLayoutMenu = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showLayoutMenu) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setLayoutMenuPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowLayoutMenu(!showLayoutMenu);\n }, [showLayoutMenu]);\n\n const handleUndo = useCallback(() => {\n editor.dispatchCommand(UNDO_COMMAND, undefined);\n }, [editor]);\n\n const handleRedo = useCallback(() => {\n editor.dispatchCommand(REDO_COMMAND, undefined);\n }, [editor]);\n\n return (\n <div className=\"cms-toolbar\">\n {/* Undo/Redo */}\n <button \n className=\"cms-toolbar-button\"\n onClick={handleUndo}\n title=\"Undo (Cmd+Z)\"\n type=\"button\"\n >\n <MdUndo size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={handleRedo}\n title=\"Redo (Cmd+Shift+Z)\"\n type=\"button\"\n >\n <MdRedo size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Block Type */}\n <button \n className={`cms-toolbar-button ${blockType === 'paragraph' ? 'active' : ''}`}\n onClick={formatParagraph}\n title=\"Paragraph\"\n type=\"button\"\n >\n <BiParagraph size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${blockType === 'h1' ? 'active' : ''}`}\n onClick={() => formatHeading('h1')}\n title=\"Heading 1\"\n type=\"button\"\n >\n <LuHeading1 size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${blockType === 'h2' ? 'active' : ''}`}\n onClick={() => formatHeading('h2')}\n title=\"Heading 2\"\n type=\"button\"\n >\n <LuHeading2 size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${blockType === 'h3' ? 'active' : ''}`}\n onClick={() => formatHeading('h3')}\n title=\"Heading 3\"\n type=\"button\"\n >\n <LuHeading3 size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Text Formatting */}\n <button \n className={`cms-toolbar-button ${isBold ? 'active' : ''}`}\n onClick={formatBold}\n title=\"Bold (Cmd+B)\"\n type=\"button\"\n >\n <MdFormatBold size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${isItalic ? 'active' : ''}`}\n onClick={formatItalic}\n title=\"Italic (Cmd+I)\"\n type=\"button\"\n >\n <MdFormatItalic size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${isUnderline ? 'active' : ''}`}\n onClick={formatUnderline}\n title=\"Underline (Cmd+U)\"\n type=\"button\"\n >\n <MdFormatUnderlined size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${isStrikethrough ? 'active' : ''}`}\n onClick={formatStrikethrough}\n title=\"Strikethrough\"\n type=\"button\"\n >\n <MdFormatStrikethrough size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${isCode ? 'active' : ''}`}\n onClick={formatInlineCode}\n title=\"Inline Code\"\n type=\"button\"\n >\n <MdCode size={18} />\n </button>\n\n {/* Color Pickers */}\n <ColorPickerPlugin />\n\n {/* Spacing Controls */}\n <SpacingPlugin />\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Lists */}\n <button \n className=\"cms-toolbar-button\"\n onClick={formatBulletList}\n title=\"Bullet List\"\n type=\"button\"\n >\n <MdFormatListBulleted size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={formatNumberedList}\n title=\"Numbered List\"\n type=\"button\"\n >\n <MdFormatListNumbered size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Alignment */}\n <button \n className=\"cms-toolbar-button\"\n onClick={formatAlignLeft}\n title=\"Align Left\"\n type=\"button\"\n >\n <MdFormatAlignLeft size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={formatAlignCenter}\n title=\"Align Center\"\n type=\"button\"\n >\n <MdFormatAlignCenter size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={formatAlignRight}\n title=\"Align Right\"\n type=\"button\"\n >\n <MdFormatAlignRight size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={formatAlignJustify}\n title=\"Justify\"\n type=\"button\"\n >\n <MdFormatAlignJustify size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Special Blocks */}\n <button \n className={`cms-toolbar-button ${blockType === 'quote' ? 'active' : ''}`}\n onClick={formatQuote}\n title=\"Quote\"\n type=\"button\"\n >\n <MdFormatQuote size={18} />\n </button>\n <button \n className={`cms-toolbar-button ${blockType === 'code' ? 'active' : ''}`}\n onClick={formatCode}\n title=\"Code Block\"\n type=\"button\"\n >\n <BiCodeBlock size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Insert */}\n <button \n className=\"cms-toolbar-button\"\n onClick={insertLink}\n title=\"Insert Link\"\n type=\"button\"\n >\n <MdLink size={18} />\n </button>\n <button \n className=\"cms-toolbar-button\"\n onClick={handleImageUpload}\n title=\"Upload Image\"\n type=\"button\"\n >\n <MdImage size={18} />\n </button>\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Export/Import */}\n <ExportImportPlugin />\n\n {/* Section Creator */}\n <SectionCreatorPlugin />\n\n <div className=\"cms-toolbar-divider\" />\n\n {/* Layout */}\n <div className=\"cms-layout-plugin\">\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleLayoutMenu}\n title=\"Insert Layout\"\n type=\"button\"\n >\n <MdViewColumn size={18} />\n </button>\n\n {showLayoutMenu && (\n <div \n className=\"cms-layout-menu\"\n style={{\n top: `${layoutMenuPosition.top}px`,\n left: `${layoutMenuPosition.left}px`\n }}\n >\n <div className=\"cms-layout-menu-title\">Choose Layout</div>\n \n <div className=\"cms-layout-menu-section\">\n <div className=\"cms-layout-menu-subtitle\">Columns (Flex)</div>\n <button\n className=\"cms-layout-menu-item\"\n onClick={() => insertLayout('2-column')}\n type=\"button\"\n >\n <div className=\"cms-layout-preview cms-layout-preview-2col\">\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n </div>\n <span>2 Columns</span>\n </button>\n\n <button\n className=\"cms-layout-menu-item\"\n onClick={() => insertLayout('3-column')}\n type=\"button\"\n >\n <div className=\"cms-layout-preview cms-layout-preview-3col\">\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n </div>\n <span>3 Columns</span>\n </button>\n\n <button\n className=\"cms-layout-menu-item\"\n onClick={() => insertLayout('4-column')}\n type=\"button\"\n >\n <div className=\"cms-layout-preview cms-layout-preview-4col\">\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n </div>\n <span>4 Columns</span>\n </button>\n </div>\n\n <div className=\"cms-layout-menu-section\">\n <div className=\"cms-layout-menu-subtitle\">Grid</div>\n <button\n className=\"cms-layout-menu-item\"\n onClick={() => insertLayout('grid-2x2')}\n type=\"button\"\n >\n <div className=\"cms-layout-preview cms-layout-preview-grid-2x2\">\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n </div>\n <span>2×2 Grid</span>\n </button>\n\n <button\n className=\"cms-layout-menu-item\"\n onClick={() => insertLayout('grid-3x3')}\n type=\"button\"\n >\n <div className=\"cms-layout-preview cms-layout-preview-grid-3x3\">\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n <div className=\"cms-layout-preview-col\"></div>\n </div>\n <span>3×3 Grid</span>\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { $getSelection, $isRangeSelection, $isTextNode } from \"lexical\";\nimport { $patchStyleText } from \"@lexical/selection\";\nimport { MdFormatColorText, MdFormatColorFill } from \"react-icons/md\";\n\nconst PRESET_COLORS = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n '#dd7e6b', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#a4c2f4', '#9fc5e8', '#b4a7d6', '#d5a6bd',\n '#cc4125', '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0',\n '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3c78d8', '#3d85c6', '#674ea7', '#a64d79',\n '#85200c', '#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#1155cc', '#0b5394', '#351c75', '#741b47',\n '#5b0f00', '#660000', '#783f04', '#7f6000', '#274e13', '#0c343d', '#1c4587', '#073763', '#20124d', '#4c1130',\n];\n\nexport default function ColorPickerPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showTextColorPicker, setShowTextColorPicker] = useState(false);\n const [showBgColorPicker, setShowBgColorPicker] = useState(false);\n const [currentTextColor, setCurrentTextColor] = useState('#000000');\n const [currentBgColor, setCurrentBgColor] = useState('transparent');\n const [textColorPosition, setTextColorPosition] = useState({ top: 0, left: 0 });\n const [bgColorPosition, setBgColorPosition] = useState({ top: 0, left: 0 });\n const textColorRef = useRef<HTMLDivElement>(null);\n const bgColorRef = useRef<HTMLDivElement>(null);\n\n // Update current colors based on selection\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const node = nodes[0];\n if ($isTextNode(node)) {\n const style = node.getStyle();\n const colorMatch = style.match(/color:\\s*([^;]+)/);\n const bgMatch = style.match(/background-color:\\s*([^;]+)/);\n \n if (colorMatch) {\n setCurrentTextColor(colorMatch[1].trim());\n }\n if (bgMatch) {\n setCurrentBgColor(bgMatch[1].trim());\n }\n }\n }\n }\n });\n });\n }, [editor]);\n\n // Close pickers when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (textColorRef.current && !textColorRef.current.contains(event.target as Node)) {\n setShowTextColorPicker(false);\n }\n if (bgColorRef.current && !bgColorRef.current.contains(event.target as Node)) {\n setShowBgColorPicker(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const applyTextColor = useCallback((color: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, { color });\n }\n });\n setCurrentTextColor(color);\n }, [editor]);\n\n const applyBackgroundColor = useCallback((color: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, { 'background-color': color });\n }\n });\n setCurrentBgColor(color);\n }, [editor]);\n\n const toggleTextColorPicker = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showTextColorPicker) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setTextColorPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowTextColorPicker(!showTextColorPicker);\n setShowBgColorPicker(false);\n }, [showTextColorPicker]);\n\n const toggleBgColorPicker = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showBgColorPicker) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setBgColorPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowBgColorPicker(!showBgColorPicker);\n setShowTextColorPicker(false);\n }, [showBgColorPicker]);\n\n const removeTextColor = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, { color: null });\n }\n });\n setCurrentTextColor('#000000');\n setShowTextColorPicker(false);\n }, [editor]);\n\n const removeBgColor = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, { 'background-color': null });\n }\n });\n setCurrentBgColor('transparent');\n setShowBgColorPicker(false);\n }, [editor]);\n\n return (\n <>\n {/* Text Color */}\n <div className=\"cms-color-picker-plugin\" ref={textColorRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleTextColorPicker}\n title=\"Text Color\"\n type=\"button\"\n >\n <div className=\"cms-color-button-wrapper\">\n <MdFormatColorText size={18} />\n <div \n className=\"cms-color-indicator\" \n style={{ backgroundColor: currentTextColor }}\n />\n </div>\n </button>\n\n {showTextColorPicker && (\n <div \n className=\"cms-color-picker-menu\"\n style={{\n top: `${textColorPosition.top}px`,\n left: `${textColorPosition.left}px`\n }}\n >\n <div className=\"cms-color-picker-header\">\n <span>Text Color</span>\n <button \n className=\"cms-color-remove-btn\"\n onClick={removeTextColor}\n type=\"button\"\n >\n Remove\n </button>\n </div>\n <div className=\"cms-color-grid\">\n {PRESET_COLORS.map((color) => (\n <button\n key={color}\n className={`cms-color-swatch ${currentTextColor === color ? 'active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => applyTextColor(color)}\n title={color}\n type=\"button\"\n />\n ))}\n </div>\n <div className=\"cms-color-custom\">\n <label>\n Custom:\n <input\n type=\"color\"\n value={currentTextColor}\n onChange={(e) => applyTextColor(e.target.value)}\n className=\"cms-color-input\"\n />\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Background Color */}\n <div className=\"cms-color-picker-plugin\" ref={bgColorRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleBgColorPicker}\n title=\"Background Color\"\n type=\"button\"\n >\n <div className=\"cms-color-button-wrapper\">\n <MdFormatColorFill size={18} />\n <div \n className=\"cms-color-indicator\" \n style={{ backgroundColor: currentBgColor === 'transparent' ? '#ffffff' : currentBgColor }}\n />\n </div>\n </button>\n\n {showBgColorPicker && (\n <div \n className=\"cms-color-picker-menu\"\n style={{\n top: `${bgColorPosition.top}px`,\n left: `${bgColorPosition.left}px`\n }}\n >\n <div className=\"cms-color-picker-header\">\n <span>Background Color</span>\n <button \n className=\"cms-color-remove-btn\"\n onClick={removeBgColor}\n type=\"button\"\n >\n Remove\n </button>\n </div>\n <div className=\"cms-color-grid\">\n {PRESET_COLORS.map((color) => (\n <button\n key={color}\n className={`cms-color-swatch ${currentBgColor === color ? 'active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => applyBackgroundColor(color)}\n title={color}\n type=\"button\"\n />\n ))}\n </div>\n <div className=\"cms-color-custom\">\n <label>\n Custom:\n <input\n type=\"color\"\n value={currentBgColor === 'transparent' ? '#ffffff' : currentBgColor}\n onChange={(e) => applyBackgroundColor(e.target.value)}\n className=\"cms-color-input\"\n />\n </label>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { $getSelection, $isRangeSelection, $isTextNode } from \"lexical\";\nimport { $patchStyleText } from \"@lexical/selection\";\nimport { MdSettings } from \"react-icons/md\";\nimport { TbBoxPadding, TbBoxMargin } from \"react-icons/tb\";\n\nconst SPACING_PRESETS = [0, 4, 8, 12, 16, 20, 24, 32, 40, 48];\n\nexport default function SpacingPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showSpacingMenu, setShowSpacingMenu] = useState(false);\n const [spacingPosition, setSpacingPosition] = useState({ top: 0, left: 0 });\n const spacingRef = useRef<HTMLDivElement>(null);\n\n // Current values\n const [display, setDisplay] = useState<'inline' | 'inline-block' | 'block'>('inline');\n const [paddingTop, setPaddingTop] = useState(0);\n const [paddingRight, setPaddingRight] = useState(0);\n const [paddingBottom, setPaddingBottom] = useState(0);\n const [paddingLeft, setPaddingLeft] = useState(0);\n const [marginTop, setMarginTop] = useState(0);\n const [marginRight, setMarginRight] = useState(0);\n const [marginBottom, setMarginBottom] = useState(0);\n const [marginLeft, setMarginLeft] = useState(0);\n\n // Update current values based on selection\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const nodes = selection.getNodes();\n if (nodes.length > 0) {\n const node = nodes[0];\n if ($isTextNode(node)) {\n const style = node.getStyle();\n \n // Parse display\n const displayMatch = style.match(/display:\\s*([^;]+)/);\n if (displayMatch) {\n setDisplay(displayMatch[1].trim() as any);\n }\n\n // Parse padding\n const paddingTopMatch = style.match(/padding-top:\\s*(\\d+)px/);\n const paddingRightMatch = style.match(/padding-right:\\s*(\\d+)px/);\n const paddingBottomMatch = style.match(/padding-bottom:\\s*(\\d+)px/);\n const paddingLeftMatch = style.match(/padding-left:\\s*(\\d+)px/);\n \n if (paddingTopMatch) setPaddingTop(parseInt(paddingTopMatch[1]));\n if (paddingRightMatch) setPaddingRight(parseInt(paddingRightMatch[1]));\n if (paddingBottomMatch) setPaddingBottom(parseInt(paddingBottomMatch[1]));\n if (paddingLeftMatch) setPaddingLeft(parseInt(paddingLeftMatch[1]));\n\n // Parse margin\n const marginTopMatch = style.match(/margin-top:\\s*(\\d+)px/);\n const marginRightMatch = style.match(/margin-right:\\s*(\\d+)px/);\n const marginBottomMatch = style.match(/margin-bottom:\\s*(\\d+)px/);\n const marginLeftMatch = style.match(/margin-left:\\s*(\\d+)px/);\n \n if (marginTopMatch) setMarginTop(parseInt(marginTopMatch[1]));\n if (marginRightMatch) setMarginRight(parseInt(marginRightMatch[1]));\n if (marginBottomMatch) setMarginBottom(parseInt(marginBottomMatch[1]));\n if (marginLeftMatch) setMarginLeft(parseInt(marginLeftMatch[1]));\n }\n }\n }\n });\n });\n }, [editor]);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (spacingRef.current && !spacingRef.current.contains(event.target as Node)) {\n setShowSpacingMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const applyStyles = useCallback((styles: Record<string, string | null>) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, styles);\n }\n });\n }, [editor]);\n\n const handleDisplayChange = useCallback((newDisplay: 'inline' | 'inline-block' | 'block') => {\n applyStyles({ display: newDisplay });\n setDisplay(newDisplay);\n }, [applyStyles]);\n\n const handlePaddingChange = useCallback((side: 'top' | 'right' | 'bottom' | 'left', value: number) => {\n const styleKey = `padding-${side}`;\n applyStyles({ [styleKey]: `${value}px` });\n \n if (side === 'top') setPaddingTop(value);\n else if (side === 'right') setPaddingRight(value);\n else if (side === 'bottom') setPaddingBottom(value);\n else if (side === 'left') setPaddingLeft(value);\n }, [applyStyles]);\n\n const handleMarginChange = useCallback((side: 'top' | 'right' | 'bottom' | 'left', value: number) => {\n const styleKey = `margin-${side}`;\n applyStyles({ [styleKey]: `${value}px` });\n \n if (side === 'top') setMarginTop(value);\n else if (side === 'right') setMarginRight(value);\n else if (side === 'bottom') setMarginBottom(value);\n else if (side === 'left') setMarginLeft(value);\n }, [applyStyles]);\n\n const handlePaddingAll = useCallback((value: number) => {\n applyStyles({\n 'padding-top': `${value}px`,\n 'padding-right': `${value}px`,\n 'padding-bottom': `${value}px`,\n 'padding-left': `${value}px`,\n });\n setPaddingTop(value);\n setPaddingRight(value);\n setPaddingBottom(value);\n setPaddingLeft(value);\n }, [applyStyles]);\n\n const handleMarginAll = useCallback((value: number) => {\n applyStyles({\n 'margin-top': `${value}px`,\n 'margin-right': `${value}px`,\n 'margin-bottom': `${value}px`,\n 'margin-left': `${value}px`,\n });\n setMarginTop(value);\n setMarginRight(value);\n setMarginBottom(value);\n setMarginLeft(value);\n }, [applyStyles]);\n\n const resetSpacing = useCallback(() => {\n applyStyles({\n display: null,\n 'padding-top': null,\n 'padding-right': null,\n 'padding-bottom': null,\n 'padding-left': null,\n 'margin-top': null,\n 'margin-right': null,\n 'margin-bottom': null,\n 'margin-left': null,\n });\n setDisplay('inline');\n setPaddingTop(0);\n setPaddingRight(0);\n setPaddingBottom(0);\n setPaddingLeft(0);\n setMarginTop(0);\n setMarginRight(0);\n setMarginBottom(0);\n setMarginLeft(0);\n }, [applyStyles]);\n\n const toggleSpacingMenu = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showSpacingMenu) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setSpacingPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowSpacingMenu(!showSpacingMenu);\n }, [showSpacingMenu]);\n\n return (\n <div className=\"cms-spacing-plugin\" ref={spacingRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleSpacingMenu}\n title=\"Spacing & Display\"\n type=\"button\"\n >\n <MdSettings size={18} />\n </button>\n\n {showSpacingMenu && (\n <div \n className=\"cms-spacing-menu\"\n style={{\n top: `${spacingPosition.top}px`,\n left: `${spacingPosition.left}px`\n }}\n >\n <div className=\"cms-spacing-header\">\n <span>Spacing & Display</span>\n <button \n className=\"cms-spacing-reset-btn\"\n onClick={resetSpacing}\n type=\"button\"\n >\n Reset\n </button>\n </div>\n\n {/* Display Mode */}\n <div className=\"cms-spacing-section\">\n <div className=\"cms-spacing-label\">Display Mode</div>\n <div className=\"cms-spacing-display-buttons\">\n <button\n className={`cms-spacing-display-btn ${display === 'inline' ? 'active' : ''}`}\n onClick={() => handleDisplayChange('inline')}\n type=\"button\"\n >\n Inline\n </button>\n <button\n className={`cms-spacing-display-btn ${display === 'inline-block' ? 'active' : ''}`}\n onClick={() => handleDisplayChange('inline-block')}\n type=\"button\"\n >\n Inline Block\n </button>\n <button\n className={`cms-spacing-display-btn ${display === 'block' ? 'active' : ''}`}\n onClick={() => handleDisplayChange('block')}\n type=\"button\"\n >\n Block\n </button>\n </div>\n </div>\n\n {/* Padding */}\n <div className=\"cms-spacing-section\">\n <div className=\"cms-spacing-label\">\n <TbBoxPadding size={16} />\n <span>Padding (px)</span>\n </div>\n \n <div className=\"cms-spacing-quick-buttons\">\n {SPACING_PRESETS.map((value) => (\n <button\n key={`padding-${value}`}\n className=\"cms-spacing-quick-btn\"\n onClick={() => handlePaddingAll(value)}\n type=\"button\"\n >\n {value}\n </button>\n ))}\n </div>\n\n <div className=\"cms-spacing-controls\">\n <div className=\"cms-spacing-control\">\n <label>Top</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={paddingTop}\n onChange={(e) => handlePaddingChange('top', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Right</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={paddingRight}\n onChange={(e) => handlePaddingChange('right', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Bottom</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={paddingBottom}\n onChange={(e) => handlePaddingChange('bottom', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Left</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={paddingLeft}\n onChange={(e) => handlePaddingChange('left', parseInt(e.target.value) || 0)}\n />\n </div>\n </div>\n </div>\n\n {/* Margin */}\n <div className=\"cms-spacing-section\">\n <div className=\"cms-spacing-label\">\n <TbBoxMargin size={16} />\n <span>Margin (px)</span>\n </div>\n \n <div className=\"cms-spacing-quick-buttons\">\n {SPACING_PRESETS.map((value) => (\n <button\n key={`margin-${value}`}\n className=\"cms-spacing-quick-btn\"\n onClick={() => handleMarginAll(value)}\n type=\"button\"\n >\n {value}\n </button>\n ))}\n </div>\n\n <div className=\"cms-spacing-controls\">\n <div className=\"cms-spacing-control\">\n <label>Top</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={marginTop}\n onChange={(e) => handleMarginChange('top', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Right</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={marginRight}\n onChange={(e) => handleMarginChange('right', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Bottom</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={marginBottom}\n onChange={(e) => handleMarginChange('bottom', parseInt(e.target.value) || 0)}\n />\n </div>\n <div className=\"cms-spacing-control\">\n <label>Left</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"200\"\n value={marginLeft}\n onChange={(e) => handleMarginChange('left', parseInt(e.target.value) || 0)}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { MdFileDownload, MdFileUpload } from \"react-icons/md\";\nimport { exportToHTML, downloadHTML } from \"../utils/htmlExport\";\nimport { exportToMarkdown, downloadMarkdown, copyMarkdownToClipboard } from \"../utils/markdownExport\";\nimport { importFromHTML, loadHTMLFromFile } from \"../utils/htmlImport\";\nimport { importFromMarkdown, loadMarkdownFromFile } from \"../utils/markdownImport\";\n\nexport default function ExportImportPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showExportMenu, setShowExportMenu] = useState(false);\n const [showImportMenu, setShowImportMenu] = useState(false);\n const [exportPosition, setExportPosition] = useState({ top: 0, left: 0 });\n const [importPosition, setImportPosition] = useState({ top: 0, left: 0 });\n const [notification, setNotification] = useState<string | null>(null);\n const exportRef = useRef<HTMLDivElement>(null);\n const importRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [importType, setImportType] = useState<'html' | 'markdown'>('html');\n\n // Close menus when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (exportRef.current && !exportRef.current.contains(event.target as Node)) {\n setShowExportMenu(false);\n }\n if (importRef.current && !importRef.current.contains(event.target as Node)) {\n setShowImportMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Auto-hide notification\n useEffect(() => {\n if (notification) {\n const timer = setTimeout(() => setNotification(null), 3000);\n return () => clearTimeout(timer);\n }\n }, [notification]);\n\n const showNotification = (message: string) => {\n setNotification(message);\n };\n\n const toggleExportMenu = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showExportMenu) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setExportPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowExportMenu(!showExportMenu);\n setShowImportMenu(false);\n }, [showExportMenu]);\n\n const toggleImportMenu = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showImportMenu) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setImportPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowImportMenu(!showImportMenu);\n setShowExportMenu(false);\n }, [showImportMenu]);\n\n // Export handlers\n const handleExportHTML = useCallback(() => {\n downloadHTML(editor, 'content.html', { includeStyles: false });\n setShowExportMenu(false);\n showNotification('HTML exported successfully!');\n }, [editor]);\n\n const handleExportHTMLWithStyles = useCallback(() => {\n downloadHTML(editor, 'content.html', { includeStyles: true });\n setShowExportMenu(false);\n showNotification('HTML with styles exported!');\n }, [editor]);\n\n const handleExportMarkdown = useCallback(() => {\n downloadMarkdown(editor, 'content.md');\n setShowExportMenu(false);\n showNotification('Markdown exported successfully!');\n }, [editor]);\n\n const handleCopyHTML = useCallback(async () => {\n const html = exportToHTML(editor);\n try {\n await navigator.clipboard.writeText(html);\n setShowExportMenu(false);\n showNotification('HTML copied to clipboard!');\n } catch (error) {\n showNotification('Failed to copy HTML');\n }\n }, [editor]);\n\n const handleCopyMarkdown = useCallback(async () => {\n const success = await copyMarkdownToClipboard(editor);\n setShowExportMenu(false);\n showNotification(success ? 'Markdown copied to clipboard!' : 'Failed to copy Markdown');\n }, [editor]);\n\n // Import handlers\n const handleImportFile = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const handleFileChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n if (importType === 'html') {\n loadHTMLFromFile(\n editor,\n file,\n () => {\n setShowImportMenu(false);\n showNotification('HTML imported successfully!');\n },\n (error) => {\n showNotification(`Import failed: ${error.message}`);\n }\n );\n } else {\n loadMarkdownFromFile(\n editor,\n file,\n () => {\n setShowImportMenu(false);\n showNotification('Markdown imported successfully!');\n },\n (error) => {\n showNotification(`Import failed: ${error.message}`);\n }\n );\n }\n\n // Reset file input\n event.target.value = '';\n }, [editor, importType]);\n\n const handlePasteHTML = useCallback(async () => {\n try {\n const html = await navigator.clipboard.readText();\n importFromHTML(editor, html);\n setShowImportMenu(false);\n showNotification('HTML pasted successfully!');\n } catch (error) {\n showNotification('Failed to paste HTML');\n }\n }, [editor]);\n\n const handlePasteMarkdown = useCallback(async () => {\n try {\n const markdown = await navigator.clipboard.readText();\n importFromMarkdown(editor, markdown);\n setShowImportMenu(false);\n showNotification('Markdown pasted successfully!');\n } catch (error) {\n showNotification('Failed to paste Markdown');\n }\n }, [editor]);\n\n return (\n <>\n {/* Export Button */}\n <div className=\"cms-export-import-plugin\" ref={exportRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleExportMenu}\n title=\"Export Content\"\n type=\"button\"\n >\n <MdFileDownload size={18} />\n </button>\n\n {showExportMenu && (\n <div \n className=\"cms-export-import-menu\"\n style={{\n top: `${exportPosition.top}px`,\n left: `${exportPosition.left}px`\n }}\n >\n <div className=\"cms-export-import-header\">Export Content</div>\n \n <button\n className=\"cms-export-import-item\"\n onClick={handleExportHTML}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📄</span>\n <div>\n <div className=\"cms-export-import-title\">HTML</div>\n <div className=\"cms-export-import-desc\">Download as HTML file</div>\n </div>\n </button>\n\n <button\n className=\"cms-export-import-item\"\n onClick={handleExportHTMLWithStyles}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">🎨</span>\n <div>\n <div className=\"cms-export-import-title\">HTML + Styles</div>\n <div className=\"cms-export-import-desc\">Complete HTML document</div>\n </div>\n </button>\n\n <button\n className=\"cms-export-import-item\"\n onClick={handleExportMarkdown}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📝</span>\n <div>\n <div className=\"cms-export-import-title\">Markdown</div>\n <div className=\"cms-export-import-desc\">Download as .md file</div>\n </div>\n </button>\n\n <div className=\"cms-export-import-divider\" />\n\n <button\n className=\"cms-export-import-item\"\n onClick={handleCopyHTML}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📋</span>\n <div>\n <div className=\"cms-export-import-title\">Copy HTML</div>\n <div className=\"cms-export-import-desc\">Copy to clipboard</div>\n </div>\n </button>\n\n <button\n className=\"cms-export-import-item\"\n onClick={handleCopyMarkdown}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📋</span>\n <div>\n <div className=\"cms-export-import-title\">Copy Markdown</div>\n <div className=\"cms-export-import-desc\">Copy to clipboard</div>\n </div>\n </button>\n </div>\n )}\n </div>\n\n {/* Import Button */}\n <div className=\"cms-export-import-plugin\" ref={importRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleImportMenu}\n title=\"Import Content\"\n type=\"button\"\n >\n <MdFileUpload size={18} />\n </button>\n\n {showImportMenu && (\n <div \n className=\"cms-export-import-menu\"\n style={{\n top: `${importPosition.top}px`,\n left: `${importPosition.left}px`\n }}\n >\n <div className=\"cms-export-import-header\">Import Content</div>\n \n <div className=\"cms-import-type-selector\">\n <button\n className={`cms-import-type-btn ${importType === 'html' ? 'active' : ''}`}\n onClick={() => setImportType('html')}\n type=\"button\"\n >\n HTML\n </button>\n <button\n className={`cms-import-type-btn ${importType === 'markdown' ? 'active' : ''}`}\n onClick={() => setImportType('markdown')}\n type=\"button\"\n >\n Markdown\n </button>\n </div>\n\n <button\n className=\"cms-export-import-item\"\n onClick={handleImportFile}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📁</span>\n <div>\n <div className=\"cms-export-import-title\">From File</div>\n <div className=\"cms-export-import-desc\">Upload {importType.toUpperCase()} file</div>\n </div>\n </button>\n\n <button\n className=\"cms-export-import-item\"\n onClick={importType === 'html' ? handlePasteHTML : handlePasteMarkdown}\n type=\"button\"\n >\n <span className=\"cms-export-import-icon\">📋</span>\n <div>\n <div className=\"cms-export-import-title\">From Clipboard</div>\n <div className=\"cms-export-import-desc\">Paste {importType.toUpperCase()}</div>\n </div>\n </button>\n </div>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={importType === 'html' ? '.html,.htm' : '.md,.markdown'}\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n </div>\n\n {/* Notification */}\n {notification && (\n <div className=\"cms-export-import-notification\">\n {notification}\n </div>\n )}\n </>\n );\n}\n","import { $generateHtmlFromNodes } from \"@lexical/html\";\nimport { LexicalEditor } from \"lexical\";\n\n/**\n * Export editor content as HTML string\n */\nexport function exportToHTML(editor: LexicalEditor): string {\n let html = '';\n \n editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(editor, null);\n });\n \n return html;\n}\n\n/**\n * Export editor content as HTML with custom wrapper\n */\nexport function exportToHTMLWithWrapper(\n editor: LexicalEditor,\n options?: {\n className?: string;\n includeStyles?: boolean;\n }\n): string {\n const html = exportToHTML(editor);\n const className = options?.className || 'cms-content';\n \n let output = `<div class=\"${className}\">\\n${html}\\n</div>`;\n \n if (options?.includeStyles) {\n output = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Exported Content</title>\n <style>\n .cms-content {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.8;\n color: #2c3e50;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n }\n .cms-content h1 { font-size: 2em; font-weight: 700; margin: 0.67em 0; }\n .cms-content h2 { font-size: 1.5em; font-weight: 600; margin: 0.75em 0; }\n .cms-content h3 { font-size: 1.17em; font-weight: 600; margin: 0.83em 0; }\n .cms-content p { margin: 1em 0; }\n .cms-content ul, .cms-content ol { margin: 1em 0; padding-left: 2em; }\n .cms-content li { margin: 0.5em 0; }\n .cms-content a { color: #667eea; text-decoration: underline; }\n .cms-content img { max-width: 100%; height: auto; border-radius: 8px; }\n .cms-content pre { background: #282c34; color: #abb2bf; padding: 16px; border-radius: 8px; overflow-x: auto; }\n .cms-content code { background: #f4f4f4; padding: 2px 6px; border-radius: 3px; font-family: monospace; }\n .cms-content blockquote { border-left: 4px solid #667eea; padding: 16px 20px; margin: 20px 0; font-style: italic; background: rgba(102, 126, 234, 0.05); }\n </style>\n</head>\n<body>\n ${output}\n</body>\n</html>`;\n }\n \n return output;\n}\n\n/**\n * Download HTML content as file\n */\nexport function downloadHTML(\n editor: LexicalEditor,\n filename: string = 'content.html',\n options?: { includeStyles?: boolean }\n): void {\n const html = exportToHTMLWithWrapper(editor, options);\n const blob = new Blob([html], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import { \n $getRoot, \n $isTextNode, \n $isElementNode,\n LexicalEditor,\n LexicalNode,\n ElementNode\n} from \"lexical\";\nimport { $isHeadingNode, $isQuoteNode } from \"@lexical/rich-text\";\nimport { $isListNode, $isListItemNode } from \"@lexical/list\";\nimport { $isLinkNode } from \"@lexical/link\";\nimport { $isCodeNode } from \"@lexical/code\";\n\n/**\n * Export editor content as Markdown string\n */\nexport function exportToMarkdown(editor: LexicalEditor): string {\n let markdown = '';\n \n editor.getEditorState().read(() => {\n const root = $getRoot();\n markdown = convertNodeToMarkdown(root);\n });\n \n return markdown.trim();\n}\n\nfunction convertNodeToMarkdown(node: LexicalNode, listDepth: number = 0): string {\n let markdown = '';\n \n // Handle text nodes\n if ($isTextNode(node)) {\n let text = node.getTextContent();\n \n // Apply text formatting\n if (node.hasFormat('bold')) {\n text = `**${text}**`;\n }\n if (node.hasFormat('italic')) {\n text = `*${text}*`;\n }\n if (node.hasFormat('code')) {\n text = `\\`${text}\\``;\n }\n if (node.hasFormat('strikethrough')) {\n text = `~~${text}~~`;\n }\n \n return text;\n }\n \n // Handle element nodes\n if ($isElementNode(node)) {\n // Heading nodes\n if ($isHeadingNode(node)) {\n const level = node.getTag();\n const prefix = '#'.repeat(parseInt(level.replace('h', '')));\n const text = getTextContent(node);\n return `${prefix} ${text}\\n\\n`;\n }\n \n // Quote nodes\n if ($isQuoteNode(node)) {\n const text = getTextContent(node);\n return `> ${text}\\n\\n`;\n }\n \n // Code nodes\n if ($isCodeNode(node)) {\n const code = getTextContent(node);\n return `\\`\\`\\`\\n${code}\\n\\`\\`\\`\\n\\n`;\n }\n \n // List nodes\n if ($isListNode(node)) {\n const listType = node.getListType();\n const children = node.getChildren();\n \n children.forEach((child, index) => {\n if ($isListItemNode(child)) {\n const text = getTextContent(child);\n const indent = ' '.repeat(listDepth);\n \n if (listType === 'bullet') {\n markdown += `${indent}- ${text}\\n`;\n } else {\n markdown += `${indent}${index + 1}. ${text}\\n`;\n }\n }\n });\n \n markdown += '\\n';\n return markdown;\n }\n \n // List item nodes (handled by parent list)\n if ($isListItemNode(node)) {\n return '';\n }\n \n // Link nodes\n if ($isLinkNode(node)) {\n const text = getTextContent(node);\n const url = node.getURL();\n return `[${text}](${url})`;\n }\n \n // Paragraph nodes\n const children = node.getChildren();\n if (children.length === 0) {\n return '\\n';\n }\n \n children.forEach((child) => {\n markdown += convertNodeToMarkdown(child, listDepth);\n });\n \n // Add paragraph break if this is a paragraph-like node\n if (node.getType() === 'paragraph' && markdown.trim()) {\n markdown += '\\n\\n';\n }\n }\n \n return markdown;\n}\n\nfunction getTextContent(node: ElementNode): string {\n let text = '';\n const children = node.getChildren();\n \n children.forEach((child) => {\n if ($isTextNode(child)) {\n text += child.getTextContent();\n } else if ($isElementNode(child)) {\n text += getTextContent(child);\n }\n });\n \n return text;\n}\n\n/**\n * Download Markdown content as file\n */\nexport function downloadMarkdown(\n editor: LexicalEditor,\n filename: string = 'content.md'\n): void {\n const markdown = exportToMarkdown(editor);\n const blob = new Blob([markdown], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Copy Markdown to clipboard\n */\nexport async function copyMarkdownToClipboard(editor: LexicalEditor): Promise<boolean> {\n try {\n const markdown = exportToMarkdown(editor);\n await navigator.clipboard.writeText(markdown);\n return true;\n } catch (error) {\n console.error('Failed to copy markdown:', error);\n return false;\n }\n}\n","import { $generateNodesFromDOM } from \"@lexical/html\";\nimport { $getRoot, $insertNodes, LexicalEditor } from \"lexical\";\n\n/**\n * Import HTML content into the editor\n */\nexport function importFromHTML(editor: LexicalEditor, html: string): void {\n editor.update(() => {\n // Parse HTML\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, 'text/html');\n \n // Generate Lexical nodes from DOM\n const nodes = $generateNodesFromDOM(editor, dom);\n \n // Clear existing content and insert new nodes\n const root = $getRoot();\n root.clear();\n root.select();\n $insertNodes(nodes);\n });\n}\n\n/**\n * Append HTML content to the editor\n */\nexport function appendHTML(editor: LexicalEditor, html: string): void {\n editor.update(() => {\n // Parse HTML\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, 'text/html');\n \n // Generate Lexical nodes from DOM\n const nodes = $generateNodesFromDOM(editor, dom);\n \n // Insert nodes at the end\n const root = $getRoot();\n root.selectEnd();\n $insertNodes(nodes);\n });\n}\n\n/**\n * Load HTML from file\n */\nexport function loadHTMLFromFile(\n editor: LexicalEditor,\n file: File,\n onSuccess?: () => void,\n onError?: (error: Error) => void\n): void {\n const reader = new FileReader();\n \n reader.onload = (event) => {\n try {\n const html = event.target?.result as string;\n importFromHTML(editor, html);\n onSuccess?.();\n } catch (error) {\n onError?.(error as Error);\n }\n };\n \n reader.onerror = () => {\n onError?.(new Error('Failed to read file'));\n };\n \n reader.readAsText(file);\n}\n","import { \n $getRoot, \n $createParagraphNode, \n $createTextNode,\n LexicalEditor\n} from \"lexical\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $createListNode, $createListItemNode } from \"@lexical/list\";\nimport { $createLinkNode } from \"@lexical/link\";\nimport { $createCodeNode } from \"@lexical/code\";\n\n/**\n * Import Markdown content into the editor\n */\nexport function importFromMarkdown(editor: LexicalEditor, markdown: string): void {\n editor.update(() => {\n const root = $getRoot();\n root.clear();\n \n const lines = markdown.split('\\n');\n let i = 0;\n \n while (i < lines.length) {\n const line = lines[i];\n \n // Skip empty lines\n if (!line.trim()) {\n i++;\n continue;\n }\n \n // Headings\n if (line.startsWith('#')) {\n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (match) {\n const level = match[1].length;\n const text = match[2];\n const heading = $createHeadingNode(`h${level}` as any);\n heading.append($createTextNode(text));\n root.append(heading);\n i++;\n continue;\n }\n }\n \n // Code blocks\n if (line.startsWith('```')) {\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n const code = $createCodeNode();\n code.append($createTextNode(codeLines.join('\\n')));\n root.append(code);\n i++;\n continue;\n }\n \n // Blockquotes\n if (line.startsWith('>')) {\n const text = line.replace(/^>\\s*/, '');\n const quote = $createQuoteNode();\n quote.append($createTextNode(text));\n root.append(quote);\n i++;\n continue;\n }\n \n // Unordered lists\n if (line.match(/^[\\s]*[-*+]\\s+/)) {\n const list = $createListNode('bullet');\n \n while (i < lines.length && lines[i].match(/^[\\s]*[-*+]\\s+/)) {\n const text = lines[i].replace(/^[\\s]*[-*+]\\s+/, '');\n const listItem = $createListItemNode();\n listItem.append(parseInlineMarkdown(text));\n list.append(listItem);\n i++;\n }\n \n root.append(list);\n continue;\n }\n \n // Ordered lists\n if (line.match(/^[\\s]*\\d+\\.\\s+/)) {\n const list = $createListNode('number');\n \n while (i < lines.length && lines[i].match(/^[\\s]*\\d+\\.\\s+/)) {\n const text = lines[i].replace(/^[\\s]*\\d+\\.\\s+/, '');\n const listItem = $createListItemNode();\n listItem.append(parseInlineMarkdown(text));\n list.append(listItem);\n i++;\n }\n \n root.append(list);\n continue;\n }\n \n // Regular paragraphs\n const paragraph = $createParagraphNode();\n paragraph.append(parseInlineMarkdown(line));\n root.append(paragraph);\n i++;\n }\n });\n}\n\n/**\n * Parse inline markdown formatting (bold, italic, links, etc.)\n */\nfunction parseInlineMarkdown(text: string): any {\n const nodes: any[] = [];\n let currentText = '';\n let i = 0;\n \n while (i < text.length) {\n // Bold (**text** or __text__)\n if ((text[i] === '*' && text[i + 1] === '*') || (text[i] === '_' && text[i + 1] === '_')) {\n if (currentText) {\n nodes.push($createTextNode(currentText));\n currentText = '';\n }\n \n const delimiter = text.slice(i, i + 2);\n i += 2;\n let boldText = '';\n \n while (i < text.length - 1 && text.slice(i, i + 2) !== delimiter) {\n boldText += text[i];\n i++;\n }\n \n if (text.slice(i, i + 2) === delimiter) {\n const node = $createTextNode(boldText);\n node.toggleFormat('bold');\n nodes.push(node);\n i += 2;\n } else {\n currentText += delimiter + boldText;\n }\n continue;\n }\n \n // Italic (*text* or _text_)\n if (text[i] === '*' || text[i] === '_') {\n if (currentText) {\n nodes.push($createTextNode(currentText));\n currentText = '';\n }\n \n const delimiter = text[i];\n i++;\n let italicText = '';\n \n while (i < text.length && text[i] !== delimiter) {\n italicText += text[i];\n i++;\n }\n \n if (text[i] === delimiter) {\n const node = $createTextNode(italicText);\n node.toggleFormat('italic');\n nodes.push(node);\n i++;\n } else {\n currentText += delimiter + italicText;\n }\n continue;\n }\n \n // Inline code (`code`)\n if (text[i] === '`') {\n if (currentText) {\n nodes.push($createTextNode(currentText));\n currentText = '';\n }\n \n i++;\n let codeText = '';\n \n while (i < text.length && text[i] !== '`') {\n codeText += text[i];\n i++;\n }\n \n if (text[i] === '`') {\n const node = $createTextNode(codeText);\n node.toggleFormat('code');\n nodes.push(node);\n i++;\n } else {\n currentText += '`' + codeText;\n }\n continue;\n }\n \n // Links [text](url)\n if (text[i] === '[') {\n const linkMatch = text.slice(i).match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n if (currentText) {\n nodes.push($createTextNode(currentText));\n currentText = '';\n }\n \n const linkText = linkMatch[1];\n const url = linkMatch[2];\n const link = $createLinkNode(url);\n link.append($createTextNode(linkText));\n nodes.push(link);\n i += linkMatch[0].length;\n continue;\n }\n }\n \n // Strikethrough (~~text~~)\n if (text[i] === '~' && text[i + 1] === '~') {\n if (currentText) {\n nodes.push($createTextNode(currentText));\n currentText = '';\n }\n \n i += 2;\n let strikeText = '';\n \n while (i < text.length - 1 && text.slice(i, i + 2) !== '~~') {\n strikeText += text[i];\n i++;\n }\n \n if (text.slice(i, i + 2) === '~~') {\n const node = $createTextNode(strikeText);\n node.toggleFormat('strikethrough');\n nodes.push(node);\n i += 2;\n } else {\n currentText += '~~' + strikeText;\n }\n continue;\n }\n \n currentText += text[i];\n i++;\n }\n \n if (currentText) {\n nodes.push($createTextNode(currentText));\n }\n \n return nodes.length > 0 ? nodes : $createTextNode(text);\n}\n\n/**\n * Load Markdown from file\n */\nexport function loadMarkdownFromFile(\n editor: LexicalEditor,\n file: File,\n onSuccess?: () => void,\n onError?: (error: Error) => void\n): void {\n const reader = new FileReader();\n \n reader.onload = (event) => {\n try {\n const markdown = event.target?.result as string;\n importFromMarkdown(editor, markdown);\n onSuccess?.();\n } catch (error) {\n onError?.(error as Error);\n }\n };\n \n reader.onerror = () => {\n onError?.(new Error('Failed to read file'));\n };\n \n reader.readAsText(file);\n}\n\n/**\n * Paste Markdown from clipboard\n */\nexport async function pasteMarkdownFromClipboard(editor: LexicalEditor): Promise<boolean> {\n try {\n const markdown = await navigator.clipboard.readText();\n importFromMarkdown(editor, markdown);\n return true;\n } catch (error) {\n console.error('Failed to paste markdown:', error);\n return false;\n }\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, $createParagraphNode } from \"lexical\";\nimport { $createSectionNode } from \"../blocks/SectionNode\";\nimport { SECTION_TEMPLATES, SectionTemplate } from \"../utils/sectionTemplates\";\nimport { $generateNodesFromDOM } from \"@lexical/html\";\nimport { MdViewModule } from \"react-icons/md\";\n\nexport default function SectionCreatorPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showSectionMenu, setShowSectionMenu] = useState(false);\n const [sectionPosition, setSectionPosition] = useState({ top: 0, left: 0 });\n const sectionRef = useRef<HTMLDivElement>(null);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (sectionRef.current && !sectionRef.current.contains(event.target as Node)) {\n setShowSectionMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const toggleSectionMenu = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showSectionMenu) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setSectionPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowSectionMenu(!showSectionMenu);\n }, [showSectionMenu]);\n\n const insertSection = useCallback((template: SectionTemplate) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n // Create section node\n const sectionNode = $createSectionNode(\n template.type,\n template.backgroundColor,\n template.padding\n );\n\n // Parse HTML content\n const parser = new DOMParser();\n const dom = parser.parseFromString(template.content, 'text/html');\n const nodes = $generateNodesFromDOM(editor, dom);\n\n // Add content to section\n nodes.forEach(node => {\n sectionNode.append(node);\n });\n\n // Insert section\n selection.insertNodes([sectionNode]);\n\n // Add spacing after section\n const paragraph = $createParagraphNode();\n sectionNode.insertAfter(paragraph);\n paragraph.select();\n }\n });\n\n setShowSectionMenu(false);\n }, [editor]);\n\n return (\n <div className=\"cms-section-creator-plugin\" ref={sectionRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={toggleSectionMenu}\n title=\"Insert Section\"\n type=\"button\"\n >\n <MdViewModule size={18} />\n </button>\n\n {showSectionMenu && (\n <div \n className=\"cms-section-menu\"\n style={{\n top: `${sectionPosition.top}px`,\n left: `${sectionPosition.left}px`\n }}\n >\n <div className=\"cms-section-menu-header\">\n <span>Insert Section</span>\n </div>\n\n <div className=\"cms-section-grid\">\n {SECTION_TEMPLATES.map((template) => (\n <button\n key={template.type}\n className=\"cms-section-card\"\n onClick={() => insertSection(template)}\n type=\"button\"\n >\n <div className=\"cms-section-card-icon\">{template.icon}</div>\n <div className=\"cms-section-card-content\">\n <div className=\"cms-section-card-title\">{template.name}</div>\n <div className=\"cms-section-card-desc\">{template.description}</div>\n </div>\n </button>\n ))}\n </div>\n\n <div className=\"cms-section-menu-footer\">\n <p>💡 Tip: Sections are fully editable after insertion</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { \n ElementNode, \n NodeKey, \n EditorConfig, \n SerializedElementNode,\n Spread,\n LexicalNode\n} from \"lexical\";\n\nexport type SectionType = \n | 'hero'\n | 'features'\n | 'cta'\n | 'testimonial'\n | 'pricing'\n | 'team'\n | 'stats'\n | 'faq'\n | 'contact'\n | 'newsletter';\n\nexport type LayoutType = 'block' | 'flex' | 'grid';\nexport type FlexDirection = 'row' | 'column' | 'row-reverse' | 'column-reverse';\nexport type AlignItems = 'flex-start' | 'center' | 'flex-end' | 'stretch';\nexport type JustifyContent = 'flex-start' | 'center' | 'flex-end' | 'space-between' | 'space-around' | 'space-evenly';\n\nexport type SerializedSectionNode = Spread<\n {\n sectionType: SectionType;\n backgroundColor?: string;\n backgroundImage?: string;\n backgroundSize?: string;\n backgroundPosition?: string;\n backgroundRepeat?: string;\n gradientOverlay?: string;\n opacity?: number;\n padding?: string;\n margin?: string;\n textAlign?: string;\n layoutType?: LayoutType;\n flexDirection?: FlexDirection;\n flexWrap?: string;\n alignItems?: AlignItems;\n justifyContent?: JustifyContent;\n gap?: string;\n gridTemplateColumns?: string;\n gridTemplateRows?: string;\n },\n SerializedElementNode\n>;\n\nexport class SectionNode extends ElementNode {\n __sectionType: SectionType;\n __backgroundColor?: string;\n __backgroundImage?: string;\n __backgroundSize?: string;\n __backgroundPosition?: string;\n __backgroundRepeat?: string;\n __gradientOverlay?: string;\n __opacity?: number;\n __padding?: string;\n __margin?: string;\n __textAlign?: string;\n __layoutType?: LayoutType;\n __flexDirection?: FlexDirection;\n __flexWrap?: string;\n __alignItems?: AlignItems;\n __justifyContent?: JustifyContent;\n __gap?: string;\n __gridTemplateColumns?: string;\n __gridTemplateRows?: string;\n\n static getType() { \n return \"section\"; \n }\n \n static clone(node: SectionNode): SectionNode { \n const cloned = new SectionNode(\n node.__sectionType,\n node.__backgroundColor,\n node.__padding,\n node.__key\n );\n cloned.__backgroundImage = node.__backgroundImage;\n cloned.__backgroundSize = node.__backgroundSize;\n cloned.__backgroundPosition = node.__backgroundPosition;\n cloned.__backgroundRepeat = node.__backgroundRepeat;\n cloned.__gradientOverlay = node.__gradientOverlay;\n cloned.__opacity = node.__opacity;\n cloned.__margin = node.__margin;\n cloned.__textAlign = node.__textAlign;\n cloned.__layoutType = node.__layoutType;\n cloned.__flexDirection = node.__flexDirection;\n cloned.__flexWrap = node.__flexWrap;\n cloned.__alignItems = node.__alignItems;\n cloned.__justifyContent = node.__justifyContent;\n cloned.__gap = node.__gap;\n cloned.__gridTemplateColumns = node.__gridTemplateColumns;\n cloned.__gridTemplateRows = node.__gridTemplateRows;\n return cloned;\n }\n\n constructor(\n sectionType: SectionType = 'hero',\n backgroundColor?: string,\n padding?: string,\n key?: NodeKey\n ) {\n super(key);\n this.__sectionType = sectionType;\n this.__backgroundColor = backgroundColor;\n this.__padding = padding;\n }\n\n createDOM(config: EditorConfig): HTMLElement {\n const dom = document.createElement(\"section\");\n dom.className = `cms-section cms-section-${this.__sectionType}`;\n \n // Background handling\n if (this.__backgroundImage) {\n dom.style.backgroundImage = this.__backgroundImage;\n dom.style.backgroundSize = this.__backgroundSize || 'cover';\n dom.style.backgroundPosition = this.__backgroundPosition || 'center';\n dom.style.backgroundRepeat = this.__backgroundRepeat || 'no-repeat';\n dom.style.position = 'relative';\n \n // Add gradient overlay if specified\n if (this.__gradientOverlay) {\n const overlay = document.createElement('div');\n overlay.className = 'cms-section-overlay';\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.right = '0';\n overlay.style.bottom = '0';\n overlay.style.background = this.__gradientOverlay;\n overlay.style.pointerEvents = 'none';\n overlay.style.zIndex = '0';\n dom.appendChild(overlay);\n }\n \n // Ensure content is above background\n dom.style.isolation = 'isolate';\n } else if (this.__backgroundColor) {\n dom.style.backgroundColor = this.__backgroundColor;\n }\n \n if (this.__opacity !== undefined) {\n dom.style.opacity = this.__opacity.toString();\n }\n \n if (this.__padding) {\n dom.style.padding = this.__padding;\n }\n\n if (this.__margin) {\n dom.style.margin = this.__margin;\n }\n\n if (this.__textAlign) {\n dom.style.textAlign = this.__textAlign;\n }\n\n if (this.__layoutType) {\n dom.style.display = this.__layoutType;\n }\n\n if (this.__layoutType === 'flex') {\n if (this.__flexDirection) {\n dom.style.flexDirection = this.__flexDirection;\n }\n if (this.__flexWrap) {\n dom.style.flexWrap = this.__flexWrap;\n }\n if (this.__alignItems) {\n dom.style.alignItems = this.__alignItems;\n }\n if (this.__justifyContent) {\n dom.style.justifyContent = this.__justifyContent;\n }\n }\n\n if (this.__layoutType === 'grid') {\n if (this.__gridTemplateColumns) {\n dom.style.gridTemplateColumns = this.__gridTemplateColumns;\n }\n if (this.__gridTemplateRows) {\n dom.style.gridTemplateRows = this.__gridTemplateRows;\n }\n }\n\n if (this.__gap) {\n dom.style.gap = this.__gap;\n }\n \n return dom;\n }\n\n updateDOM(prevNode: SectionNode): boolean { \n return (\n prevNode.__sectionType !== this.__sectionType ||\n prevNode.__backgroundColor !== this.__backgroundColor ||\n prevNode.__backgroundImage !== this.__backgroundImage ||\n prevNode.__backgroundSize !== this.__backgroundSize ||\n prevNode.__backgroundPosition !== this.__backgroundPosition ||\n prevNode.__backgroundRepeat !== this.__backgroundRepeat ||\n prevNode.__gradientOverlay !== this.__gradientOverlay ||\n prevNode.__opacity !== this.__opacity ||\n prevNode.__padding !== this.__padding ||\n prevNode.__margin !== this.__margin ||\n prevNode.__textAlign !== this.__textAlign ||\n prevNode.__layoutType !== this.__layoutType ||\n prevNode.__flexDirection !== this.__flexDirection ||\n prevNode.__flexWrap !== this.__flexWrap ||\n prevNode.__alignItems !== this.__alignItems ||\n prevNode.__justifyContent !== this.__justifyContent ||\n prevNode.__gap !== this.__gap ||\n prevNode.__gridTemplateColumns !== this.__gridTemplateColumns ||\n prevNode.__gridTemplateRows !== this.__gridTemplateRows\n );\n }\n\n getSectionType(): SectionType {\n return this.__sectionType;\n }\n\n setSectionType(sectionType: SectionType): void {\n const writable = this.getWritable();\n writable.__sectionType = sectionType;\n }\n\n getBackgroundColor(): string | undefined {\n return this.__backgroundColor;\n }\n\n setBackgroundColor(color: string | undefined): void {\n const writable = this.getWritable();\n writable.__backgroundColor = color;\n }\n\n getBackgroundImage(): string | undefined {\n return this.__backgroundImage;\n }\n\n setBackgroundImage(image: string | undefined): void {\n const writable = this.getWritable();\n writable.__backgroundImage = image;\n }\n\n getBackgroundSize(): string | undefined {\n return this.__backgroundSize;\n }\n\n setBackgroundSize(size: string | undefined): void {\n const writable = this.getWritable();\n writable.__backgroundSize = size;\n }\n\n getBackgroundPosition(): string | undefined {\n return this.__backgroundPosition;\n }\n\n setBackgroundPosition(position: string | undefined): void {\n const writable = this.getWritable();\n writable.__backgroundPosition = position;\n }\n\n getBackgroundRepeat(): string | undefined {\n return this.__backgroundRepeat;\n }\n\n setBackgroundRepeat(repeat: string | undefined): void {\n const writable = this.getWritable();\n writable.__backgroundRepeat = repeat;\n }\n\n getGradientOverlay(): string | undefined {\n return this.__gradientOverlay;\n }\n\n setGradientOverlay(gradient: string | undefined): void {\n const writable = this.getWritable();\n writable.__gradientOverlay = gradient;\n }\n\n getOpacity(): number | undefined {\n return this.__opacity;\n }\n\n setOpacity(opacity: number | undefined): void {\n const writable = this.getWritable();\n writable.__opacity = opacity;\n }\n\n getPadding(): string | undefined {\n return this.__padding;\n }\n\n setPadding(padding: string | undefined): void {\n const writable = this.getWritable();\n writable.__padding = padding;\n }\n\n getMargin(): string | undefined {\n return this.__margin;\n }\n\n setMargin(margin: string | undefined): void {\n const writable = this.getWritable();\n writable.__margin = margin;\n }\n\n getTextAlign(): string | undefined {\n return this.__textAlign;\n }\n\n setTextAlign(align: string | undefined): void {\n const writable = this.getWritable();\n writable.__textAlign = align;\n }\n\n getLayoutType(): LayoutType | undefined {\n return this.__layoutType;\n }\n\n setLayoutType(layoutType: LayoutType | undefined): void {\n const writable = this.getWritable();\n writable.__layoutType = layoutType;\n }\n\n getFlexDirection(): FlexDirection | undefined {\n return this.__flexDirection;\n }\n\n setFlexDirection(direction: FlexDirection | undefined): void {\n const writable = this.getWritable();\n writable.__flexDirection = direction;\n }\n\n getFlexWrap(): string | undefined {\n return this.__flexWrap;\n }\n\n setFlexWrap(wrap: string | undefined): void {\n const writable = this.getWritable();\n writable.__flexWrap = wrap;\n }\n\n getAlignItems(): AlignItems | undefined {\n return this.__alignItems;\n }\n\n setAlignItems(align: AlignItems | undefined): void {\n const writable = this.getWritable();\n writable.__alignItems = align;\n }\n\n getJustifyContent(): JustifyContent | undefined {\n return this.__justifyContent;\n }\n\n setJustifyContent(justify: JustifyContent | undefined): void {\n const writable = this.getWritable();\n writable.__justifyContent = justify;\n }\n\n getGap(): string | undefined {\n return this.__gap;\n }\n\n setGap(gap: string | undefined): void {\n const writable = this.getWritable();\n writable.__gap = gap;\n }\n\n getGridTemplateColumns(): string | undefined {\n return this.__gridTemplateColumns;\n }\n\n setGridTemplateColumns(columns: string | undefined): void {\n const writable = this.getWritable();\n writable.__gridTemplateColumns = columns;\n }\n\n getGridTemplateRows(): string | undefined {\n return this.__gridTemplateRows;\n }\n\n setGridTemplateRows(rows: string | undefined): void {\n const writable = this.getWritable();\n writable.__gridTemplateRows = rows;\n }\n\n static importJSON(serializedNode: SerializedSectionNode): SectionNode {\n const node = new SectionNode(\n serializedNode.sectionType,\n serializedNode.backgroundColor,\n serializedNode.padding\n );\n node.__backgroundImage = serializedNode.backgroundImage;\n node.__backgroundSize = serializedNode.backgroundSize;\n node.__backgroundPosition = serializedNode.backgroundPosition;\n node.__backgroundRepeat = serializedNode.backgroundRepeat;\n node.__gradientOverlay = serializedNode.gradientOverlay;\n node.__opacity = serializedNode.opacity;\n node.__margin = serializedNode.margin;\n node.__textAlign = serializedNode.textAlign;\n node.__layoutType = serializedNode.layoutType;\n node.__flexDirection = serializedNode.flexDirection;\n node.__flexWrap = serializedNode.flexWrap;\n node.__alignItems = serializedNode.alignItems;\n node.__justifyContent = serializedNode.justifyContent;\n node.__gap = serializedNode.gap;\n node.__gridTemplateColumns = serializedNode.gridTemplateColumns;\n node.__gridTemplateRows = serializedNode.gridTemplateRows;\n return node;\n }\n\n exportJSON(): SerializedSectionNode {\n return {\n ...super.exportJSON(),\n type: \"section\",\n sectionType: this.__sectionType,\n backgroundColor: this.__backgroundColor,\n backgroundImage: this.__backgroundImage,\n backgroundSize: this.__backgroundSize,\n backgroundPosition: this.__backgroundPosition,\n backgroundRepeat: this.__backgroundRepeat,\n gradientOverlay: this.__gradientOverlay,\n opacity: this.__opacity,\n padding: this.__padding,\n margin: this.__margin,\n textAlign: this.__textAlign,\n layoutType: this.__layoutType,\n flexDirection: this.__flexDirection,\n flexWrap: this.__flexWrap,\n alignItems: this.__alignItems,\n justifyContent: this.__justifyContent,\n gap: this.__gap,\n gridTemplateColumns: this.__gridTemplateColumns,\n gridTemplateRows: this.__gridTemplateRows,\n version: 1,\n };\n }\n\n canBeEmpty(): boolean {\n return false;\n }\n\n isShadowRoot(): boolean {\n return false;\n }\n}\n\nexport function $createSectionNode(\n sectionType: SectionType = 'hero',\n backgroundColor?: string,\n padding?: string\n): SectionNode {\n return new SectionNode(sectionType, backgroundColor, padding);\n}\n\nexport function $isSectionNode(\n node: LexicalNode | null | undefined\n): node is SectionNode {\n return node instanceof SectionNode;\n}\n","import { SectionType } from \"../blocks/SectionNode\";\n\nexport interface SectionTemplate {\n type: SectionType;\n name: string;\n description: string;\n icon: string;\n backgroundColor?: string;\n padding?: string;\n content: string; // HTML content\n}\n\nexport const SECTION_TEMPLATES: SectionTemplate[] = [\n {\n type: 'hero',\n name: 'Hero Section',\n description: 'Large header with title, subtitle, and CTA',\n icon: '🎯',\n backgroundColor: '#667eea',\n padding: '80px 40px',\n content: `\n <h1 style=\"color: white; text-align: center; font-size: 3em; margin-bottom: 20px;\">Welcome to Our Platform</h1>\n <p style=\"color: white; text-align: center; font-size: 1.5em; margin-bottom: 40px;\">Build amazing things with our powerful tools</p>\n <p style=\"text-align: center;\">\n <span style=\"display: inline-block; padding: 16px 32px; background-color: white; color: #667eea; border-radius: 8px; font-weight: 600; margin: 0 8px;\">Get Started</span>\n <span style=\"display: inline-block; padding: 16px 32px; background-color: transparent; color: white; border: 2px solid white; border-radius: 8px; font-weight: 600; margin: 0 8px;\">Learn More</span>\n </p>\n `\n },\n {\n type: 'features',\n name: 'Features Grid',\n description: '3-column feature showcase',\n icon: '⭐',\n backgroundColor: '#f8f9fa',\n padding: '60px 40px',\n content: `\n <h2 style=\"text-align: center; margin-bottom: 40px;\">Our Features</h2>\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 30px;\">\n <div style=\"text-align: center; padding: 20px;\">\n <div style=\"font-size: 3em; margin-bottom: 16px;\">🚀</div>\n <h3 style=\"margin-bottom: 12px;\">Fast Performance</h3>\n <p style=\"color: #666;\">Lightning-fast load times and smooth interactions</p>\n </div>\n <div style=\"text-align: center; padding: 20px;\">\n <div style=\"font-size: 3em; margin-bottom: 16px;\">🔒</div>\n <h3 style=\"margin-bottom: 12px;\">Secure & Safe</h3>\n <p style=\"color: #666;\">Enterprise-grade security for your data</p>\n </div>\n <div style=\"text-align: center; padding: 20px;\">\n <div style=\"font-size: 3em; margin-bottom: 16px;\">💡</div>\n <h3 style=\"margin-bottom: 12px;\">Easy to Use</h3>\n <p style=\"color: #666;\">Intuitive interface that anyone can master</p>\n </div>\n </div>\n `\n },\n {\n type: 'cta',\n name: 'Call to Action',\n description: 'Centered CTA with button',\n icon: '📢',\n backgroundColor: '#28a745',\n padding: '60px 40px',\n content: `\n <h2 style=\"color: white; text-align: center; margin-bottom: 20px;\">Ready to Get Started?</h2>\n <p style=\"color: white; text-align: center; font-size: 1.2em; margin-bottom: 30px;\">Join thousands of satisfied customers today</p>\n <p style=\"text-align: center;\">\n <span style=\"display: inline-block; padding: 16px 48px; background-color: white; color: #28a745; border-radius: 8px; font-weight: 600; font-size: 1.1em;\">Sign Up Now</span>\n </p>\n `\n },\n {\n type: 'testimonial',\n name: 'Testimonial',\n description: 'Customer testimonial with quote',\n icon: '💬',\n backgroundColor: '#ffffff',\n padding: '60px 40px',\n content: `\n <div style=\"max-width: 800px; margin: 0 auto; text-align: center;\">\n <div style=\"font-size: 4em; color: #667eea; margin-bottom: 20px;\">\"</div>\n <p style=\"font-size: 1.3em; font-style: italic; color: #333; margin-bottom: 30px;\">This product has completely transformed how we work. The team is more productive and our customers are happier than ever.</p>\n <div style=\"display: flex; align-items: center; justify-content: center; gap: 16px;\">\n <div style=\"width: 60px; height: 60px; border-radius: 50%; background: #667eea;\"></div>\n <div style=\"text-align: left;\">\n <div style=\"font-weight: 600; color: #333;\">John Smith</div>\n <div style=\"color: #666; font-size: 0.9em;\">CEO, Tech Company</div>\n </div>\n </div>\n </div>\n `\n },\n {\n type: 'pricing',\n name: 'Pricing Table',\n description: '3-tier pricing comparison',\n icon: '💰',\n backgroundColor: '#f8f9fa',\n padding: '60px 40px',\n content: `\n <h2 style=\"text-align: center; margin-bottom: 40px;\">Choose Your Plan</h2>\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 30px; max-width: 1000px; margin: 0 auto;\">\n <div style=\"background: white; padding: 30px; border-radius: 12px; border: 2px solid #e9ecef; text-align: center;\">\n <h3 style=\"margin-bottom: 16px;\">Starter</h3>\n <div style=\"font-size: 2.5em; font-weight: 700; color: #667eea; margin-bottom: 20px;\">$9<span style=\"font-size: 0.4em; color: #666;\">/mo</span></div>\n <ul style=\"list-style: none; padding: 0; margin-bottom: 30px; text-align: left;\">\n <li style=\"padding: 8px 0;\">✓ 10 Projects</li>\n <li style=\"padding: 8px 0;\">✓ 5GB Storage</li>\n <li style=\"padding: 8px 0;\">✓ Email Support</li>\n </ul>\n <span style=\"display: block; padding: 12px 24px; background: #667eea; color: white; border-radius: 6px; font-weight: 600;\">Get Started</span>\n </div>\n <div style=\"background: white; padding: 30px; border-radius: 12px; border: 3px solid #667eea; text-align: center; transform: scale(1.05);\">\n <div style=\"background: #667eea; color: white; padding: 4px 12px; border-radius: 4px; font-size: 0.8em; margin-bottom: 12px;\">POPULAR</div>\n <h3 style=\"margin-bottom: 16px;\">Pro</h3>\n <div style=\"font-size: 2.5em; font-weight: 700; color: #667eea; margin-bottom: 20px;\">$29<span style=\"font-size: 0.4em; color: #666;\">/mo</span></div>\n <ul style=\"list-style: none; padding: 0; margin-bottom: 30px; text-align: left;\">\n <li style=\"padding: 8px 0;\">✓ Unlimited Projects</li>\n <li style=\"padding: 8px 0;\">✓ 50GB Storage</li>\n <li style=\"padding: 8px 0;\">✓ Priority Support</li>\n </ul>\n <span style=\"display: block; padding: 12px 24px; background: #667eea; color: white; border-radius: 6px; font-weight: 600;\">Get Started</span>\n </div>\n <div style=\"background: white; padding: 30px; border-radius: 12px; border: 2px solid #e9ecef; text-align: center;\">\n <h3 style=\"margin-bottom: 16px;\">Enterprise</h3>\n <div style=\"font-size: 2.5em; font-weight: 700; color: #667eea; margin-bottom: 20px;\">$99<span style=\"font-size: 0.4em; color: #666;\">/mo</span></div>\n <ul style=\"list-style: none; padding: 0; margin-bottom: 30px; text-align: left;\">\n <li style=\"padding: 8px 0;\">✓ Unlimited Everything</li>\n <li style=\"padding: 8px 0;\">✓ 500GB Storage</li>\n <li style=\"padding: 8px 0;\">✓ 24/7 Support</li>\n </ul>\n <span style=\"display: block; padding: 12px 24px; background: #667eea; color: white; border-radius: 6px; font-weight: 600;\">Contact Sales</span>\n </div>\n </div>\n `\n },\n {\n type: 'team',\n name: 'Team Members',\n description: 'Team member cards',\n icon: '👥',\n backgroundColor: '#ffffff',\n padding: '60px 40px',\n content: `\n <h2 style=\"text-align: center; margin-bottom: 40px;\">Meet Our Team</h2>\n <div style=\"display: grid; grid-template-columns: repeat(4, 1fr); gap: 30px;\">\n <div style=\"text-align: center;\">\n <div style=\"width: 120px; height: 120px; border-radius: 50%; background: #667eea; margin: 0 auto 16px;\"></div>\n <h4 style=\"margin-bottom: 8px;\">Alice Johnson</h4>\n <p style=\"color: #666; font-size: 0.9em;\">CEO & Founder</p>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"width: 120px; height: 120px; border-radius: 50%; background: #28a745; margin: 0 auto 16px;\"></div>\n <h4 style=\"margin-bottom: 8px;\">Bob Smith</h4>\n <p style=\"color: #666; font-size: 0.9em;\">CTO</p>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"width: 120px; height: 120px; border-radius: 50%; background: #ffc107; margin: 0 auto 16px;\"></div>\n <h4 style=\"margin-bottom: 8px;\">Carol White</h4>\n <p style=\"color: #666; font-size: 0.9em;\">Lead Designer</p>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"width: 120px; height: 120px; border-radius: 50%; background: #dc3545; margin: 0 auto 16px;\"></div>\n <h4 style=\"margin-bottom: 8px;\">David Brown</h4>\n <p style=\"color: #666; font-size: 0.9em;\">Marketing Director</p>\n </div>\n </div>\n `\n },\n {\n type: 'stats',\n name: 'Statistics',\n description: 'Key metrics display',\n icon: '📊',\n backgroundColor: '#667eea',\n padding: '60px 40px',\n content: `\n <div style=\"display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px; text-align: center;\">\n <div>\n <div style=\"font-size: 3em; font-weight: 700; color: white; margin-bottom: 8px;\">10K+</div>\n <div style=\"color: rgba(255,255,255,0.9); font-size: 1.1em;\">Active Users</div>\n </div>\n <div>\n <div style=\"font-size: 3em; font-weight: 700; color: white; margin-bottom: 8px;\">50+</div>\n <div style=\"color: rgba(255,255,255,0.9); font-size: 1.1em;\">Countries</div>\n </div>\n <div>\n <div style=\"font-size: 3em; font-weight: 700; color: white; margin-bottom: 8px;\">99.9%</div>\n <div style=\"color: rgba(255,255,255,0.9); font-size: 1.1em;\">Uptime</div>\n </div>\n <div>\n <div style=\"font-size: 3em; font-weight: 700; color: white; margin-bottom: 8px;\">24/7</div>\n <div style=\"color: rgba(255,255,255,0.9); font-size: 1.1em;\">Support</div>\n </div>\n </div>\n `\n },\n {\n type: 'faq',\n name: 'FAQ Section',\n description: 'Frequently asked questions',\n icon: '❓',\n backgroundColor: '#f8f9fa',\n padding: '60px 40px',\n content: `\n <h2 style=\"text-align: center; margin-bottom: 40px;\">Frequently Asked Questions</h2>\n <div style=\"max-width: 800px; margin: 0 auto;\">\n <div style=\"background: white; padding: 24px; border-radius: 8px; margin-bottom: 16px;\">\n <h3 style=\"margin-bottom: 12px;\">How do I get started?</h3>\n <p style=\"color: #666;\">Simply sign up for an account and follow our quick start guide. You'll be up and running in minutes!</p>\n </div>\n <div style=\"background: white; padding: 24px; border-radius: 8px; margin-bottom: 16px;\">\n <h3 style=\"margin-bottom: 12px;\">What payment methods do you accept?</h3>\n <p style=\"color: #666;\">We accept all major credit cards, PayPal, and bank transfers for enterprise customers.</p>\n </div>\n <div style=\"background: white; padding: 24px; border-radius: 8px; margin-bottom: 16px;\">\n <h3 style=\"margin-bottom: 12px;\">Can I cancel anytime?</h3>\n <p style=\"color: #666;\">Yes! You can cancel your subscription at any time with no penalties or hidden fees.</p>\n </div>\n </div>\n `\n },\n {\n type: 'contact',\n name: 'Contact Form',\n description: 'Contact information and form',\n icon: '📧',\n backgroundColor: '#ffffff',\n padding: '60px 40px',\n content: `\n <h2 style=\"text-align: center; margin-bottom: 40px;\">Get In Touch</h2>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 60px; max-width: 1000px; margin: 0 auto;\">\n <div>\n <h3 style=\"margin-bottom: 20px;\">Contact Information</h3>\n <div style=\"margin-bottom: 20px;\">\n <div style=\"font-weight: 600; margin-bottom: 8px;\">📍 Address</div>\n <p style=\"color: #666;\">123 Business St, Suite 100<br/>San Francisco, CA 94105</p>\n </div>\n <div style=\"margin-bottom: 20px;\">\n <div style=\"font-weight: 600; margin-bottom: 8px;\">📧 Email</div>\n <p style=\"color: #666;\">contact@example.com</p>\n </div>\n <div style=\"margin-bottom: 20px;\">\n <div style=\"font-weight: 600; margin-bottom: 8px;\">📞 Phone</div>\n <p style=\"color: #666;\">+1 (555) 123-4567</p>\n </div>\n </div>\n <div>\n <h3 style=\"margin-bottom: 20px;\">Send us a Message</h3>\n <p style=\"color: #666; margin-bottom: 12px;\"><strong>Name:</strong> [Your Name]</p>\n <p style=\"color: #666; margin-bottom: 12px;\"><strong>Email:</strong> [Your Email]</p>\n <p style=\"color: #666; margin-bottom: 12px;\"><strong>Message:</strong> [Your Message]</p>\n <span style=\"display: inline-block; padding: 12px 32px; background: #667eea; color: white; border-radius: 6px; font-weight: 600; margin-top: 12px;\">Send Message</span>\n </div>\n </div>\n `\n },\n {\n type: 'newsletter',\n name: 'Newsletter Signup',\n description: 'Email subscription form',\n icon: '📬',\n backgroundColor: '#667eea',\n padding: '60px 40px',\n content: `\n <div style=\"max-width: 600px; margin: 0 auto; text-align: center;\">\n <h2 style=\"color: white; margin-bottom: 16px;\">Subscribe to Our Newsletter</h2>\n <p style=\"color: rgba(255,255,255,0.9); font-size: 1.1em; margin-bottom: 30px;\">Get the latest updates and exclusive content delivered to your inbox</p>\n <div style=\"display: flex; gap: 12px; justify-content: center;\">\n <span style=\"flex: 1; max-width: 400px; padding: 14px 20px; background: white; border-radius: 6px; text-align: left; color: #999;\">Enter your email</span>\n <span style=\"padding: 14px 32px; background: #28a745; color: white; border-radius: 6px; font-weight: 600;\">Subscribe</span>\n </div>\n <p style=\"color: rgba(255,255,255,0.7); font-size: 0.9em; margin-top: 16px;\">We respect your privacy. Unsubscribe at any time.</p>\n </div>\n `\n }\n];\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, DRAGOVER_COMMAND, DROP_COMMAND } from \"lexical\";\nimport { ImageNode } from \"../blocks/ImageNode\";\n\nexport default function ImageUploadPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n // Handle drag over\n const removeDragOverListener = editor.registerCommand(\n DRAGOVER_COMMAND,\n (event: DragEvent) => {\n event.preventDefault();\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n // Handle drop\n const removeDropListener = editor.registerCommand(\n DROP_COMMAND,\n (event: DragEvent) => {\n event.preventDefault();\n \n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n const file = files[0];\n \n // Check if it's an image\n if (file.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n \n reader.onload = (e) => {\n const url = e.target?.result as string;\n const alt = file.name.replace(/\\.[^/.]+$/, \"\");\n \n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const imageNode = new ImageNode(url, alt);\n selection.insertNodes([imageNode]);\n }\n });\n };\n \n reader.readAsDataURL(file);\n return true;\n }\n }\n \n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n\n return () => {\n removeDragOverListener();\n removeDropListener();\n };\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect, useState, useCallback } from \"react\";\nimport { \n $getSelection, \n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n $createTextNode\n} from \"lexical\";\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\n\nexport default function LinkPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showModal, setShowModal] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [linkTitle, setLinkTitle] = useState('');\n const [openInNewTab, setOpenInNewTab] = useState(false);\n\n // Listen for custom link command\n useEffect(() => {\n return editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (showModal) {\n setShowModal(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor, showModal]);\n\n const handleInsertLink = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const selectedText = selection.getTextContent();\n setLinkText(selectedText || '');\n setShowModal(true);\n }\n });\n }, [editor]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n \n if (!linkUrl) return;\n\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n // If there's selected text, wrap it in a link\n if (selection.getTextContent()) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url: linkUrl,\n target: openInNewTab ? '_blank' : null,\n rel: openInNewTab ? 'noopener noreferrer' : null,\n title: linkTitle || null,\n });\n } else {\n // If no text selected, insert link with custom text\n const linkNode = $createLinkNode(linkUrl, {\n target: openInNewTab ? '_blank' : null,\n rel: openInNewTab ? 'noopener noreferrer' : null,\n title: linkTitle || null,\n });\n const textNode = $createTextNode(linkText || linkUrl);\n linkNode.append(textNode);\n selection.insertNodes([linkNode]);\n }\n }\n });\n\n // Reset and close\n setShowModal(false);\n setLinkUrl('');\n setLinkText('');\n setLinkTitle('');\n setOpenInNewTab(false);\n };\n\n const handleCancel = () => {\n setShowModal(false);\n setLinkUrl('');\n setLinkText('');\n setLinkTitle('');\n setOpenInNewTab(false);\n };\n\n // Expose function to toolbar\n useEffect(() => {\n (window as any).__insertLink = handleInsertLink;\n return () => {\n delete (window as any).__insertLink;\n };\n }, [handleInsertLink]);\n\n if (!showModal) return null;\n\n return (\n <div className=\"cms-link-modal-overlay\" onClick={handleCancel}>\n <div className=\"cms-link-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"cms-link-modal-header\">\n <h3>Insert Link</h3>\n <button \n className=\"cms-link-modal-close\"\n onClick={handleCancel}\n type=\"button\"\n >\n ×\n </button>\n </div>\n \n <form onSubmit={handleSubmit} className=\"cms-link-modal-form\">\n <div className=\"cms-link-modal-field\">\n <label htmlFor=\"link-text\">Link Text</label>\n <input\n id=\"link-text\"\n type=\"text\"\n value={linkText}\n onChange={(e) => setLinkText(e.target.value)}\n placeholder=\"Enter link text (or leave empty to use selected text)\"\n autoFocus\n />\n </div>\n\n <div className=\"cms-link-modal-field\">\n <label htmlFor=\"link-url\">URL *</label>\n <input\n id=\"link-url\"\n type=\"url\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n placeholder=\"https://example.com\"\n required\n />\n </div>\n\n <div className=\"cms-link-modal-field\">\n <label htmlFor=\"link-title\">Title (optional)</label>\n <input\n id=\"link-title\"\n type=\"text\"\n value={linkTitle}\n onChange={(e) => setLinkTitle(e.target.value)}\n placeholder=\"Link title for accessibility\"\n />\n </div>\n\n <div className=\"cms-link-modal-field cms-link-modal-checkbox\">\n <label>\n <input\n type=\"checkbox\"\n checked={openInNewTab}\n onChange={(e) => setOpenInNewTab(e.target.checked)}\n />\n <span>Open in new tab</span>\n </label>\n </div>\n\n <div className=\"cms-link-modal-actions\">\n <button \n type=\"button\" \n onClick={handleCancel}\n className=\"cms-link-modal-button cms-link-modal-button-cancel\"\n >\n Cancel\n </button>\n <button \n type=\"submit\"\n className=\"cms-link-modal-button cms-link-modal-button-submit\"\n disabled={!linkUrl}\n >\n Insert Link\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { \n $getSelection, \n $isRangeSelection, \n $getNodeByKey,\n SELECTION_CHANGE_COMMAND,\n COMMAND_PRIORITY_LOW\n} from \"lexical\";\nimport { $isSectionNode, SectionNode } from \"../blocks/SectionNode\";\nimport { MdSettings, MdClose } from \"react-icons/md\";\nimport { \n FaAlignLeft, \n FaAlignCenter, \n FaAlignRight, \n FaAlignJustify \n} from \"react-icons/fa\";\n\nconst PRESET_COLORS = [\n '#ffffff', '#f8f9fa', '#e9ecef', '#dee2e6', '#ced4da',\n '#adb5bd', '#6c757d', '#495057', '#343a40', '#212529',\n '#667eea', '#764ba2', '#f093fb', '#4facfe', '#43e97b',\n '#fa709a', '#fee140', '#30cfd0', '#a8edea', '#fed6e3',\n '#ff6b6b', '#ee5a6f', '#c44569', '#f38181', '#fa8072',\n '#feca57', '#ff9ff3', '#54a0ff', '#48dbfb', '#1dd1a1',\n];\n\nexport default function SectionEditorPlugin() {\n const [editor] = useLexicalComposerContext();\n const [selectedSection, setSelectedSection] = useState<{\n key: string;\n node: SectionNode;\n } | null>(null);\n const [showEditor, setShowEditor] = useState(false);\n const [editorPosition, setEditorPosition] = useState({ top: 0, left: 0 });\n const editorRef = useRef<HTMLDivElement>(null);\n\n // Track selected section\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const nodes = selection.getNodes();\n \n // Find if we're inside a section\n for (const node of nodes) {\n let parent = node.getParent();\n while (parent) {\n if ($isSectionNode(parent)) {\n setSelectedSection({\n key: parent.getKey(),\n node: parent\n });\n return;\n }\n parent = parent.getParent();\n }\n }\n }\n setSelectedSection(null);\n });\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor]);\n\n // Close editor when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (editorRef.current && !editorRef.current.contains(event.target as Node)) {\n setShowEditor(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const toggleEditor = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n if (!showEditor) {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n setEditorPosition({\n top: rect.bottom + 8,\n left: rect.left\n });\n }\n setShowEditor(!showEditor);\n }, [showEditor]);\n\n const updateSection = useCallback((updater: (node: SectionNode) => void) => {\n if (!selectedSection) return;\n\n editor.update(() => {\n const node = $getNodeByKey(selectedSection.key);\n if ($isSectionNode(node)) {\n updater(node);\n }\n });\n }, [editor, selectedSection]);\n\n const setBackgroundColor = useCallback((color: string) => {\n updateSection((node) => node.setBackgroundColor(color));\n }, [updateSection]);\n\n const setBackgroundImage = useCallback((image: string) => {\n updateSection((node) => node.setBackgroundImage(image));\n }, [updateSection]);\n\n const setBackgroundSize = useCallback((size: string) => {\n updateSection((node) => node.setBackgroundSize(size));\n }, [updateSection]);\n\n const setBackgroundPosition = useCallback((position: string) => {\n updateSection((node) => node.setBackgroundPosition(position));\n }, [updateSection]);\n\n const setBackgroundRepeat = useCallback((repeat: string) => {\n updateSection((node) => node.setBackgroundRepeat(repeat));\n }, [updateSection]);\n\n const setGradientOverlay = useCallback((gradient: string) => {\n updateSection((node) => node.setGradientOverlay(gradient));\n }, [updateSection]);\n\n const setOpacity = useCallback((opacity: number) => {\n updateSection((node) => node.setOpacity(opacity));\n }, [updateSection]);\n\n const removeBackgroundImage = useCallback(() => {\n updateSection((node) => {\n node.setBackgroundImage(undefined);\n node.setGradientOverlay(undefined);\n });\n }, [updateSection]);\n\n const setTextAlign = useCallback((align: string) => {\n updateSection((node) => node.setTextAlign(align));\n }, [updateSection]);\n\n const setLayoutType = useCallback((layout: 'block' | 'flex' | 'grid') => {\n updateSection((node) => node.setLayoutType(layout));\n }, [updateSection]);\n\n const setFlexDirection = useCallback((direction: any) => {\n updateSection((node) => node.setFlexDirection(direction));\n }, [updateSection]);\n\n const setFlexWrap = useCallback((wrap: string) => {\n updateSection((node) => node.setFlexWrap(wrap));\n }, [updateSection]);\n\n const setAlignItems = useCallback((align: any) => {\n updateSection((node) => node.setAlignItems(align));\n }, [updateSection]);\n\n const setJustifyContent = useCallback((justify: any) => {\n updateSection((node) => node.setJustifyContent(justify));\n }, [updateSection]);\n\n const setGap = useCallback((gap: string) => {\n updateSection((node) => node.setGap(gap));\n }, [updateSection]);\n\n const setPadding = useCallback((padding: string) => {\n updateSection((node) => node.setPadding(padding));\n }, [updateSection]);\n\n const setMargin = useCallback((margin: string) => {\n updateSection((node) => node.setMargin(margin));\n }, [updateSection]);\n\n const setGridColumns = useCallback((columns: string) => {\n updateSection((node) => node.setGridTemplateColumns(columns));\n }, [updateSection]);\n\n const setGridRows = useCallback((rows: string) => {\n updateSection((node) => node.setGridTemplateRows(rows));\n }, [updateSection]);\n\n if (!selectedSection) {\n return null;\n }\n\n const node = selectedSection.node;\n const currentBgColor = node.getBackgroundColor() || '#ffffff';\n const currentBgImage = node.getBackgroundImage() || '';\n const currentBgSize = node.getBackgroundSize() || 'cover';\n const currentBgPosition = node.getBackgroundPosition() || 'center';\n const currentBgRepeat = node.getBackgroundRepeat() || 'no-repeat';\n const currentGradient = node.getGradientOverlay() || '';\n const currentOpacity = node.getOpacity() !== undefined ? node.getOpacity() : 1;\n const currentTextAlign = node.getTextAlign() || 'left';\n const currentLayout = node.getLayoutType() || 'block';\n const currentFlexDirection = node.getFlexDirection() || 'row';\n const currentFlexWrap = node.getFlexWrap() || 'nowrap';\n const currentAlignItems = node.getAlignItems() || 'stretch';\n const currentJustifyContent = node.getJustifyContent() || 'flex-start';\n const currentGap = node.getGap() || '0px';\n const currentPadding = node.getPadding() || '40px';\n const currentMargin = node.getMargin() || '0px';\n const currentGridColumns = node.getGridTemplateColumns() || 'repeat(3, 1fr)';\n const currentGridRows = node.getGridTemplateRows() || 'auto';\n\n return (\n <div className=\"cms-section-editor-plugin\" ref={editorRef}>\n <button\n className=\"cms-toolbar-button cms-section-edit-button\"\n onClick={toggleEditor}\n title=\"Edit Section\"\n type=\"button\"\n >\n <MdSettings size={18} />\n <span className=\"cms-section-indicator\">Section</span>\n </button>\n\n {showEditor && (\n <div \n className=\"cms-section-editor-menu\"\n style={{\n top: `${editorPosition.top}px`,\n left: `${editorPosition.left}px`\n }}\n >\n <div className=\"cms-section-editor-header\">\n <span>Section Settings</span>\n <button\n className=\"cms-close-button\"\n onClick={() => setShowEditor(false)}\n type=\"button\"\n >\n <MdClose size={16} />\n </button>\n </div>\n\n <div className=\"cms-section-editor-content\">\n \n {/* Background Color */}\n <div className=\"cms-section-editor-group\">\n <label>Background Color</label>\n <div className=\"cms-color-grid\">\n {PRESET_COLORS.map((color) => (\n <button\n key={color}\n className={`cms-color-swatch ${currentBgColor === color ? 'active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => setBackgroundColor(color)}\n title={color}\n type=\"button\"\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={currentBgColor}\n onChange={(e) => setBackgroundColor(e.target.value)}\n className=\"cms-color-input\"\n />\n </div>\n\n {/* Background Image */}\n <div className=\"cms-section-editor-group\">\n <label>Background Image</label>\n <input\n type=\"text\"\n value={currentBgImage}\n onChange={(e) => setBackgroundImage(e.target.value ? `url(${e.target.value})` : '')}\n placeholder=\"Enter image URL\"\n className=\"cms-text-input\"\n />\n {currentBgImage && (\n <>\n <div className=\"cms-bg-controls\">\n <div className=\"cms-bg-control-item\">\n <label>Size</label>\n <select\n value={currentBgSize}\n onChange={(e) => setBackgroundSize(e.target.value)}\n className=\"cms-select-small\"\n >\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n <option value=\"auto\">Auto</option>\n <option value=\"100% 100%\">Stretch</option>\n </select>\n </div>\n <div className=\"cms-bg-control-item\">\n <label>Position</label>\n <select\n value={currentBgPosition}\n onChange={(e) => setBackgroundPosition(e.target.value)}\n className=\"cms-select-small\"\n >\n <option value=\"center\">Center</option>\n <option value=\"top\">Top</option>\n <option value=\"bottom\">Bottom</option>\n <option value=\"left\">Left</option>\n <option value=\"right\">Right</option>\n <option value=\"top left\">Top Left</option>\n <option value=\"top right\">Top Right</option>\n <option value=\"bottom left\">Bottom Left</option>\n <option value=\"bottom right\">Bottom Right</option>\n </select>\n </div>\n <div className=\"cms-bg-control-item\">\n <label>Repeat</label>\n <select\n value={currentBgRepeat}\n onChange={(e) => setBackgroundRepeat(e.target.value)}\n className=\"cms-select-small\"\n >\n <option value=\"no-repeat\">No Repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </div>\n </div>\n <button\n onClick={removeBackgroundImage}\n className=\"cms-remove-button\"\n type=\"button\"\n >\n Remove Background Image\n </button>\n </>\n )}\n </div>\n\n {/* Gradient Overlay */}\n {currentBgImage && (\n <div className=\"cms-section-editor-group\">\n <label>Gradient Overlay</label>\n <div className=\"cms-gradient-presets\">\n <button\n onClick={() => setGradientOverlay('')}\n className={`cms-gradient-preset ${!currentGradient ? 'active' : ''}`}\n type=\"button\"\n >\n None\n </button>\n <button\n onClick={() => setGradientOverlay('linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.7))')}\n className=\"cms-gradient-preset\"\n style={{ background: 'linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.7))' }}\n title=\"Dark Gradient\"\n type=\"button\"\n />\n <button\n onClick={() => setGradientOverlay('linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5))')}\n className=\"cms-gradient-preset\"\n style={{ background: 'rgba(0,0,0,0.5)' }}\n title=\"Dark Overlay\"\n type=\"button\"\n />\n <button\n onClick={() => setGradientOverlay('linear-gradient(rgba(102,126,234,0.8), rgba(118,75,162,0.8))')}\n className=\"cms-gradient-preset\"\n style={{ background: 'linear-gradient(135deg, rgba(102,126,234,0.8), rgba(118,75,162,0.8))' }}\n title=\"Purple Gradient\"\n type=\"button\"\n />\n <button\n onClick={() => setGradientOverlay('linear-gradient(rgba(250,112,154,0.8), rgba(254,225,64,0.8))')}\n className=\"cms-gradient-preset\"\n style={{ background: 'linear-gradient(135deg, rgba(250,112,154,0.8), rgba(254,225,64,0.8))' }}\n title=\"Sunset Gradient\"\n type=\"button\"\n />\n <button\n onClick={() => setGradientOverlay('linear-gradient(rgba(67,233,123,0.8), rgba(56,249,215,0.8))')}\n className=\"cms-gradient-preset\"\n style={{ background: 'linear-gradient(135deg, rgba(67,233,123,0.8), rgba(56,249,215,0.8))' }}\n title=\"Green Gradient\"\n type=\"button\"\n />\n </div>\n <input\n type=\"text\"\n value={currentGradient}\n onChange={(e) => setGradientOverlay(e.target.value)}\n placeholder=\"Custom gradient (CSS)\"\n className=\"cms-text-input\"\n />\n </div>\n )}\n\n {/* Opacity */}\n <div className=\"cms-section-editor-group\">\n <label>Opacity: {Math.round((currentOpacity || 1) * 100)}%</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={currentOpacity || 1}\n onChange={(e) => setOpacity(parseFloat(e.target.value))}\n className=\"cms-range-input\"\n />\n <div className=\"cms-preset-buttons\">\n <button onClick={() => setOpacity(0.25)} type=\"button\">25%</button>\n <button onClick={() => setOpacity(0.5)} type=\"button\">50%</button>\n <button onClick={() => setOpacity(0.75)} type=\"button\">75%</button>\n <button onClick={() => setOpacity(1)} type=\"button\">100%</button>\n </div>\n </div>\n\n {/* Text Alignment */}\n <div className=\"cms-section-editor-group\">\n <label>Text Alignment</label>\n <div className=\"cms-button-group\">\n <button\n className={`cms-icon-button ${currentTextAlign === 'left' ? 'active' : ''}`}\n onClick={() => setTextAlign('left')}\n title=\"Align Left\"\n type=\"button\"\n >\n <FaAlignLeft />\n </button>\n <button\n className={`cms-icon-button ${currentTextAlign === 'center' ? 'active' : ''}`}\n onClick={() => setTextAlign('center')}\n title=\"Align Center\"\n type=\"button\"\n >\n <FaAlignCenter />\n </button>\n <button\n className={`cms-icon-button ${currentTextAlign === 'right' ? 'active' : ''}`}\n onClick={() => setTextAlign('right')}\n title=\"Align Right\"\n type=\"button\"\n >\n <FaAlignRight />\n </button>\n <button\n className={`cms-icon-button ${currentTextAlign === 'justify' ? 'active' : ''}`}\n onClick={() => setTextAlign('justify')}\n title=\"Justify\"\n type=\"button\"\n >\n <FaAlignJustify />\n </button>\n </div>\n </div>\n\n {/* Layout Type */}\n <div className=\"cms-section-editor-group\">\n <label>Layout Type</label>\n <div className=\"cms-button-group\">\n <button\n className={`cms-layout-button ${currentLayout === 'block' ? 'active' : ''}`}\n onClick={() => setLayoutType('block')}\n type=\"button\"\n >\n Block\n </button>\n <button\n className={`cms-layout-button ${currentLayout === 'flex' ? 'active' : ''}`}\n onClick={() => setLayoutType('flex')}\n type=\"button\"\n >\n Flex\n </button>\n <button\n className={`cms-layout-button ${currentLayout === 'grid' ? 'active' : ''}`}\n onClick={() => setLayoutType('grid')}\n type=\"button\"\n >\n Grid\n </button>\n </div>\n </div>\n\n {/* Flex Controls */}\n {currentLayout === 'flex' && (\n <>\n <div className=\"cms-section-editor-group\">\n <label>Flex Direction</label>\n <select\n value={currentFlexDirection}\n onChange={(e) => setFlexDirection(e.target.value)}\n className=\"cms-select\"\n >\n <option value=\"row\">Row</option>\n <option value=\"column\">Column</option>\n <option value=\"row-reverse\">Row Reverse</option>\n <option value=\"column-reverse\">Column Reverse</option>\n </select>\n </div>\n\n <div className=\"cms-section-editor-group\">\n <label>Flex Wrap</label>\n <select\n value={currentFlexWrap}\n onChange={(e) => setFlexWrap(e.target.value)}\n className=\"cms-select\"\n >\n <option value=\"nowrap\">No Wrap</option>\n <option value=\"wrap\">Wrap</option>\n <option value=\"wrap-reverse\">Wrap Reverse</option>\n </select>\n </div>\n\n <div className=\"cms-section-editor-group\">\n <label>Align Items</label>\n <select\n value={currentAlignItems}\n onChange={(e) => setAlignItems(e.target.value)}\n className=\"cms-select\"\n >\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"stretch\">Stretch</option>\n </select>\n </div>\n\n <div className=\"cms-section-editor-group\">\n <label>Justify Content</label>\n <select\n value={currentJustifyContent}\n onChange={(e) => setJustifyContent(e.target.value)}\n className=\"cms-select\"\n >\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Space Between</option>\n <option value=\"space-around\">Space Around</option>\n <option value=\"space-evenly\">Space Evenly</option>\n </select>\n </div>\n </>\n )}\n\n {/* Grid Controls */}\n {currentLayout === 'grid' && (\n <>\n <div className=\"cms-section-editor-group\">\n <label>Grid Columns</label>\n <input\n type=\"text\"\n value={currentGridColumns}\n onChange={(e) => setGridColumns(e.target.value)}\n placeholder=\"repeat(3, 1fr)\"\n className=\"cms-text-input\"\n />\n <div className=\"cms-preset-buttons\">\n <button onClick={() => setGridColumns('1fr')} type=\"button\">1 Col</button>\n <button onClick={() => setGridColumns('repeat(2, 1fr)')} type=\"button\">2 Cols</button>\n <button onClick={() => setGridColumns('repeat(3, 1fr)')} type=\"button\">3 Cols</button>\n <button onClick={() => setGridColumns('repeat(4, 1fr)')} type=\"button\">4 Cols</button>\n </div>\n </div>\n\n <div className=\"cms-section-editor-group\">\n <label>Grid Rows</label>\n <input\n type=\"text\"\n value={currentGridRows}\n onChange={(e) => setGridRows(e.target.value)}\n placeholder=\"auto\"\n className=\"cms-text-input\"\n />\n </div>\n </>\n )}\n\n {/* Gap */}\n {(currentLayout === 'flex' || currentLayout === 'grid') && (\n <div className=\"cms-section-editor-group\">\n <label>Gap: {currentGap}</label>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={parseInt(currentGap) || 0}\n onChange={(e) => setGap(`${e.target.value}px`)}\n className=\"cms-range-input\"\n />\n <div className=\"cms-preset-buttons\">\n <button onClick={() => setGap('0px')} type=\"button\">0</button>\n <button onClick={() => setGap('8px')} type=\"button\">8</button>\n <button onClick={() => setGap('16px')} type=\"button\">16</button>\n <button onClick={() => setGap('24px')} type=\"button\">24</button>\n <button onClick={() => setGap('32px')} type=\"button\">32</button>\n </div>\n </div>\n )}\n\n {/* Padding */}\n <div className=\"cms-section-editor-group\">\n <label>Padding</label>\n <input\n type=\"text\"\n value={currentPadding}\n onChange={(e) => setPadding(e.target.value)}\n placeholder=\"40px\"\n className=\"cms-text-input\"\n />\n <div className=\"cms-preset-buttons\">\n <button onClick={() => setPadding('0px')} type=\"button\">0</button>\n <button onClick={() => setPadding('20px')} type=\"button\">20</button>\n <button onClick={() => setPadding('40px')} type=\"button\">40</button>\n <button onClick={() => setPadding('60px')} type=\"button\">60</button>\n <button onClick={() => setPadding('80px')} type=\"button\">80</button>\n </div>\n </div>\n\n {/* Margin */}\n <div className=\"cms-section-editor-group\">\n <label>Margin</label>\n <input\n type=\"text\"\n value={currentMargin}\n onChange={(e) => setMargin(e.target.value)}\n placeholder=\"0px\"\n className=\"cms-text-input\"\n />\n <div className=\"cms-preset-buttons\">\n <button onClick={() => setMargin('0px')} type=\"button\">0</button>\n <button onClick={() => setMargin('20px 0')} type=\"button\">20 V</button>\n <button onClick={() => setMargin('40px 0')} type=\"button\">40 V</button>\n <button onClick={() => setMargin('0 auto')} type=\"button\">Center</button>\n </div>\n </div>\n\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, $createParagraphNode } from \"lexical\";\nimport { $createEmbedNode } from \"../blocks/EmbedNode\";\nimport { MdVideoLibrary } from \"react-icons/md\";\n\nexport default function EmbedPlugin() {\n const [editor] = useLexicalComposerContext();\n const [showModal, setShowModal] = useState(false);\n const [embedUrl, setEmbedUrl] = useState('');\n const modalRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (modalRef.current && !modalRef.current.contains(event.target as Node)) {\n setShowModal(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const openModal = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {\n setShowModal(true);\n setEmbedUrl('');\n }, []);\n\n const insertEmbed = useCallback(() => {\n if (!embedUrl.trim()) return;\n\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const embedNode = $createEmbedNode(embedUrl.trim());\n selection.insertNodes([embedNode]);\n \n // Add paragraph after embed\n const paragraph = $createParagraphNode();\n embedNode.insertAfter(paragraph);\n paragraph.select();\n }\n });\n\n setShowModal(false);\n setEmbedUrl('');\n }, [editor, embedUrl]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insertEmbed();\n } else if (e.key === 'Escape') {\n setShowModal(false);\n }\n }, [insertEmbed]);\n\n return (\n <div className=\"cms-embed-plugin\" ref={modalRef}>\n <button\n className=\"cms-toolbar-button\"\n onClick={openModal}\n title=\"Insert Embed (YouTube, Facebook, Instagram, etc.)\"\n type=\"button\"\n >\n <MdVideoLibrary size={18} />\n </button>\n\n {showModal && (\n <>\n <div className=\"cms-modal-backdrop\" onClick={() => setShowModal(false)} />\n <div className=\"cms-embed-modal\">\n <div className=\"cms-embed-modal-header\">\n <span>Insert Embed</span>\n </div>\n\n <div className=\"cms-embed-modal-content\">\n <div className=\"cms-embed-info\">\n <p>Paste a link from:</p>\n <div className=\"cms-embed-platforms\">\n <span className=\"cms-embed-platform\">YouTube</span>\n <span className=\"cms-embed-platform\">Facebook</span>\n <span className=\"cms-embed-platform\">Instagram</span>\n <span className=\"cms-embed-platform\">Twitter/X</span>\n <span className=\"cms-embed-platform\">TikTok</span>\n <span className=\"cms-embed-platform\">Vimeo</span>\n <span className=\"cms-embed-platform\">Spotify</span>\n <span className=\"cms-embed-platform\">SoundCloud</span>\n </div>\n </div>\n\n <div className=\"cms-form-group\">\n <label htmlFor=\"embed-url\">URL</label>\n <input\n id=\"embed-url\"\n type=\"url\"\n value={embedUrl}\n onChange={(e) => setEmbedUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"https://www.youtube.com/watch?v=...\"\n className=\"cms-input\"\n autoFocus\n />\n </div>\n\n <div className=\"cms-embed-examples\">\n <p className=\"cms-embed-examples-title\">Example URLs:</p>\n <ul className=\"cms-embed-examples-list\">\n <li>https://www.youtube.com/watch?v=dQw4w9WgXcQ</li>\n <li>https://www.facebook.com/username/posts/123456</li>\n <li>https://www.instagram.com/p/ABC123/</li>\n <li>https://twitter.com/username/status/123456</li>\n <li>https://www.tiktok.com/@username/video/123456</li>\n <li>https://vimeo.com/123456789</li>\n <li>https://open.spotify.com/track/123456</li>\n </ul>\n </div>\n\n <div className=\"cms-modal-actions\">\n <button\n onClick={() => setShowModal(false)}\n className=\"cms-button cms-button-secondary\"\n type=\"button\"\n >\n Cancel\n </button>\n <button\n onClick={insertEmbed}\n className=\"cms-button cms-button-primary\"\n disabled={!embedUrl.trim()}\n type=\"button\"\n >\n Insert Embed\n </button>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","import { DecoratorNode, NodeKey, SerializedLexicalNode, Spread, LexicalEditor } from \"lexical\";\nimport React, { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type EmbedType = 'youtube' | 'facebook' | 'instagram' | 'twitter' | 'tiktok' | 'vimeo' | 'spotify' | 'soundcloud' | 'generic';\n\nexport type SerializedEmbedNode = Spread<\n {\n url: string;\n embedType: EmbedType;\n width?: number;\n height?: number;\n },\n SerializedLexicalNode\n>;\n\n// Helper functions to detect and parse embed URLs\nfunction detectEmbedType(url: string): EmbedType {\n if (url.includes('youtube.com') || url.includes('youtu.be')) return 'youtube';\n if (url.includes('facebook.com') || url.includes('fb.watch')) return 'facebook';\n if (url.includes('instagram.com')) return 'instagram';\n if (url.includes('twitter.com') || url.includes('x.com')) return 'twitter';\n if (url.includes('tiktok.com')) return 'tiktok';\n if (url.includes('vimeo.com')) return 'vimeo';\n if (url.includes('spotify.com')) return 'spotify';\n if (url.includes('soundcloud.com')) return 'soundcloud';\n return 'generic';\n}\n\nfunction getYouTubeEmbedUrl(url: string): string {\n const videoIdMatch = url.match(/(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/);\n return videoIdMatch ? `https://www.youtube.com/embed/${videoIdMatch[1]}` : url;\n}\n\nfunction getVimeoEmbedUrl(url: string): string {\n const videoIdMatch = url.match(/vimeo\\.com\\/(\\d+)/);\n return videoIdMatch ? `https://player.vimeo.com/video/${videoIdMatch[1]}` : url;\n}\n\nfunction getSpotifyEmbedUrl(url: string): string {\n // Convert Spotify URLs to embed format\n const match = url.match(/spotify\\.com\\/(track|album|playlist|episode|show)\\/([a-zA-Z0-9]+)/);\n if (match) {\n return `https://open.spotify.com/embed/${match[1]}/${match[2]}`;\n }\n return url;\n}\n\nfunction getEmbedUrl(url: string, type: EmbedType): string {\n switch (type) {\n case 'youtube':\n return getYouTubeEmbedUrl(url);\n case 'vimeo':\n return getVimeoEmbedUrl(url);\n case 'spotify':\n return getSpotifyEmbedUrl(url);\n case 'facebook':\n return `https://www.facebook.com/plugins/post.php?href=${encodeURIComponent(url)}&width=500`;\n case 'instagram':\n return url; // Instagram uses oEmbed API\n case 'twitter':\n return url; // Twitter uses oEmbed API\n case 'tiktok':\n return url; // TikTok uses oEmbed API\n case 'soundcloud':\n return `https://w.soundcloud.com/player/?url=${encodeURIComponent(url)}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true`;\n default:\n return url;\n }\n}\n\nfunction EmbedComponent({\n url,\n type,\n width: initialWidth,\n height: initialHeight,\n nodeKey,\n editor\n}: {\n url: string;\n type: EmbedType;\n width?: number;\n height?: number;\n nodeKey: NodeKey;\n editor: LexicalEditor;\n}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n const [isSelected, setIsSelected] = useState(false);\n const [embedHtml, setEmbedHtml] = useState<string>('');\n \n // Use saved dimensions or defaults\n const width = initialWidth || (type === 'spotify' ? 300 : 560);\n const height = initialHeight || (type === 'spotify' ? 380 : 315);\n \n const [size, setSize] = useState({\n width,\n height\n });\n\n // Update size when props change\n useEffect(() => {\n setSize({\n width: initialWidth || (type === 'spotify' ? 300 : 560),\n height: initialHeight || (type === 'spotify' ? 380 : 315)\n });\n }, [initialWidth, initialHeight, type]);\n\n const embedUrl = getEmbedUrl(url, type);\n\n // Load oEmbed content for platforms that require it\n useEffect(() => {\n if (type === 'instagram' || type === 'twitter' || type === 'tiktok') {\n loadOEmbed(url, type);\n }\n }, [url, type]);\n\n const loadOEmbed = async (url: string, type: EmbedType) => {\n try {\n let oEmbedUrl = '';\n \n switch (type) {\n case 'instagram':\n oEmbedUrl = `https://graph.facebook.com/v12.0/instagram_oembed?url=${encodeURIComponent(url)}&access_token=YOUR_ACCESS_TOKEN`;\n break;\n case 'twitter':\n oEmbedUrl = `https://publish.twitter.com/oembed?url=${encodeURIComponent(url)}`;\n break;\n case 'tiktok':\n oEmbedUrl = `https://www.tiktok.com/oembed?url=${encodeURIComponent(url)}`;\n break;\n }\n\n if (oEmbedUrl) {\n const response = await fetch(oEmbedUrl);\n const data = await response.json();\n if (data.html) {\n setEmbedHtml(data.html);\n }\n }\n } catch (error) {\n console.error('Failed to load oEmbed:', error);\n }\n };\n\n const onResizeStart = useCallback((e: React.MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n\n const startX = e.clientX;\n const startY = e.clientY;\n const startWidth = size.width;\n const startHeight = size.height;\n const aspectRatio = startWidth / startHeight;\n\n let finalWidth = startWidth;\n let finalHeight = startHeight;\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n \n let newWidth = startWidth;\n let newHeight = startHeight;\n\n if (direction === 'e' || direction === 'ne' || direction === 'se') {\n newWidth = Math.max(280, startWidth + deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'w' || direction === 'nw' || direction === 'sw') {\n newWidth = Math.max(280, startWidth - deltaX);\n newHeight = newWidth / aspectRatio;\n } else if (direction === 'n') {\n newHeight = Math.max(200, startHeight - deltaY);\n newWidth = newHeight * aspectRatio;\n } else if (direction === 's') {\n newHeight = Math.max(200, startHeight + deltaY);\n newWidth = newHeight * aspectRatio;\n }\n\n finalWidth = newWidth;\n finalHeight = newHeight;\n setSize({ width: newWidth, height: newHeight });\n };\n\n const onMouseUp = () => {\n setIsResizing(false);\n \n editor.update(() => {\n const node = editor.getEditorState()._nodeMap.get(nodeKey);\n if (node && node instanceof EmbedNode) {\n const writable = node.getWritable() as EmbedNode;\n writable.__width = finalWidth;\n writable.__height = finalHeight;\n }\n });\n \n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [size, editor, nodeKey]);\n\n const renderEmbed = () => {\n // For oEmbed platforms, render the HTML directly\n if (embedHtml && (type === 'instagram' || type === 'twitter' || type === 'tiktok')) {\n return (\n <div \n dangerouslySetInnerHTML={{ __html: embedHtml }}\n style={{ maxWidth: '100%' }}\n />\n );\n }\n\n // For iframe-based embeds\n if (type === 'youtube' || type === 'vimeo' || type === 'facebook' || type === 'spotify' || type === 'soundcloud') {\n return (\n <iframe\n src={embedUrl}\n width=\"100%\"\n height=\"100%\"\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{\n border: 'none',\n borderRadius: '8px'\n }}\n />\n );\n }\n\n // Fallback for generic embeds\n return (\n <div style={{\n padding: '20px',\n background: '#f8f9fa',\n borderRadius: '8px',\n textAlign: 'center'\n }}>\n <p style={{ margin: '0 0 10px 0', color: '#6c757d' }}>Embedded Content</p>\n <a \n href={url} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n style={{ color: '#667eea', textDecoration: 'underline' }}\n >\n {url}\n </a>\n </div>\n );\n };\n\n return (\n <div\n ref={wrapperRef}\n className={`embed-node-wrapper embed-${type} ${isSelected ? 'selected' : ''} ${isResizing ? 'resizing' : ''}`}\n onClick={() => setIsSelected(!isSelected)}\n style={{\n width: `${size.width}px`,\n height: type === 'instagram' || type === 'twitter' || type === 'tiktok' ? 'auto' : `${size.height}px`,\n maxWidth: '100%',\n position: 'relative',\n display: 'inline-block',\n margin: '20px 0',\n cursor: isSelected ? 'default' : 'pointer',\n border: isSelected ? '2px solid #667eea' : '2px solid transparent',\n borderRadius: '8px',\n transition: 'border-color 0.2s'\n }}\n >\n {renderEmbed()}\n \n {isSelected && (type === 'youtube' || type === 'vimeo' || type === 'facebook' || type === 'spotify' || type === 'soundcloud') && (\n <>\n {/* Resize handles - only for iframe embeds */}\n <div \n className=\"embed-resize-handle embed-resize-handle-se\"\n onMouseDown={(e) => onResizeStart(e, 'se')}\n style={{\n position: 'absolute',\n right: '-4px',\n bottom: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nwse-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n <div \n className=\"embed-resize-handle embed-resize-handle-ne\"\n onMouseDown={(e) => onResizeStart(e, 'ne')}\n style={{\n position: 'absolute',\n right: '-4px',\n top: '-4px',\n width: '12px',\n height: '12px',\n background: '#667eea',\n cursor: 'nesw-resize',\n borderRadius: '50%',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n border: '2px solid white',\n zIndex: 10\n }}\n />\n </>\n )}\n </div>\n );\n}\n\nexport class EmbedNode extends DecoratorNode<JSX.Element> {\n __url: string;\n __type: EmbedType;\n __width?: number;\n __height?: number;\n\n static getType() { return \"embed\"; }\n \n static clone(node: EmbedNode): EmbedNode { \n return new EmbedNode(node.__url, node.__type, node.__width, node.__height, node.__key); \n }\n\n static isInline(): boolean {\n return true;\n }\n\n constructor(url: string, type?: EmbedType, width?: number, height?: number, key?: NodeKey) {\n super(key);\n this.__url = url;\n this.__type = type || detectEmbedType(url);\n this.__width = width;\n this.__height = height;\n }\n\n createDOM(): HTMLElement {\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.maxWidth = '100%';\n return span;\n }\n\n updateDOM(): boolean {\n return false;\n }\n\n decorate(editor: LexicalEditor): JSX.Element {\n return (\n <EmbedComponent \n url={this.__url}\n type={this.__type}\n width={this.__width}\n height={this.__height}\n nodeKey={this.__key}\n editor={editor}\n />\n );\n }\n\n exportJSON(): SerializedEmbedNode {\n return { \n type: \"embed\", \n url: this.__url,\n embedType: this.__type,\n width: this.__width,\n height: this.__height,\n version: 1 \n };\n }\n\n static importJSON(serializedNode: SerializedEmbedNode): EmbedNode {\n return new EmbedNode(\n serializedNode.url,\n serializedNode.embedType,\n serializedNode.width,\n serializedNode.height\n );\n }\n}\n\nexport function $createEmbedNode(url: string, type?: EmbedType, width?: number, height?: number): EmbedNode {\n return new EmbedNode(url, type, width, height);\n}\n\nexport function $isEmbedNode(node: any): node is EmbedNode {\n return node instanceof EmbedNode;\n}\n","import { HeadingNode, QuoteNode as LexicalQuoteNode } from \"@lexical/rich-text\";\nimport { ListNode, ListItemNode } from \"@lexical/list\";\nimport { AutoLinkNode, LinkNode as LexicalLinkNode } from \"@lexical/link\";\nimport { CodeNode } from \"@lexical/code\";\nimport { ImageNode } from \"../blocks/ImageNode\";\nimport { QuoteNode } from \"../blocks/QuoteNode\";\nimport { ColumnsNode, ColumnNode } from \"../blocks/ColumnsNode\";\nimport { YouTubeNode } from \"../blocks/YouTubeNode\";\nimport { SectionNode } from \"../blocks/SectionNode\";\nimport { EmbedNode } from \"../blocks/EmbedNode\";\n\nexport function createEditorConfig(value?: string) {\n return {\n namespace: \"CMSBlockEditor\",\n editorState: value || undefined,\n theme: {\n text: {\n bold: 'cms-text-bold',\n italic: 'cms-text-italic',\n underline: 'cms-text-underline',\n strikethrough: 'cms-text-strikethrough',\n code: 'cms-text-code',\n },\n link: 'cms-link',\n code: 'cms-code-block',\n quote: 'cms-quote-block',\n },\n onError(error: Error) {\n console.error('Lexical error:', error);\n },\n nodes: [\n HeadingNode,\n ListNode,\n ListItemNode,\n AutoLinkNode,\n LexicalLinkNode,\n CodeNode,\n ImageNode,\n QuoteNode,\n ColumnsNode,\n ColumnNode,\n YouTubeNode,\n LexicalQuoteNode,\n SectionNode,\n EmbedNode,\n ],\n };\n}","import { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport LexicalErrorBoundary from \"@lexical/react/LexicalErrorBoundary\";\nimport { createEditorConfig } from \"./EditorConfig\";\nimport { useEffect } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport \"../styles/renderer.css\";\n\ninterface CMSRendererProps {\n content: string;\n className?: string;\n}\n\nfunction ReadOnlyPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n editor.setEditable(false);\n }, [editor]);\n\n return null;\n}\n\nexport default function CMSRenderer({ content, className = \"\" }: CMSRendererProps) {\n const config = {\n ...createEditorConfig(content),\n editable: false,\n };\n\n return (\n <LexicalComposer initialConfig={config}>\n <div className={`cms-renderer ${className}`}>\n <RichTextPlugin\n contentEditable={<ContentEditable className=\"cms-renderer-content\" />}\n placeholder={null}\n ErrorBoundary={LexicalErrorBoundary}\n />\n <ReadOnlyPlugin />\n </div>\n </LexicalComposer>\n );\n}\n"],"mappings":"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","names":["useEffect","useState","DecoratorNode","useCallback","useRef","useState","Fragment","jsx","jsxs","ElementNode","jsx","jsxs","useState","editor","useEffect","useLexicalComposerContext","$getSelection","$isRangeSelection","$createParagraphNode","$createHeadingNode","$createQuoteNode","$createCodeNode","useLexicalComposerContext","useState","useCallback","useEffect","useRef","$getSelection","$isRangeSelection","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useCallback","useEffect","useRef","$getSelection","$isRangeSelection","$isTextNode","$patchStyleText","jsx","jsxs","useLexicalComposerContext","useState","useCallback","useRef","useEffect","$isTextNode","children","$getRoot","$getRoot","$createParagraphNode","$createHeadingNode","$createListNode","$createListItemNode","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useRef","useEffect","useCallback","useLexicalComposerContext","useState","useCallback","useRef","useEffect","$getSelection","$isRangeSelection","$createParagraphNode","ElementNode","$generateNodesFromDOM","jsx","jsxs","useLexicalComposerContext","useState","useRef","useEffect","useCallback","$getSelection","$isRangeSelection","$createParagraphNode","useState","useCallback","useEffect","jsx","jsxs","useLexicalComposerContext","$getSelection","$isRangeSelection","$createHeadingNode","$createParagraphNode","$createQuoteNode","$createCodeNode","useLexicalComposerContext","useEffect","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","useLexicalComposerContext","useEffect","COMMAND_PRIORITY_LOW","$getSelection","$isRangeSelection","useLexicalComposerContext","useEffect","useState","useCallback","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","$createTextNode","$createLinkNode","jsx","jsxs","useLexicalComposerContext","useState","useCallback","useRef","useEffect","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","MdSettings","Fragment","jsx","jsxs","PRESET_COLORS","useLexicalComposerContext","useState","useRef","useEffect","$getSelection","$isRangeSelection","node","COMMAND_PRIORITY_LOW","useCallback","useLexicalComposerContext","useState","useCallback","useRef","useEffect","$getSelection","$isRangeSelection","$createParagraphNode","DecoratorNode","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","url","type","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useRef","useEffect","useCallback","$getSelection","$isRangeSelection","$createParagraphNode","jsx","jsxs","jsx","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary","useEffect","useLexicalComposerContext","jsx","jsxs","useLexicalComposerContext","useEffect","LexicalComposer","RichTextPlugin","ContentEditable","LexicalErrorBoundary"]}