@editora/core 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs +475 -0
- package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs.map +1 -0
- package/dist/AnchorPlugin.native-7es9PVZ9.mjs +340 -0
- package/dist/AnchorPlugin.native-7es9PVZ9.mjs.map +1 -0
- package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs +449 -0
- package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs.map +1 -0
- package/dist/BlockquotePlugin.native-JFmOLsxN.mjs +48 -0
- package/dist/BlockquotePlugin.native-JFmOLsxN.mjs.map +1 -0
- package/dist/BoldPlugin.native-BAzzoqU5.mjs +45 -0
- package/dist/BoldPlugin.native-BAzzoqU5.mjs.map +1 -0
- package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs +79 -0
- package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs.map +1 -0
- package/dist/ChecklistPlugin.native-Dccs3nLe.mjs +153 -0
- package/dist/ChecklistPlugin.native-Dccs3nLe.mjs.map +1 -0
- package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs +27 -0
- package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs.map +1 -0
- package/dist/CodePlugin.native-DD9xFIid.mjs +1679 -0
- package/dist/CodePlugin.native-DD9xFIid.mjs.map +1 -0
- package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs +326 -0
- package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs.map +1 -0
- package/dist/CommentsPlugin.native-2zQV8Ia4.mjs +473 -0
- package/dist/CommentsPlugin.native-2zQV8Ia4.mjs.map +1 -0
- package/dist/DirectionPlugin.native-Be7wCzkI.mjs +59 -0
- package/dist/DirectionPlugin.native-Be7wCzkI.mjs.map +1 -0
- package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs +116 -0
- package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs.map +1 -0
- package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs +461 -0
- package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs.map +1 -0
- package/dist/EmojisPlugin.native-D6mJSnSR.mjs +1033 -0
- package/dist/EmojisPlugin.native-D6mJSnSR.mjs.map +1 -0
- package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs +106 -0
- package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs.map +1 -0
- package/dist/FontSizePlugin.native-DkLMLPue.mjs +186 -0
- package/dist/FontSizePlugin.native-DkLMLPue.mjs.map +1 -0
- package/dist/FootnotePlugin.native-BciVc9W6.mjs +128 -0
- package/dist/FootnotePlugin.native-BciVc9W6.mjs.map +1 -0
- package/dist/FullscreenPlugin.native-ChXyxeNw.mjs +77 -0
- package/dist/FullscreenPlugin.native-ChXyxeNw.mjs.map +1 -0
- package/dist/HeadingPlugin.native-DrLYwQnQ.mjs +64 -0
- package/dist/HeadingPlugin.native-DrLYwQnQ.mjs.map +1 -0
- package/dist/HistoryPlugin.native-DoDRifCf.mjs +89 -0
- package/dist/HistoryPlugin.native-DoDRifCf.mjs.map +1 -0
- package/dist/IndentPlugin.native-CbFugPoi.mjs +133 -0
- package/dist/IndentPlugin.native-CbFugPoi.mjs.map +1 -0
- package/dist/ItalicPlugin.native-CQjjDyUL.mjs +43 -0
- package/dist/ItalicPlugin.native-CQjjDyUL.mjs.map +1 -0
- package/dist/LineHeightPlugin.native-CWQT2FIa.mjs +73 -0
- package/dist/LineHeightPlugin.native-CWQT2FIa.mjs.map +1 -0
- package/dist/LinkPlugin.native-BdAOV-iu.mjs +206 -0
- package/dist/LinkPlugin.native-BdAOV-iu.mjs.map +1 -0
- package/dist/ListPlugin.native-CLFU5AUQ.mjs +59 -0
- package/dist/ListPlugin.native-CLFU5AUQ.mjs.map +1 -0
- package/dist/MathPlugin.native-DE_ii-LA.mjs +182 -0
- package/dist/MathPlugin.native-DE_ii-LA.mjs.map +1 -0
- package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs +533 -0
- package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs.map +1 -0
- package/dist/MergeTagPlugin.native-CrxyThyn.mjs +178 -0
- package/dist/MergeTagPlugin.native-CrxyThyn.mjs.map +1 -0
- package/dist/PageBreakPlugin.native-DDjcDyRW.mjs +172 -0
- package/dist/PageBreakPlugin.native-DDjcDyRW.mjs.map +1 -0
- package/dist/PreviewPlugin.native-DBvfpmIv.mjs +322 -0
- package/dist/PreviewPlugin.native-DBvfpmIv.mjs.map +1 -0
- package/dist/PrintPlugin.native-BUpm52VJ.mjs +311 -0
- package/dist/PrintPlugin.native-BUpm52VJ.mjs.map +1 -0
- package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs +731 -0
- package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs.map +1 -0
- package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs +465 -0
- package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs.map +1 -0
- package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs +43 -0
- package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs.map +1 -0
- package/dist/TablePlugin.native-EEWXn1-s.mjs +491 -0
- package/dist/TablePlugin.native-EEWXn1-s.mjs.map +1 -0
- package/dist/TemplatePlugin.native-BlSn1c9h.mjs +564 -0
- package/dist/TemplatePlugin.native-BlSn1c9h.mjs.map +1 -0
- package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs +97 -0
- package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs.map +1 -0
- package/dist/TextColorPlugin.native-D6SmTglm.mjs +432 -0
- package/dist/TextColorPlugin.native-D6SmTglm.mjs.map +1 -0
- package/dist/UnderlinePlugin.native-QpIcK4L2.mjs +35 -0
- package/dist/UnderlinePlugin.native-QpIcK4L2.mjs.map +1 -0
- package/dist/core.css +1 -0
- package/dist/documentManager-irzj9n3V.mjs +37627 -0
- package/dist/documentManager-irzj9n3V.mjs.map +1 -0
- package/dist/editorContainerHelpers-C7kdWnS0.mjs +27 -0
- package/dist/editorContainerHelpers-C7kdWnS0.mjs.map +1 -0
- package/dist/editora.min.js +519 -4
- package/dist/editora.min.js.map +1 -0
- package/dist/editora.umd.js +519 -4
- package/dist/editora.umd.js.map +1 -0
- package/dist/index-BF5RBhL9.js +4 -0
- package/dist/index-BF5RBhL9.js.map +1 -0
- package/dist/index-BPsf460l.mjs +1243 -0
- package/dist/index-BPsf460l.mjs.map +1 -0
- package/dist/index.cjs.js +517 -4
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es-CuicffkQ.mjs +6665 -0
- package/dist/index.es-CuicffkQ.mjs.map +1 -0
- package/dist/index.esm.js +1403 -122
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin-loader.js +55 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/purify.es-CKpwg8Tk.mjs +471 -0
- package/dist/purify.es-CKpwg8Tk.mjs.map +1 -0
- package/dist/webcomponent-core.js +1243 -0
- package/dist/webcomponent-core.js.map +1 -0
- package/dist/webcomponent-core.min.css +1 -0
- package/dist/webcomponent-core.min.js +597 -0
- package/dist/webcomponent-core.min.js.map +1 -0
- package/dist/webcomponent.cjs.js +2 -0
- package/dist/webcomponent.cjs.js.map +1 -0
- package/dist/webcomponent.esm.js +6 -0
- package/dist/webcomponent.esm.js.map +1 -0
- package/dist/webcomponent.js +1286 -0
- package/dist/webcomponent.js.map +1 -0
- package/dist/webcomponent.min.css +1 -0
- package/dist/webcomponent.min.js +4076 -0
- package/dist/webcomponent.min.js.map +1 -0
- package/package.json +64 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webcomponent-core.min.js","sources":["../src/config/PluginLoader.ts","../src/EditorState.ts","../src/schema/Node.ts","../src/plugins/Plugin.ts","../src/core/CommandRegistry.ts","../src/core/EditorEngine.ts","../src/ui/ToolbarRenderer.ts","../src/ui/FloatingToolbar.ts","../src/ui/StatusBar.ts","../src/utils/statusBarUtils.ts","../src/config/ConfigResolver.ts","../src/webcomponent/RichTextEditor.ts","../src/webcomponent/standalone.core.ts","../../plugins/bold/src/BoldPlugin.native.ts","../../plugins/italic/src/ItalicPlugin.native.ts","../../plugins/underline/src/UnderlinePlugin.native.ts","../../plugins/strikethrough/src/StrikethroughPlugin.native.ts","../../plugins/clear-formatting/src/ClearFormattingPlugin.native.ts","../../plugins/heading/src/HeadingPlugin.native.ts","../../plugins/blockquote/src/BlockquotePlugin.native.ts","../../light-code-editor/dist/index.es.js","../../plugins/code/src/CodePlugin.native.ts","../../plugins/list/src/ListPlugin.native.ts","../../plugins/history/src/HistoryPlugin.native.ts"],"sourcesContent":["/**\n * PluginLoader - Dynamic plugin loading and resolution\n */\n\nimport { Plugin } from '../plugins/Plugin';\n\nexport interface PluginLoadConfig {\n mode?: 'local' | 'api' | 'hybrid';\n apiUrl?: string;\n fallbackToLocal?: boolean;\n}\n\nexport class PluginLoader {\n private loadedPlugins: Map<string, Plugin> = new Map();\n private pluginRegistry: Map<string, () => Plugin | Promise<Plugin>> = new Map();\n\n /**\n * Register a plugin factory (sync or async)\n */\n register(name: string, factory: () => Plugin | Promise<Plugin>): void {\n this.pluginRegistry.set(name, factory);\n }\n\n /**\n * Load a plugin by name (async)\n */\n async load(name: string, config?: PluginLoadConfig): Promise<Plugin | null> {\n // Check if already loaded\n if (this.loadedPlugins.has(name)) {\n return this.loadedPlugins.get(name)!;\n }\n \n // Check if registered\n const factory = this.pluginRegistry.get(name);\n if (!factory) {\n console.warn(`Plugin not found: ${name}`);\n return null;\n }\n \n // Create plugin instance (may be async)\n const plugin = await factory();\n \n // Apply config if provided\n if (config) {\n this.applyPluginConfig(plugin, config);\n }\n \n this.loadedPlugins.set(name, plugin);\n return plugin;\n }\n\n /**\n * Load multiple plugins\n */\n async loadMultiple(names: string[], config?: PluginLoadConfig): Promise<Plugin[]> {\n const plugins = await Promise.all(\n names.map(name => this.load(name, config))\n );\n return plugins.filter((p): p is Plugin => p !== null);\n }\n\n /**\n * Parse plugin string \"lists link image media\"\n */\n async parsePluginString(pluginString: string, config?: PluginLoadConfig): Promise<Plugin[]> {\n const names = pluginString.split(/\\s+/).filter(Boolean);\n return this.loadMultiple(names, config);\n }\n\n /**\n * Apply configuration to plugin\n */\n private applyPluginConfig(plugin: Plugin, config: PluginLoadConfig): void {\n // Store config on plugin instance for runtime use\n (plugin as any).__pluginConfig = config;\n }\n\n /**\n * Unload a plugin\n */\n unload(name: string): void {\n this.loadedPlugins.delete(name);\n }\n\n /**\n * Clear all loaded plugins\n */\n clear(): void {\n this.loadedPlugins.clear();\n }\n\n /**\n * Get all loaded plugins\n */\n getLoadedPlugins(): Plugin[] {\n return Array.from(this.loadedPlugins.values());\n }\n\n /**\n * Get all registered plugin names (available for loading)\n */\n getRegisteredPluginNames(): string[] {\n return Array.from(this.pluginRegistry.keys());\n }\n\n /**\n * Check if plugin is loaded\n */\n isLoaded(name: string): boolean {\n return this.loadedPlugins.has(name);\n }\n}\n","import { Node, Schema } from './schema/Node';\n\nexport interface EditorSelection {\n anchor: number;\n head: number;\n}\n\nexport class EditorState {\n doc: Node;\n selection: EditorSelection;\n schema: Schema;\n\n constructor(doc: Node, selection: EditorSelection, schema: Schema) {\n this.doc = doc;\n this.selection = selection;\n this.schema = schema;\n }\n\n static create(schema: Schema, content?: Node): EditorState {\n const doc = content || schema.node('doc', {}, [schema.node('paragraph')]);\n return new EditorState(doc, { anchor: 0, head: 0 }, schema);\n }\n\n apply(doc: Node, selection?: EditorSelection): EditorState {\n return new EditorState(doc, selection || this.selection, this.schema);\n }\n}\n","export interface NodeSpec {\n content?: string;\n marks?: string;\n group?: string;\n inline?: boolean;\n attrs?: Record<string, any>;\n toDOM?: (node: Node) => [string, Record<string, any>?, ...any[]];\n parseDOM?: Array<{\n tag: string;\n getAttrs?: (dom: HTMLElement) => Record<string, any> | null;\n }>;\n}\n\nexport interface Node {\n type: string;\n content?: Node[];\n text?: string;\n marks?: string[];\n attrs?: Record<string, any>;\n}\n\nexport class Schema {\n nodes: Map<string, NodeSpec>;\n marks: Map<string, NodeSpec>;\n\n constructor(nodes: Record<string, NodeSpec>, marks: Record<string, NodeSpec>) {\n this.nodes = new Map(Object.entries(nodes));\n this.marks = new Map(Object.entries(marks));\n }\n\n node(type: string, attrs?: Record<string, any>, content?: Node[]): Node {\n return { type, attrs, content };\n }\n\n text(text: string, marks?: string[]): Node {\n return { type: 'text', text, marks };\n }\n}\n","import { Schema, NodeSpec } from '../schema/Node';\nimport { EditorState } from '../EditorState';\nimport React from 'react';\n\nexport interface ToolbarItem {\n id?: string;\n label: string;\n command?: string;\n icon?: string;\n type?:\n | \"button\"\n | \"dropdown\"\n | \"input\"\n | \"inline-menu\"\n | \"separator\"\n | \"group\";\n options?: Array<{ label: string; value: string }>;\n placeholder?: string;\n shortcut?: string;\n items?: ToolbarItem[]; // For groups and dropdowns\n}\n\nexport interface PluginContext {\n provider?: React.FC<{ children: React.ReactNode }>;\n initialize?: () => void;\n destroy?: () => void;\n onEditorReady?: (editor: any) => void;\n}\n\n/**\n * Plugin operation modes\n * - local: All operations happen client-side only\n * - api: All operations require API calls\n * - hybrid: Tries API first, falls back to local\n */\nexport type PluginMode = 'local' | 'api' | 'hybrid';\n\n/**\n * Plugin configuration\n */\nexport interface PluginConfig {\n mode?: PluginMode;\n apiUrl?: string;\n apiKey?: string;\n timeout?: number;\n fallbackToLocal?: boolean;\n retryAttempts?: number;\n offline?: {\n enabled?: boolean;\n cacheStrategy?: 'memory' | 'indexeddb' | 'localstorage';\n };\n [key: string]: any;\n}\n\nexport interface Plugin {\n name: string;\n nodes?: Record<string, NodeSpec>;\n marks?: Record<string, NodeSpec>;\n commands?: Record<string, (state: EditorState, ...args: any[]) => EditorState | null>;\n toolbar?: ToolbarItem[];\n context?: PluginContext;\n config?: PluginConfig;\n \n // Lifecycle hooks\n initialize?: (config?: PluginConfig) => void | Promise<void>;\n destroy?: () => void | Promise<void>;\n \n // Mode-specific operations\n executeLocal?: (command: string, ...args: any[]) => any;\n executeAPI?: (command: string, ...args: any[]) => Promise<any>;\n executeHybrid?: (command: string, ...args: any[]) => Promise<any>;\n}\n\nexport class PluginManager {\n plugins: Plugin[] = [];\n private pluginConfigs: Map<string, PluginConfig> = new Map();\n\n register(plugin: Plugin, config?: PluginConfig): void {\n this.plugins.push(plugin);\n \n if (config) {\n this.pluginConfigs.set(plugin.name, config);\n }\n \n // Initialize plugin if it has an initialize method\n if (plugin.initialize) {\n const pluginConfig = this.pluginConfigs.get(plugin.name) || plugin.config;\n plugin.initialize(pluginConfig);\n }\n }\n\n unregister(pluginName: string): void {\n const index = this.plugins.findIndex(p => p.name === pluginName);\n if (index > -1) {\n const plugin = this.plugins[index];\n \n // Destroy plugin if it has a destroy method\n if (plugin.destroy) {\n plugin.destroy();\n }\n \n this.plugins.splice(index, 1);\n this.pluginConfigs.delete(pluginName);\n }\n }\n\n getPlugin(name: string): Plugin | undefined {\n return this.plugins.find(p => p.name === name);\n }\n\n getPluginConfig(name: string): PluginConfig | undefined {\n return this.pluginConfigs.get(name);\n }\n\n buildSchema(): Schema {\n const nodes: Record<string, NodeSpec> = {};\n const marks: Record<string, NodeSpec> = {};\n\n this.plugins.forEach(plugin => {\n if (plugin.nodes) Object.assign(nodes, plugin.nodes);\n if (plugin.marks) Object.assign(marks, plugin.marks);\n });\n\n return new Schema(nodes, marks);\n }\n\n getCommands(): Record<string, (state: EditorState, ...args: any[]) => EditorState | null> {\n const commands: Record<string, (state: EditorState, ...args: any[]) => EditorState | null> = {};\n this.plugins.forEach(plugin => {\n if (plugin.commands) Object.assign(commands, plugin.commands);\n });\n return commands;\n }\n\n getToolbarItems(): ToolbarItem[] {\n return this.plugins.flatMap(p => p.toolbar || []);\n }\n\n /**\n * Execute plugin command with mode awareness\n */\n async executePluginCommand(\n pluginName: string,\n command: string,\n ...args: any[]\n ): Promise<any> {\n const plugin = this.getPlugin(pluginName);\n if (!plugin) {\n throw new Error(`Plugin not found: ${pluginName}`);\n }\n\n const config = this.getPluginConfig(pluginName) || plugin.config || {};\n const mode = config.mode || 'local';\n\n try {\n switch (mode) {\n case 'local':\n return plugin.executeLocal ? plugin.executeLocal(command, ...args) : null;\n\n case 'api':\n if (!plugin.executeAPI) {\n throw new Error(`Plugin ${pluginName} does not support API mode`);\n }\n return await plugin.executeAPI(command, ...args);\n\n case 'hybrid':\n if (plugin.executeHybrid) {\n return await plugin.executeHybrid(command, ...args);\n }\n \n // Default hybrid implementation: try API, fall back to local\n try {\n if (plugin.executeAPI) {\n return await plugin.executeAPI(command, ...args);\n }\n } catch (error) {\n console.warn(`API execution failed for ${pluginName}, falling back to local`, error);\n if (plugin.executeLocal && config.fallbackToLocal !== false) {\n return plugin.executeLocal(command, ...args);\n }\n throw error;\n }\n break;\n\n default:\n throw new Error(`Unknown plugin mode: ${mode}`);\n }\n } catch (error) {\n console.error(`Error executing command ${command} on plugin ${pluginName}:`, error);\n throw error;\n }\n }\n\n /**\n * Destroy all plugins\n */\n async destroyAll(): Promise<void> {\n const destroyPromises = this.plugins\n .filter(p => p.destroy)\n .map(p => p.destroy!());\n\n await Promise.all(destroyPromises);\n this.plugins = [];\n this.pluginConfigs.clear();\n }\n}\n","/**\n * CommandRegistry - Centralized command management\n */\n\nimport { EditorState } from '../EditorState';\n\nexport type CommandHandler = (state: EditorState, value?: any) => EditorState | null;\n\nexport class CommandRegistry {\n private commands: Map<string, CommandHandler> = new Map();\n\n constructor(initialCommands: Record<string, CommandHandler> = {}) {\n Object.entries(initialCommands).forEach(([name, handler]) => {\n this.register(name, handler);\n });\n }\n\n /**\n * Register a command\n */\n register(name: string, handler: CommandHandler): void {\n if (this.commands.has(name)) {\n console.warn(`Command ${name} is being overwritten`);\n }\n this.commands.set(name, handler);\n }\n\n /**\n * Unregister a command\n */\n unregister(name: string): void {\n this.commands.delete(name);\n }\n\n /**\n * Get a command handler\n */\n get(name: string): CommandHandler | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Check if command exists\n */\n has(name: string): boolean {\n return this.commands.has(name);\n }\n\n /**\n * Get all command names\n */\n getCommandNames(): string[] {\n return Array.from(this.commands.keys());\n }\n\n /**\n * Clear all commands\n */\n clear(): void {\n this.commands.clear();\n }\n}\n","/**\n * EditorEngine - Core editor logic, framework-agnostic\n * Manages document model, selection, commands, and plugin registry\n */\n\nimport { EditorState } from '../EditorState';\nimport { PluginManager } from '../plugins/Plugin';\nimport { Schema } from '../schema/Node';\nimport { CommandRegistry } from './CommandRegistry';\n\nexport interface EditorEngineConfig {\n content?: string;\n plugins?: any[];\n readonly?: boolean;\n autofocus?: boolean;\n sanitize?: boolean;\n maxLength?: number;\n debounceDelay?: number;\n}\n\nexport class EditorEngine {\n state: EditorState;\n pluginManager: PluginManager;\n commandRegistry: CommandRegistry;\n private listeners: Map<string, Array<(...args: any[]) => void>> = new Map();\n private isReadonly: boolean = false;\n private isDestroyed: boolean = false;\n\n constructor(config: EditorEngineConfig = {}) {\n this.isReadonly = config.readonly || false;\n \n // Initialize plugin manager\n this.pluginManager = new PluginManager();\n if (config.plugins && Array.isArray(config.plugins)) {\n config.plugins.forEach(plugin => this.pluginManager.register(plugin));\n }\n \n // Build schema from plugins\n const schema = this.pluginManager.buildSchema();\n this.state = EditorState.create(schema);\n \n // Initialize command registry\n this.commandRegistry = new CommandRegistry(this.pluginManager.getCommands());\n }\n\n /**\n * Execute a command\n */\n execCommand(name: string, value?: any): boolean {\n if (this.isReadonly) {\n console.warn('Cannot execute commands in readonly mode');\n return false;\n }\n\n if (this.isDestroyed) {\n console.warn('Cannot execute commands on destroyed editor');\n return false;\n }\n\n const command = this.commandRegistry.get(name);\n if (!command) {\n console.warn(`Command not found: ${name}`);\n return false;\n }\n \n let newState: EditorState | null;\n \n if (value !== undefined) {\n newState = (command as any)(this.state, value);\n } else {\n newState = command(this.state);\n }\n \n if (newState) {\n this.setState(newState);\n this.emit('change', this.state);\n return true;\n }\n return false;\n }\n\n /**\n * Update editor state\n */\n setState(state: EditorState): void {\n if (this.isDestroyed) return;\n \n this.state = state;\n this.emit('stateChange', state);\n }\n\n /**\n * Get current state\n */\n getState(): EditorState {\n return this.state;\n }\n\n /**\n * Set readonly mode\n */\n setReadonly(readonly: boolean): void {\n this.isReadonly = readonly;\n this.emit('readonlyChange', readonly);\n }\n\n /**\n * Check if readonly\n */\n isReadOnly(): boolean {\n return this.isReadonly;\n }\n\n /**\n * Event emitter\n */\n on(event: string, handler: (...args: any[]) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n \n this.listeners.get(event)!.push(handler);\n \n // Return unsubscribe function\n return () => {\n const handlers = this.listeners.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n };\n }\n\n /**\n * Emit event\n */\n private emit(event: string, ...args: any[]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(...args);\n } catch (error) {\n console.error(`Error in ${event} handler:`, error);\n }\n });\n }\n }\n\n /**\n * Destroy editor instance\n */\n destroy(): void {\n if (this.isDestroyed) return;\n \n this.isDestroyed = true;\n this.listeners.clear();\n this.emit('destroy');\n }\n\n /**\n * Check if destroyed\n */\n isEditorDestroyed(): boolean {\n return this.isDestroyed;\n }\n}\n","/**\n * ToolbarRenderer - Framework-agnostic toolbar rendering\n */\n\nimport { Plugin, ToolbarItem } from '../plugins/Plugin';\n\nexport interface ToolbarConfig {\n items?: string; // \"undo redo | bold italic | media table\"\n sticky?: boolean;\n position?: 'top' | 'bottom';\n floating?: boolean;\n}\n\nexport interface ToolbarButton {\n id: string;\n label: string;\n command?: string;\n icon?: string;\n type?: 'button' | 'dropdown' | 'input' | 'separator' | 'inline-menu' | 'group';\n options?: Array<{ label: string; value: string }>;\n active?: boolean;\n disabled?: boolean;\n items?: ToolbarButton[]; // For groups\n}\n\nexport class ToolbarRenderer {\n private config: ToolbarConfig;\n private plugins: Plugin[];\n private container?: HTMLElement;\n private commandHandler?: (command: string, value?: any) => void;\n private pluginLoader?: any; // PluginLoader instance to get all registered plugins\n\n constructor(config: ToolbarConfig, plugins: Plugin[], pluginLoader?: any) {\n this.config = config;\n this.plugins = plugins;\n this.pluginLoader = pluginLoader;\n }\n\n /**\n * Set command handler for toolbar buttons\n */\n setCommandHandler(handler: (command: string, value?: any) => void): void {\n this.commandHandler = handler;\n }\n\n /**\n * Parse toolbar string into button groups\n */\n private parseToolbarString(toolbarString: string): ToolbarButton[][] {\n const groups: ToolbarButton[][] = [];\n const sections = toolbarString.split(\"|\").map((s) => s.trim());\n\n const allToolbarItems = this.getAvailableToolbarItems();\n // Index items by command and by label (for group types with no command)\n const itemMap = new Map<string, ToolbarItem>();\n allToolbarItems.forEach((item) => {\n if (item.command) itemMap.set(item.command, item);\n if (item.type === \"group\" && item.label) itemMap.set(item.label, item);\n });\n\n // Common command aliases for backward compatibility\n const aliases: Record<string, string> = {\n bold: \"toggleBold\",\n italic: \"toggleItalic\",\n underline: \"toggleUnderline\",\n strikethrough: \"toggleStrikethrough\",\n bullist: \"toggleBulletList\",\n numlist: \"toggleOrderedList\",\n checklist: \"toggleChecklist\",\n link: \"openLinkDialog\",\n image: \"openImageDialog\",\n table: \"insertTable\",\n anchor: \"insertAnchor\",\n code: \"toggleSourceView\",\n blockquote: \"toggleBlockquote\",\n undo: \"undo\",\n redo: \"redo\",\n textColor: \"openTextColorPicker\",\n backgroundColor: \"openBackgroundColorPicker\",\n fontSize: \"fontSize\",\n fontFamily: \"setFontFamily\",\n lineHeight: \"setLineHeight\",\n heading: \"setBlockType\",\n paragraph: \"setParagraph\",\n textAlignment: \"setTextAlignment\",\n direction: \"setDirectionLTR\",\n indent: \"increaseIndent\",\n outdent: \"decreaseIndent\",\n capitalization: \"setCapitalization\",\n math: \"insertMath\",\n specialCharacters: \"insertSpecialCharacter\",\n emojis: \"openEmojiDialog\",\n embedIframe: \"openEmbedIframeDialog\",\n fullscreen: \"toggleFullscreen\",\n preview: \"togglePreview\",\n print: \"print\",\n a11yChecker: \"toggleA11yChecker\",\n spellCheck: \"toggleSpellCheck\",\n comments: \"addComment\",\n showHideComments: \"toggleComments\",\n toggleComments: \"toggleComments\",\n footnote: \"insertFootnote\",\n mergeTags: \"insertMergeTag\",\n pageBreak: \"insertPageBreak\",\n template: \"insertTemplate\",\n importWord: \"importWord\",\n exportWord: \"exportWord\",\n exportPdf: \"exportPdf\",\n insertImage: \"insertImage\",\n insertVideo: \"insertVideo\",\n codeBlock: \"insertCodeBlock\",\n };\n\n sections.forEach((section) => {\n const buttons: ToolbarButton[] = [];\n const commands = section.split(/\\s+/).filter(Boolean);\n\n commands.forEach((cmd) => {\n // Special handling for multi-button shortcuts\n if (cmd === \"direction\") {\n // Direction has two buttons: LTR and RTL\n const ltrItem = itemMap.get(\"setDirectionLTR\");\n const rtlItem = itemMap.get(\"setDirectionRTL\");\n if (ltrItem) {\n buttons.push({\n id: \"directionLTR\",\n label: ltrItem.label,\n command: ltrItem.command,\n icon: ltrItem.icon,\n type: ltrItem.type || \"button\",\n options: ltrItem.options,\n });\n }\n if (rtlItem) {\n buttons.push({\n id: \"directionRTL\",\n label: rtlItem.label,\n command: rtlItem.command,\n icon: rtlItem.icon,\n type: rtlItem.type || \"button\",\n options: rtlItem.options,\n });\n }\n return;\n }\n\n if (cmd === \"comments\") {\n // Comments has two buttons: Add Comment and Toggle Comments\n const addCommentItem = itemMap.get(\"addComment\");\n const toggleCommentsItem = itemMap.get(\"toggleComments\");\n if (addCommentItem) {\n buttons.push({\n id: \"addComment\",\n label: addCommentItem.label,\n command: addCommentItem.command,\n icon: addCommentItem.icon,\n type: addCommentItem.type || \"button\",\n options: addCommentItem.options,\n });\n }\n if (toggleCommentsItem) {\n buttons.push({\n id: \"toggleComments\",\n label: toggleCommentsItem.label,\n command: toggleCommentsItem.command,\n icon: toggleCommentsItem.icon,\n type: toggleCommentsItem.type || \"button\",\n options: toggleCommentsItem.options,\n });\n }\n return;\n }\n\n // Try direct command first, then alias\n const actualCommand = aliases[cmd] || cmd;\n let item = itemMap.get(actualCommand);\n // If not found by command, try by label (for group type)\n if (!item) item = itemMap.get(cmd);\n if (item) {\n buttons.push({\n id: cmd,\n label: item.label,\n command: item.command,\n icon: item.icon,\n type:\n item.type === \"separator\" ? \"separator\" : item.type || \"button\",\n options: item.options,\n items: item.items,\n });\n }\n });\n\n if (buttons.length > 0) {\n groups.push(buttons);\n }\n });\n\n return groups;\n }\n\n /**\n * Get all available toolbar items from plugins\n */\n private getAvailableToolbarItems(): ToolbarItem[] {\n // Use the plugins that were passed to the constructor - they should be loaded\n const items = this.plugins.flatMap((p) => p.toolbar || []);\n return items;\n }\n\n /**\n * Render toolbar to DOM element\n */\n render(container: HTMLElement): void {\n this.container = container;\n container.innerHTML = \"\";\n container.className = \"editora-toolbar\";\n\n if (this.config.sticky) {\n container.classList.add(\"editora-toolbar-sticky\");\n }\n\n if (this.config.position) {\n container.classList.add(`editora-toolbar-${this.config.position}`);\n }\n\n const toolbarString = this.config.items || this.getDefaultToolbarString();\n const buttonGroups = this.parseToolbarString(toolbarString);\n buttonGroups.forEach((group, groupIndex) => {\n const groupEl = document.createElement(\"div\");\n groupEl.className = \"editora-toolbar-group\";\n group.forEach((button) => {\n this.appendToolbarButton(groupEl, button);\n });\n container.appendChild(groupEl);\n // Add separator between groups (except last)\n if (groupIndex < buttonGroups.length - 1) {\n const separator = document.createElement(\"div\");\n separator.className = \"editora-toolbar-separator\";\n container.appendChild(separator);\n }\n });\n }\n\n /**\n * Append a toolbar button or group to a parent element\n */\n private appendToolbarButton(\n parent: HTMLElement,\n button: ToolbarButton,\n ): void {\n if (button.type === \"separator\") {\n const separator = document.createElement(\"div\");\n separator.className = \"editora-toolbar-separator\";\n parent.appendChild(separator);\n } else if (button.type === \"dropdown\") {\n const dropdownEl = this.createDropdown(button);\n parent.appendChild(dropdownEl);\n } else if (button.type === \"inline-menu\") {\n const inlineMenuEl = this.createInlineMenu(button);\n parent.appendChild(inlineMenuEl);\n } else if (button.type === \"group\" && button.items && button.items.length) {\n const groupButtonEl = this.createGroupButton(button);\n parent.appendChild(groupButtonEl);\n } else if (button.type === \"input\") {\n const inputEl = this.createInput(button);\n parent.appendChild(inputEl);\n } else {\n const buttonEl = this.createButton(button);\n parent.appendChild(buttonEl);\n }\n }\n\n /**\n * Create a toolbar button element\n */\n private createGroupButton(button: ToolbarButton): HTMLElement {\n const el = document.createElement(\"div\");\n el.className = \"editora-toolbar-group-button\";\n el.title = button.label;\n // Optionally add a label or icon for the group itself\n if (button.icon) {\n if (button.icon.startsWith(\"<svg\") && button.icon.endsWith(\"</svg>\")) {\n const iconWrapper = document.createElement(\"span\");\n iconWrapper.className = \"editora-toolbar-icon\";\n iconWrapper.innerHTML = button.icon;\n el.appendChild(iconWrapper);\n } else {\n el.innerHTML = button.icon;\n }\n }\n // Recursively render group items\n if (button.items && button.items.length) {\n const itemsContainer = document.createElement(\"div\");\n itemsContainer.className = \"editora-toolbar-group-items\";\n button.items.forEach((child) => {\n this.appendToolbarButton(itemsContainer, child);\n });\n el.appendChild(itemsContainer);\n }\n return el;\n }\n\n /**\n * Create a toolbar button element\n */\n private createInput(button: ToolbarButton): HTMLElement {\n const el = document.createElement(\"input\");\n el.className = `editora-toolbar-input ${button.label.toLowerCase().replace(/\\s+/g, \"-\")}`;\n el.type = \"text\";\n el.title = button.label;\n el.placeholder = button.placeholder || \"\";\n el.setAttribute(\"data-command\", button.command);\n\n if (button.active) {\n el.classList.add(\"active\");\n }\n\n if (button.disabled) {\n el.disabled = true;\n }\n\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (this.commandHandler) {\n this.commandHandler(button.command);\n }\n });\n\n return el;\n }\n\n /**\n * Create a toolbar button element\n */\n private createButton(button: ToolbarButton): HTMLElement {\n const el = document.createElement(\"button\");\n el.className = \"editora-toolbar-button\";\n el.type = \"button\";\n el.title = button.label;\n el.setAttribute(\"data-command\", button.command);\n\n if (button.icon) {\n // Check if it's an SVG icon\n if (button.icon.startsWith(\"<svg\") && button.icon.endsWith(\"</svg>\")) {\n // Create a wrapper span for the SVG with proper styling\n const iconWrapper = document.createElement(\"span\");\n iconWrapper.className = \"editora-toolbar-icon\";\n iconWrapper.innerHTML = button.icon;\n el.appendChild(iconWrapper);\n } else {\n // Plain text icon or HTML\n el.innerHTML = button.icon;\n }\n } else {\n el.textContent = button.label;\n }\n\n if (button.active) {\n el.classList.add(\"active\");\n }\n\n if (button.disabled) {\n el.disabled = true;\n }\n\n el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (this.commandHandler) {\n this.commandHandler(button.command);\n }\n });\n\n return el;\n }\n\n /**\n * Create a dropdown element\n */\n private createDropdown(button: ToolbarButton): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = \"editora-toolbar-dropdown\";\n\n const trigger = document.createElement(\"button\");\n trigger.className =\n \"editora-toolbar-button editora-toolbar-dropdown-trigger\";\n trigger.type = \"button\";\n trigger.textContent = button.label;\n\n const menu = document.createElement(\"div\");\n menu.className = \"editora-toolbar-dropdown-menu\";\n menu.style.display = \"none\";\n\n if (button.options) {\n button.options.forEach((option) => {\n const item = document.createElement(\"button\");\n item.className = \"editora-toolbar-dropdown-item\";\n item.type = \"button\";\n item.textContent = option.label;\n item.setAttribute(\"data-value\", option.value);\n\n item.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (this.commandHandler) {\n this.commandHandler(button.command, option.value);\n }\n menu.style.display = \"none\";\n });\n\n menu.appendChild(item);\n });\n }\n\n trigger.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n const isOpen = menu.style.display === \"block\";\n menu.style.display = isOpen ? \"none\" : \"block\";\n });\n\n // Close dropdown when clicking outside\n const closeDropdown = (e: Event) => {\n if (!container.contains(e.target as Node)) {\n menu.style.display = \"none\";\n }\n };\n\n document.addEventListener(\"click\", closeDropdown);\n\n // Store the cleanup function for later removal\n (container as any)._cleanupDropdown = () => {\n document.removeEventListener(\"click\", closeDropdown);\n };\n\n container.appendChild(trigger);\n container.appendChild(menu);\n\n return container;\n }\n\n /**\n * Create an inline menu element (like dropdown but triggered by button click)\n */\n private createInlineMenu(button: ToolbarButton): HTMLElement {\n const container = document.createElement(\"div\");\n container.className =\n \"editora-toolbar-dropdown editora-toolbar-inline-menu\";\n\n const trigger = document.createElement(\"button\");\n trigger.className = \"editora-toolbar-button\";\n trigger.type = \"button\";\n trigger.title = button.label;\n\n // Add icon if available\n if (button.icon) {\n if (button.icon.startsWith(\"<svg\") && button.icon.endsWith(\"</svg>\")) {\n const iconWrapper = document.createElement(\"span\");\n iconWrapper.className = \"editora-toolbar-icon\";\n iconWrapper.innerHTML = button.icon;\n trigger.appendChild(iconWrapper);\n } else {\n trigger.innerHTML = button.icon;\n }\n } else {\n trigger.textContent = button.label;\n }\n\n const menu = document.createElement(\"div\");\n menu.className = \"editora-toolbar-dropdown-menu\";\n menu.style.display = \"none\";\n\n if (button.options) {\n button.options.forEach((option) => {\n const item = document.createElement(\"button\");\n item.className = \"editora-toolbar-dropdown-item\";\n item.type = \"button\";\n item.textContent = option.label;\n item.setAttribute(\"data-value\", option.value);\n\n item.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.commandHandler) {\n this.commandHandler(button.command, option.value);\n }\n menu.style.display = \"none\";\n });\n\n menu.appendChild(item);\n });\n }\n\n trigger.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Close all other menus\n const allMenus = this.container?.querySelectorAll(\n \".editora-toolbar-dropdown-menu\",\n );\n allMenus?.forEach((m) => {\n if (m !== menu) {\n (m as HTMLElement).style.display = \"none\";\n }\n });\n\n // Toggle this menu\n menu.style.display = menu.style.display === \"none\" ? \"block\" : \"none\";\n });\n\n // Close menu when clicking outside\n document.addEventListener(\"click\", (e) => {\n if (!container.contains(e.target as Node)) {\n menu.style.display = \"none\";\n }\n });\n\n container.appendChild(trigger);\n container.appendChild(menu);\n\n return container;\n }\n\n /**\n * Get default toolbar string if none provided\n */\n private getDefaultToolbarString(): string {\n const items = this.getAvailableToolbarItems();\n return items.map((item) => item.command).join(\" \");\n }\n\n /**\n * Update button state\n */\n updateButtonState(\n command: string,\n state: { active?: boolean; disabled?: boolean },\n ): void {\n if (!this.container) return;\n\n const button = this.container.querySelector(\n `[data-command=\"${command}\"]`,\n ) as HTMLButtonElement;\n if (button) {\n if (state.active !== undefined) {\n button.classList.toggle(\"active\", state.active);\n }\n if (state.disabled !== undefined) {\n button.disabled = state.disabled;\n }\n }\n }\n\n /**\n * Destroy toolbar\n */\n destroy(): void {\n if (this.container) {\n // Clean up dropdown event listeners\n const dropdowns = this.container.querySelectorAll('.editora-toolbar-dropdown');\n dropdowns.forEach(dropdown => {\n const cleanup = (dropdown as any)._cleanupDropdown;\n if (cleanup) {\n cleanup();\n }\n });\n this.container.innerHTML = \"\";\n }\n this.commandHandler = undefined;\n }\n}\n","/**\n * FloatingToolbar - Context-sensitive floating toolbar\n */\n\nexport interface FloatingToolbarConfig {\n enabled?: boolean;\n items?: string;\n anchorToSelection?: boolean;\n}\n\nexport class FloatingToolbar {\n private config: FloatingToolbarConfig;\n private container?: HTMLElement;\n private visible: boolean = false;\n\n constructor(config: FloatingToolbarConfig) {\n this.config = config;\n }\n\n /**\n * Create and mount floating toolbar\n */\n create(parentElement: HTMLElement): HTMLElement {\n const container = document.createElement('div');\n container.className = 'editora-floating-toolbar';\n container.style.display = 'none';\n container.style.position = 'absolute';\n container.style.zIndex = '1000';\n \n this.container = container;\n parentElement.appendChild(container);\n \n return container;\n }\n\n /**\n * Show toolbar at position\n */\n show(x: number, y: number): void {\n if (!this.container) return;\n \n this.container.style.display = 'block';\n this.container.style.left = `${x}px`;\n this.container.style.top = `${y}px`;\n this.visible = true;\n }\n\n /**\n * Hide toolbar\n */\n hide(): void {\n if (!this.container) return;\n \n this.container.style.display = 'none';\n this.visible = false;\n }\n\n /**\n * Update position\n */\n updatePosition(x: number, y: number): void {\n if (!this.container || !this.visible) return;\n \n this.container.style.left = `${x}px`;\n this.container.style.top = `${y}px`;\n }\n\n /**\n * Check if visible\n */\n isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Destroy floating toolbar\n */\n destroy(): void {\n if (this.container && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.container = undefined;\n this.visible = false;\n }\n}\n","/**\n * StatusBar - Editor status information display\n */\n\nexport interface StatusBarConfig {\n enabled?: boolean;\n position?: 'top' | 'bottom';\n}\n\nexport interface StatusInfo {\n wordCount?: number;\n charCount?: number;\n lineCount?: number;\n language?: string;\n cursorPosition?: {\n line: number;\n column: number;\n };\n selectionInfo?: {\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n selectedChars: number;\n selectedWords: number;\n };\n custom?: Record<string, string>;\n}\n\nexport class StatusBar {\n private config: StatusBarConfig;\n private container?: HTMLElement;\n private statusInfo: StatusInfo = {};\n\n constructor(config: StatusBarConfig = {}) {\n this.config = config;\n }\n\n /**\n * Create and mount status bar\n */\n create(parentElement: HTMLElement): HTMLElement {\n const container = document.createElement('div');\n container.className = 'editora-statusbar';\n \n if (this.config.position) {\n container.classList.add(`editora-statusbar-${this.config.position}`);\n }\n \n this.container = container;\n parentElement.appendChild(container);\n \n return container;\n }\n\n /**\n * Update status information\n */\n update(info: StatusInfo): void {\n this.statusInfo = { ...this.statusInfo, ...info };\n this.render();\n }\n\n /**\n * Render status bar content\n */\n private render(): void {\n if (!this.container) return;\n\n this.container.innerHTML = '';\n\n // Create left section\n const leftSection = document.createElement('div');\n leftSection.className = 'editora-statusbar-left';\n\n // Create right section\n const rightSection = document.createElement('div');\n rightSection.className = 'editora-statusbar-right';\n\n // Left section: Cursor position and selection info\n const leftItems: string[] = [];\n\n if (this.statusInfo.selectionInfo) {\n const sel = this.statusInfo.selectionInfo;\n if (sel.startLine === sel.endLine && sel.startColumn === sel.endColumn) {\n // Cursor position only\n leftItems.push(`Ln ${sel.startLine}, Col ${sel.startColumn}`);\n } else {\n // Selection info\n if (sel.startLine === sel.endLine) {\n leftItems.push(`Ln ${sel.startLine}, Col ${sel.startColumn}-${sel.endColumn}`);\n } else {\n leftItems.push(`Ln ${sel.startLine}:${sel.startColumn} - ${sel.endLine}:${sel.endColumn}`);\n }\n leftItems.push(`${sel.selectedChars} chars selected`);\n }\n } else if (this.statusInfo.cursorPosition) {\n const pos = this.statusInfo.cursorPosition;\n leftItems.push(`Ln ${pos.line}, Col ${pos.column}`);\n }\n\n if (this.statusInfo.language) {\n leftItems.push(this.statusInfo.language);\n }\n\n // Right section: Word count and character count\n const rightItems: string[] = [];\n\n if (this.statusInfo.wordCount !== undefined) {\n rightItems.push(`${this.statusInfo.wordCount} words`);\n }\n\n if (this.statusInfo.charCount !== undefined) {\n rightItems.push(`${this.statusInfo.charCount} chars`);\n }\n\n if (this.statusInfo.lineCount !== undefined) {\n rightItems.push(`${this.statusInfo.lineCount} lines`);\n }\n\n // Add custom items to right section\n if (this.statusInfo.custom) {\n Object.entries(this.statusInfo.custom).forEach(([key, value]) => {\n rightItems.push(`${key}: ${value}`);\n });\n }\n\n // Render left section\n leftItems.forEach((item, index) => {\n const span = document.createElement('span');\n span.className = 'editora-statusbar-item';\n span.textContent = item;\n leftSection.appendChild(span);\n\n if (index < leftItems.length - 1) {\n const separator = document.createElement('span');\n separator.className = 'editora-statusbar-separator';\n separator.textContent = '|';\n leftSection.appendChild(separator);\n }\n });\n\n // Render right section\n rightItems.forEach((item, index) => {\n const span = document.createElement('span');\n span.className = 'editora-statusbar-item';\n span.textContent = item;\n rightSection.appendChild(span);\n\n if (index < rightItems.length - 1) {\n const separator = document.createElement('span');\n separator.className = 'editora-statusbar-separator';\n separator.textContent = '|';\n rightSection.appendChild(separator);\n }\n });\n\n // Add sections to container\n this.container.appendChild(leftSection);\n this.container.appendChild(rightSection);\n }\n\n /**\n * Destroy status bar\n */\n destroy(): void {\n if (this.container && this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.container = undefined;\n }\n}\n","/**\n * Utility functions for status bar calculations\n */\n\n/**\n * Get cursor position (line and column) from a range within a content element\n */\nexport function getCursorPosition(contentElement: HTMLElement, range: Range): { line: number; column: number } {\n const text = contentElement.textContent || '';\n const startOffset = getTextOffset(contentElement, range.startContainer, range.startOffset);\n\n // Count lines up to the cursor position\n const textBeforeCursor = text.substring(0, startOffset);\n const lines = textBeforeCursor.split('\\n');\n const line = lines.length;\n const column = lines[lines.length - 1].length + 1;\n\n return { line, column };\n}\n\n/**\n * Get text offset from a DOM node and offset within a root element\n */\nexport function getTextOffset(rootElement: HTMLElement, node: Node, offset: number): number {\n let textOffset = 0;\n const walker = document.createTreeWalker(\n rootElement,\n NodeFilter.SHOW_TEXT,\n null\n );\n\n let currentNode = walker.firstChild();\n while (currentNode) {\n if (currentNode === node) {\n textOffset += offset;\n break;\n } else if (currentNode.nodeType === Node.TEXT_NODE) {\n textOffset += currentNode.textContent?.length || 0;\n }\n currentNode = walker.nextNode();\n }\n\n return textOffset;\n}\n\n/**\n * Count lines in a contentEditable element by analyzing block-level elements\n */\nexport function countLines(contentElement: HTMLElement): number {\n // Count block-level elements and br tags that represent line breaks\n const blocks = contentElement.querySelectorAll('div, p, br, h1, h2, h3, h4, h5, h6, blockquote, li, pre');\n let lineCount = 1; // At least 1 line\n\n // If there are block elements, count them as separate lines\n if (blocks.length > 0) {\n lineCount = blocks.length;\n // If the last element is empty or just a br, it might represent an additional empty line\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock.tagName === 'BR' ||\n (lastBlock as HTMLElement).innerHTML?.trim() === '' ||\n lastBlock.textContent?.trim() === '') {\n lineCount++;\n }\n } else {\n // No block elements, fall back to text-based line counting\n const text = contentElement.textContent || '';\n const textLines = text.split('\\n').length;\n lineCount = Math.max(1, textLines);\n }\n\n return lineCount;\n}\n\n/**\n * Calculate word and character counts from text\n */\nexport function calculateTextStats(text: string): { words: number; chars: number } {\n const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n const chars = text.length;\n return { words, chars };\n}\n\n/**\n * Get selection information from a range\n */\nexport function getSelectionInfo(range: Range, cursorPosition: { line: number; column: number }) {\n const selectedText = range.toString();\n return {\n startLine: cursorPosition.line,\n startColumn: cursorPosition.column,\n endLine: cursorPosition.line, // For now, assuming single line selections\n endColumn: cursorPosition.column + selectedText.length,\n selectedChars: selectedText.length,\n selectedWords: selectedText.trim().split(/\\s+/).filter(Boolean).length\n };\n}","/**\n * ConfigResolver - Configuration resolution with priority handling\n * Priority: Explicit JS config > Web Component attributes > Plugin defaults > Editor defaults\n */\n\nexport interface EditorConfigDefaults {\n height?: number | string;\n width?: number | string;\n readonly?: boolean;\n disabled?: boolean;\n menubar?: boolean;\n toolbar?: string | boolean;\n plugins?: string | string[];\n theme?: string;\n content?: string;\n placeholder?: string;\n autofocus?: boolean;\n autosave?: boolean | { interval?: number };\n spellcheck?: boolean | { mode?: 'local' | 'api' | 'hybrid'; apiUrl?: string };\n language?: string;\n [key: string]: any;\n}\n\nexport interface ConfigSource {\n jsConfig?: EditorConfigDefaults;\n attributes?: Record<string, string>;\n pluginDefaults?: EditorConfigDefaults;\n editorDefaults?: EditorConfigDefaults;\n}\n\nexport class ConfigResolver {\n private static readonly EDITOR_DEFAULTS: EditorConfigDefaults = {\n height: 400,\n width: '100%',\n readonly: false,\n disabled: false,\n menubar: true,\n toolbar: true,\n plugins: [],\n theme: 'light',\n content: '',\n placeholder: 'Start typing...',\n autofocus: false,\n autosave: false,\n spellcheck: false,\n language: 'en',\n };\n\n /**\n * Resolve configuration from multiple sources with priority\n */\n static resolve(sources: ConfigSource): EditorConfigDefaults {\n const config: EditorConfigDefaults = {};\n \n // Start with editor defaults\n Object.assign(config, this.EDITOR_DEFAULTS);\n \n // Apply plugin defaults\n if (sources.pluginDefaults) {\n Object.assign(config, sources.pluginDefaults);\n }\n \n // Apply web component attributes\n if (sources.attributes) {\n const parsedAttributes = this.parseAttributes(sources.attributes);\n Object.assign(config, parsedAttributes);\n }\n \n // Apply explicit JS config (highest priority)\n if (sources.jsConfig) {\n Object.assign(config, sources.jsConfig);\n }\n \n return config;\n }\n\n /**\n * Parse web component attributes\n */\n private static parseAttributes(attributes: Record<string, string>): EditorConfigDefaults {\n const config: EditorConfigDefaults = {};\n \n for (const [key, value] of Object.entries(attributes)) {\n const camelKey = this.kebabToCamel(key);\n config[camelKey] = this.parseAttributeValue(value);\n }\n \n return config;\n }\n\n /**\n * Parse attribute value to appropriate type\n */\n private static parseAttributeValue(value: string): any {\n // Boolean\n if (value === 'true') return true;\n if (value === 'false') return false;\n \n // Number\n if (/^\\d+$/.test(value)) return parseInt(value, 10);\n if (/^\\d+\\.\\d+$/.test(value)) return parseFloat(value);\n \n // JSON\n if (value.startsWith('{') || value.startsWith('[')) {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n \n // String\n return value;\n }\n\n /**\n * Convert kebab-case to camelCase\n */\n private static kebabToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n /**\n * Validate configuration\n */\n static validate(config: EditorConfigDefaults): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n // Validate height\n if (config.height !== undefined) {\n if (typeof config.height === 'number' && config.height < 0) {\n errors.push('height must be a positive number');\n }\n }\n \n // Validate width\n if (config.width !== undefined) {\n if (typeof config.width === 'number' && config.width < 0) {\n errors.push('width must be a positive number');\n }\n }\n \n // Validate plugins\n if (config.plugins !== undefined) {\n if (!Array.isArray(config.plugins) && typeof config.plugins !== 'string') {\n errors.push('plugins must be an array or string');\n }\n }\n \n // Validate theme\n if (config.theme !== undefined) {\n if (typeof config.theme !== 'string') {\n errors.push('theme must be a string');\n }\n }\n \n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get default configuration\n */\n static getDefaults(): EditorConfigDefaults {\n return { ...this.EDITOR_DEFAULTS };\n }\n\n /**\n * Merge configurations (deep merge)\n */\n static merge(...configs: EditorConfigDefaults[]): EditorConfigDefaults {\n const result: EditorConfigDefaults = {};\n \n for (const config of configs) {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined && value !== null) {\n if (typeof value === 'object' && !Array.isArray(value) && result[key]) {\n // Deep merge objects\n result[key] = this.merge(result[key], value);\n } else {\n result[key] = value;\n }\n }\n }\n }\n \n return result;\n }\n}\n","/**\n * RichTextEditor Web Component\n * TinyMCE-style declarative API for framework-agnostic usage\n */\n\nimport { EditorEngine } from '../core/EditorEngine';\nimport { ToolbarRenderer } from '../ui/ToolbarRenderer';\nimport { FloatingToolbar } from '../ui/FloatingToolbar';\nimport { StatusBar } from '../ui/StatusBar';\nimport { getCursorPosition, countLines, calculateTextStats, getSelectionInfo } from '../utils/statusBarUtils';\nimport { ConfigResolver, EditorConfigDefaults } from '../config/ConfigResolver';\nimport { PluginLoader } from '../config/PluginLoader';\nimport { Plugin } from '../plugins/Plugin';\n\n// Import styles\nimport styles from './styles.css?inline';\n\n// Global plugin registry for the web component\n// Will be set by standalone.ts before custom element definition\nlet globalPluginRegistry: PluginLoader;\n\n/**\n * Inject styles into document head if not already present\n */\nfunction injectStyles(): void {\n const styleId = 'editora-webcomponent-styles';\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = styles;\n document.head.appendChild(styleElement);\n }\n}\n\n/**\n * Get or create the global plugin registry\n */\nfunction getGlobalRegistry(): PluginLoader {\n if (!globalPluginRegistry) {\n // Check if it was set externally (by standalone.ts)\n const externalRegistry = (RichTextEditorElement as any).__globalPluginLoader;\n if (externalRegistry) {\n globalPluginRegistry = externalRegistry;\n } else {\n // Fallback: create new registry\n globalPluginRegistry = new PluginLoader();\n }\n }\n return globalPluginRegistry;\n}\n\n/**\n * Initialize web component with plugin factories\n * This should be called once to register all available plugins\n */\nexport function initWebComponent(plugins: Record<string, () => Plugin>): void {\n const registry = getGlobalRegistry();\n Object.entries(plugins).forEach(([name, factory]) => {\n registry.register(name, factory);\n });\n}\n\nexport class RichTextEditorElement extends HTMLElement {\n private engine?: EditorEngine;\n private toolbar?: ToolbarRenderer;\n private floatingToolbar?: FloatingToolbar;\n private statusBar?: StatusBar;\n private pluginLoader: PluginLoader;\n private config: EditorConfigDefaults = {};\n private contentElement?: HTMLElement;\n private toolbarElement?: HTMLElement;\n private statusBarElement?: HTMLElement;\n private jsConfig?: EditorConfigDefaults;\n private isInitialized = false;\n\n // Observed attributes for reactive updates\n static get observedAttributes(): string[] {\n return [\n 'height',\n 'width',\n 'menubar',\n 'plugins',\n 'toolbar',\n 'toolbar-items',\n 'readonly',\n 'disabled',\n 'theme',\n 'placeholder',\n 'autofocus',\n 'language',\n 'spellcheck',\n 'statusbar',\n ];\n }\n\n constructor() {\n super();\n \n // Inject styles into document head\n injectStyles();\n\n // Capture initial content before any processing\n if (!this.hasAttribute('data-initial-content')) {\n const content = this.innerHTML.trim();\n if (content) {\n this.setAttribute('data-initial-content', content);\n }\n }\n }\n\n /**\n * Called when element is added to DOM\n */\n connectedCallback(): void {\n // Resolve configuration\n this.config = this.resolveConfig();\n \n // Wait for plugin loader to be available, then initialize\n this.waitForPluginLoader().then(() => {\n // Defer initialization to ensure DOM is fully ready\n setTimeout(async () => {\n await this.initialize();\n }, 0);\n });\n }\n\n /**\n * Wait for the global plugin loader to be available\n */\n private async waitForPluginLoader(): Promise<void> {\n // If already available, return immediately\n if ((RichTextEditorElement as any).__globalPluginLoader) {\n this.pluginLoader = (RichTextEditorElement as any).__globalPluginLoader;\n return;\n }\n \n // Wait for it to become available\n return new Promise((resolve) => {\n const checkLoader = () => {\n if ((RichTextEditorElement as any).__globalPluginLoader) {\n this.pluginLoader = (RichTextEditorElement as any).__globalPluginLoader;\n resolve();\n } else {\n // Check again in next tick\n setTimeout(checkLoader, 0);\n }\n };\n checkLoader();\n });\n }\n\n /**\n * Called when element is removed from DOM\n */\n disconnectedCallback(): void {\n this.destroy();\n }\n\n /**\n * Called when an observed attribute changes\n */\n attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n if (oldValue === newValue) return;\n \n // Update config and reinitialize affected parts\n this.config = this.resolveConfig();\n this.handleAttributeChange(name, newValue);\n }\n\n /**\n * Set configuration via JavaScript API\n */\n async setConfig(config: EditorConfigDefaults): Promise<void> {\n this.jsConfig = config;\n this.config = this.resolveConfig();\n \n // Reinitialize if already connected\n if (this.isConnected) {\n this.destroy();\n await this.waitForPluginLoader();\n await this.initialize();\n }\n }\n\n /**\n * Initialize the editor\n */\n private async initialize(): Promise<void> {\n // Prevent re-initialization if already has toolbar\n if (this.querySelector('.editora-toolbar')) {\n return;\n }\n \n // Prevent re-initialization\n if (this.isInitialized) return;\n \n // Mark this element as an editor container for multi-instance support\n this.setAttribute('data-editora-editor', 'true');\n \n // Config is already resolved in connectedCallback\n \n // Apply dimensions\n if (this.config.height) {\n this.style.height = typeof this.config.height === 'number'\n ? `${this.config.height}px`\n : this.config.height;\n }\n \n if (this.config.width) {\n this.style.width = typeof this.config.width === 'number'\n ? `${this.config.width}px`\n : this.config.width;\n }\n \n // Add base class\n this.classList.add('editora-editor');\n \n if (this.config.theme) {\n this.classList.add(`editora-theme-${this.config.theme}`);\n }\n \n // Load plugins\n const plugins = await this.loadPlugins();\n \n // Initialize plugins (call init hooks)\n plugins.forEach(plugin => {\n if (plugin.init && typeof plugin.init === 'function') {\n try {\n // Pass the web component element as context for plugins that need it\n plugin.init({ editorElement: this });\n } catch (error) {\n console.error(`[RichTextEditor] Error initializing plugin ${plugin.name}:`, error);\n }\n }\n });\n \n // Get initial content before clearing innerHTML\n const initialContent = this.getAttribute('data-initial-content') || '';\n \n // Create editor engine\n this.engine = new EditorEngine({\n content: initialContent,\n plugins,\n readonly: this.config.readonly,\n });\n \n // Create UI elements\n this.createUI(plugins, initialContent);\n \n // Setup event listeners\n this.setupEventListeners();\n \n // Mark as initialized\n this.isInitialized = true;\n \n // Emit ready event\n this.dispatchEvent(new CustomEvent('editor-ready', {\n detail: { api: this.getAPI() },\n bubbles: true,\n }));\n }\n\n /**\n * Get initial content from slot or attribute\n */\n private getInitialContent(): string {\n // Check for content attribute first\n if (this.config.content) {\n return this.config.content;\n }\n \n // Check for slot\n const slot = this.querySelector('[slot]');\n if (slot) {\n return slot.innerHTML;\n }\n \n // Check for direct child content\n if (this.hasChildNodes()) {\n const content = Array.from(this.childNodes).map(n => {\n if (n.nodeType === Node.TEXT_NODE) {\n return n.textContent;\n } else if (n.nodeType === Node.ELEMENT_NODE) {\n return (n as Element).outerHTML;\n }\n return '';\n }).join('');\n return content.trim();\n }\n \n return '';\n }\n\n /**\n * Load plugins based on configuration\n */\n private async loadPlugins(): Promise<Plugin[]> {\n // Ensure plugin loader is available\n if (!this.pluginLoader) {\n await this.waitForPluginLoader();\n }\n \n const plugins: Plugin[] = [];\n \n // Check if plugins are explicitly configured (non-empty array or string)\n const hasPluginConfig = this.config.plugins && (\n (typeof this.config.plugins === 'string' && this.config.plugins.length > 0) ||\n (Array.isArray(this.config.plugins) && this.config.plugins.length > 0)\n );\n \n if (hasPluginConfig) {\n if (typeof this.config.plugins === 'string') {\n // Parse plugin string\n const loadedPlugins = await this.pluginLoader.parsePluginString(this.config.plugins);\n plugins.push(...loadedPlugins);\n } else if (Array.isArray(this.config.plugins)) {\n // Already plugin instances or names\n for (const p of this.config.plugins) {\n if (typeof p === 'string') {\n const plugin = await this.pluginLoader.load(p);\n if (plugin) plugins.push(plugin);\n } else {\n plugins.push(p as Plugin);\n }\n }\n }\n } else {\n // No plugins specified - load all registered plugins\n const registeredNames = this.pluginLoader.getRegisteredPluginNames();\n const loadedPlugins = await this.pluginLoader.loadMultiple(registeredNames);\n plugins.push(...loadedPlugins);\n }\n return plugins;\n }\n\n /**\n * Create UI elements\n */\n private createUI(plugins: Plugin[], initialContent: string): void {\n // Preserve slot elements and initial content before clearing\n const toolbarSlot = this.querySelector('[slot=\"toolbar\"]');\n const statusBarSlot = this.querySelector('[slot=\"statusbar\"]');\n \n // Clear existing content\n this.innerHTML = '';\n \n // Restore or create toolbar\n if (this.config.toolbar !== false && !toolbarSlot) {\n // Create default toolbar\n this.toolbarElement = document.createElement('div');\n this.toolbarElement.className = 'editora-toolbar-container';\n this.appendChild(this.toolbarElement);\n \n // Support both toolbar and toolbarItems attributes\n const toolbarItems = (this.config as any).toolbarItems || this.config.toolbar;\n \n this.toolbar = new ToolbarRenderer(\n {\n items: typeof toolbarItems === 'string' ? toolbarItems : undefined,\n sticky: this.config.toolbar && typeof this.config.toolbar === 'object'\n ? (this.config.toolbar as any).sticky\n : false,\n position: 'top',\n },\n plugins,\n this.pluginLoader // Pass plugin loader to get all registered plugins\n );\n \n this.toolbar.setCommandHandler((command, value) => {\n // Ensure editor has focus and a valid selection for multi-instance support\n if (this.contentElement) {\n // Focus the editor\n this.contentElement.focus();\n \n // Ensure there's a selection in this editor instance\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0 || !this.contentElement.contains(selection.anchorNode)) {\n // Create a selection at the end of the content\n const range = document.createRange();\n const lastChild = this.contentElement.lastChild || this.contentElement;\n \n if (lastChild.nodeType === Node.TEXT_NODE) {\n range.setStart(lastChild, lastChild.textContent?.length || 0);\n } else if (lastChild.nodeType === Node.ELEMENT_NODE) {\n range.selectNodeContents(lastChild);\n range.collapse(false); // Collapse to end\n } else {\n range.setStart(this.contentElement, 0);\n }\n \n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n \n // Try to find the command in loaded plugins first (for native commands)\n \n const plugin = plugins.find(p => p.commands && p.commands[command]);\n if (plugin && plugin.commands) {\n const commandFn = plugin.commands[command];\n if (typeof commandFn === 'function') {\n // Call native command directly\n try {\n // Pass editor element for fullscreen command\n if (command === 'toggleFullscreen') {\n const result = commandFn(this);\n return result;\n } else {\n const result = commandFn(value);\n return result;\n }\n } catch (error) {\n console.error(`[RichTextEditor] Error executing native command ${command}:`, error);\n return false;\n }\n }\n }\n // Fallback to engine command (ProseMirror-style)\n return this.engine?.execCommand(command, value) || false;\n });\n \n this.toolbar.render(this.toolbarElement);\n } else if (toolbarSlot) {\n // Use custom toolbar from slot\n this.appendChild(toolbarSlot);\n }\n \n // Create content area\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'editora-content rte-content'; // Add rte-content class for plugin helpers\n this.contentElement.contentEditable = this.config.readonly ? 'false' : 'true';\n this.contentElement.setAttribute('role', 'textbox');\n this.contentElement.setAttribute('aria-multiline', 'true');\n \n if (this.config.placeholder) {\n this.contentElement.setAttribute('data-placeholder', this.config.placeholder);\n }\n \n // Set default paragraph separator to <p> for consistency with React\n try {\n document.execCommand('defaultParagraphSeparator', false, 'p');\n } catch (e) {\n // Fallback: some browsers may not support this\n console.warn('defaultParagraphSeparator not supported:', e);\n }\n \n // Set initial content and ensure it's wrapped in <p> tags\n if (initialContent) {\n // Check if content is already wrapped in block elements\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = initialContent.trim();\n \n // If content has no block-level elements, wrap it in a <p> tag\n const hasBlockElements = Array.from(tempDiv.childNodes).some(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const tagName = (node as Element).tagName;\n return ['P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'UL', 'OL', 'BLOCKQUOTE', 'PRE'].includes(tagName);\n }\n return false;\n });\n \n if (!hasBlockElements && initialContent.trim()) {\n this.contentElement.innerHTML = `<p>${initialContent.trim()}</p>`;\n } else {\n this.contentElement.innerHTML = initialContent;\n }\n } else {\n // Initialize with an empty paragraph for proper structure, unless we have a placeholder\n if (this.config.placeholder) {\n // Leave empty so placeholder shows\n this.contentElement.innerHTML = '';\n } else {\n this.contentElement.innerHTML = '<p><br></p>';\n }\n }\n \n this.appendChild(this.contentElement);\n \n // Floating toolbar\n if (this.config.toolbar && typeof this.config.toolbar === 'object' && (this.config.toolbar as any).floating) {\n this.floatingToolbar = new FloatingToolbar({ enabled: true });\n this.floatingToolbar.create(this);\n }\n \n // Status bar - restore custom slot if exists\n if (statusBarSlot) {\n this.appendChild(statusBarSlot);\n } else {\n // Create default status bar if configured\n if (this.config.statusbar) {\n this.statusBarElement = document.createElement('div');\n this.statusBarElement.className = 'editora-statusbar-container';\n this.appendChild(this.statusBarElement);\n \n this.statusBar = new StatusBar({ position: 'bottom' });\n this.statusBar.create(this.statusBarElement);\n }\n }\n \n // Auto-focus if configured\n if (this.config.autofocus) {\n setTimeout(() => this.contentElement?.focus(), 0);\n }\n }\n\n /**\n * Setup event listeners\n */\n private setupEventListeners(): void {\n if (!this.contentElement || !this.engine) return;\n \n // Content change\n this.contentElement.addEventListener('input', () => {\n const html = this.contentElement!.innerHTML;\n \n this.dispatchEvent(new CustomEvent('content-change', {\n detail: { html },\n bubbles: true,\n }));\n \n // Update status bar\n this.updateStatusBar();\n });\n \n // Focus/blur\n this.contentElement.addEventListener('focus', () => {\n this.dispatchEvent(new Event('editor-focus', { bubbles: true }));\n });\n \n this.contentElement.addEventListener('blur', () => {\n this.dispatchEvent(new Event('editor-blur', { bubbles: true }));\n });\n \n // Selection change for floating toolbar and status bar\n const updateSelectionInfo = () => {\n this.updateFloatingToolbar();\n this.updateStatusBar();\n };\n\n document.addEventListener('selectionchange', updateSelectionInfo);\n }\n\n /**\n * Update floating toolbar position\n */\n private updateFloatingToolbar(): void {\n if (!this.floatingToolbar) return;\n \n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n this.floatingToolbar.hide();\n return;\n }\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n this.floatingToolbar.hide();\n return;\n }\n \n const rect = range.getBoundingClientRect();\n this.floatingToolbar.show(rect.left, rect.top - 40);\n }\n\n /**\n * Update status bar with selection and cursor information\n */\n /**\n * Update status bar with current content and cursor information\n */\n private updateStatusBar(): void {\n if (!this.statusBar || !this.contentElement) return;\n\n const text = this.contentElement.textContent || '';\n const { words, chars } = calculateTextStats(text);\n const lineCount = countLines(this.contentElement);\n\n const selection = window.getSelection();\n let cursorPosition, selectionInfo;\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n cursorPosition = getCursorPosition(this.contentElement, range);\n\n if (!range.collapsed) {\n selectionInfo = getSelectionInfo(range, cursorPosition);\n cursorPosition = undefined; // Don't show cursor position when text is selected\n }\n }\n\n this.statusBar.update({\n wordCount: words,\n charCount: chars,\n lineCount,\n cursorPosition,\n selectionInfo\n });\n }\n\n /**\n * Handle attribute changes\n */\n private handleAttributeChange(name: string, value: string): void {\n switch (name) {\n case 'readonly':\n if (this.contentElement) {\n this.contentElement.contentEditable = value === 'true' ? 'false' : 'true';\n }\n if (this.engine) {\n this.engine.setReadonly(value === 'true');\n }\n break;\n \n case 'theme':\n // Remove old theme classes\n this.classList.forEach(cls => {\n if (cls.startsWith('editora-theme-')) {\n this.classList.remove(cls);\n }\n });\n // Add new theme class\n if (value) {\n this.classList.add(`editora-theme-${value}`);\n }\n break;\n \n case 'placeholder':\n if (this.contentElement) {\n this.contentElement.setAttribute('data-placeholder', value);\n }\n break;\n \n case 'toolbar':\n case 'plugins':\n // These require re-initialization\n if (this.isConnected) {\n this.destroy();\n this.waitForPluginLoader().then(() => {\n this.initialize().catch(error => {\n console.error('[RichTextEditor] Error during attribute change re-initialization:', error);\n });\n });\n }\n break;\n }\n }\n\n /**\n * Resolve configuration from all sources\n */\n private resolveConfig(): EditorConfigDefaults {\n const attributes: Record<string, string> = {};\n \n // Collect all attributes\n for (let i = 0; i < this.attributes.length; i++) {\n const attr = this.attributes[i];\n attributes[attr.name] = attr.value;\n }\n \n return ConfigResolver.resolve({\n jsConfig: this.jsConfig,\n attributes,\n });\n }\n\n /**\n * Get public API\n */\n getAPI(): EditorAPI {\n return {\n getContent: () => {\n return this.contentElement?.innerHTML || '';\n },\n \n setContent: (html: string) => {\n if (this.contentElement) {\n this.contentElement.innerHTML = html;\n }\n },\n \n execCommand: (name: string, value?: any) => {\n return this.engine?.execCommand(name, value) || false;\n },\n \n focus: () => {\n this.contentElement?.focus();\n },\n \n blur: () => {\n this.contentElement?.blur();\n },\n \n destroy: () => {\n this.destroy();\n },\n \n on: (event: string, handler: (...args: any[]) => void) => {\n this.addEventListener(event, handler as EventListener);\n return () => this.removeEventListener(event, handler as EventListener);\n },\n \n getConfig: () => {\n return { ...this.config };\n },\n \n setReadonly: (readonly: boolean) => {\n this.setAttribute('readonly', readonly.toString());\n },\n };\n }\n\n /**\n * Destroy the editor\n */\n private destroy(): void {\n this.engine?.destroy();\n this.toolbar?.destroy();\n this.floatingToolbar?.destroy();\n this.statusBar?.destroy();\n \n this.innerHTML = '';\n this.isInitialized = false;\n \n this.dispatchEvent(new Event('editor-destroy', { bubbles: true }));\n }\n\n // Public API methods\n \n public getContent(): string {\n return this.contentElement?.innerHTML || '';\n }\n\n public setContent(html: string): void {\n if (this.contentElement) {\n this.contentElement.innerHTML = html;\n }\n }\n\n public execCommand(name: string, value?: any): boolean {\n return this.engine?.execCommand(name, value) || false;\n }\n\n public focus(): void {\n this.contentElement?.focus();\n }\n\n public blur(): void {\n this.contentElement?.blur();\n }\n}\n\n/**\n * Editor API interface\n */\nexport interface EditorAPI {\n getContent(): string;\n setContent(html: string): void;\n execCommand(name: string, value?: any): boolean;\n focus(): void;\n blur(): void;\n destroy(): void;\n on(event: string, handler: (...args: any[]) => void): () => void;\n getConfig(): EditorConfigDefaults;\n setReadonly(readonly: boolean): void;\n}\n\n// Note: Custom element registration moved to standalone.ts\n// to ensure plugins are registered before element instances are created\n","/**\n * Core Web Component Bundle - Minimal\n * Entry point for browser usage with only essential plugins\n *\n * Includes only core editing plugins for smaller bundle size\n */\n\n// Import all styles for web components\nimport './index.css';\n\nimport { PluginLoader } from '../config/PluginLoader';\n\n// Import RichTextEditor FIRST\nimport { RichTextEditorElement } from './RichTextEditor';\n\n// Create global plugin loader instance\nconst globalPluginLoader = new PluginLoader();\n\n// Set it on the class IMMEDIATELY before doing anything else\n(RichTextEditorElement as any).__globalPluginLoader = globalPluginLoader;\n\n/**\n * Core plugin registry - only essential plugins\n */\nconst pluginRegistry: Record<string, () => Promise<any>> = {\n // Core editing plugins (always loaded)\n 'bold': () => import(\"../../../plugins/bold/src/BoldPlugin.native\").then(m => m.BoldPlugin()),\n 'italic': () => import(\"../../../plugins/italic/src/ItalicPlugin.native\").then(m => m.ItalicPlugin()),\n 'underline': () => import(\"../../../plugins/underline/src/UnderlinePlugin.native\").then(m => m.UnderlinePlugin()),\n 'strikethrough': () => import(\"../../../plugins/strikethrough/src/StrikethroughPlugin.native\").then(m => m.StrikethroughPlugin()),\n 'clearFormatting': () => import(\"../../../plugins/clear-formatting/src/ClearFormattingPlugin.native\").then(m => m.ClearFormattingPlugin()),\n 'heading': () => import(\"../../../plugins/heading/src/HeadingPlugin.native\").then(m => m.HeadingPlugin()),\n 'blockquote': () => import(\"../../../plugins/blockquote/src/BlockquotePlugin.native\").then(m => m.BlockquotePlugin()),\n 'code': () => import(\"../../../plugins/code/src/CodePlugin.native\").then(m => m.CodePlugin()),\n 'list': () => import(\"../../../plugins/list/src/ListPlugin.native\").then(m => m.ListPlugin()),\n 'history': () => import(\"../../../plugins/history/src/HistoryPlugin.native\").then(m => m.HistoryPlugin()),\n};\n\n/**\n * Initialize web component with core plugins only\n */\nexport async function initWebComponent() {\n // Register core plugins\n Object.entries(pluginRegistry).forEach(([name, loader]) => {\n globalPluginLoader.register(name, loader);\n });\n\n return globalPluginLoader;\n}\n\n// Auto-initialize when script loads\nif (typeof window !== 'undefined') {\n // Initialize plugins first (async)\n initWebComponent().then(pluginLoader => {\n // Attach plugin loader to the element class\n (RichTextEditorElement as any).__globalPluginLoader = pluginLoader;\n\n // Register custom element AFTER plugins are loaded\n if (!customElements.get('editora-editor')) {\n customElements.define('editora-editor', RichTextEditorElement);\n }\n\n // Capture initial content for existing elements before upgrading\n const existingElements = document.querySelectorAll('editora-editor:not([data-initial-content])');\n const contents: string[] = [];\n existingElements.forEach((el) => {\n const content = el.innerHTML.trim();\n if (content) {\n contents.push(content);\n el.setAttribute('data-initial-content', content);\n el.innerHTML = '';\n }\n });\n\n // Upgrade existing elements\n existingElements.forEach((el, index) => {\n // Force upgrade\n if (el instanceof RichTextEditorElement) {\n // Element is already upgraded, just initialize if needed\n if (!el.isInitialized && contents[index]) {\n el.setAttribute('content', contents[index]);\n }\n }\n });\n });\n}","import { Plugin } from '@editora/core';\n\n/**\n * Bold Plugin - Framework Agnostic\n * \n * Adds bold formatting support with native command implementation.\n * No React dependency required.\n */\nexport const BoldPlugin = (): Plugin => ({\n name: \"bold\",\n\n // Schema definition for bold mark\n marks: {\n bold: {\n parseDOM: [\n { tag: \"strong\" },\n { tag: \"b\" },\n {\n style: \"font-weight\",\n getAttrs: (value: string | HTMLElement) => {\n const weight =\n typeof value === \"string\"\n ? value\n : (value as HTMLElement).style.fontWeight;\n return /^(bold(er)?|[5-9]\\d{2,})$/.test(weight) && null;\n },\n },\n ],\n toDOM: () => [\"strong\", 0],\n },\n },\n\n // Toolbar button configuration\n toolbar: [\n {\n label: \"Bold\",\n command: \"toggleBold\",\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M7.8 19c-.3 0-.5 0-.6-.2l-.2-.5V5.7c0-.2 0-.4.2-.5l.6-.2h5c1.5 0 2.7.3 3.5 1 .7.6 1.1 1.4 1.1 2.5a3 3 0 0 1-.6 1.9c-.4.6-1 1-1.6 1.2.4.1.9.3 1.3.6s.8.7 1 1.2c.4.4.5 1 .5 1.6 0 1.3-.4 2.3-1.3 3-.8.7-2.1 1-3.8 1H7.8Zm5-8.3c.6 0 1.2-.1 1.6-.5.4-.3.6-.7.6-1.3 0-1.1-.8-1.7-2.3-1.7H9.3v3.5h3.4Zm.5 6c.7 0 1.3-.1 1.7-.4.4-.4.6-.9.6-1.5s-.2-1-.7-1.4c-.4-.3-1-.4-2-.4H9.4v3.8h4Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: \"Mod-b\",\n },\n ],\n\n // Native command implementations\n commands: {\n /**\n * Toggle bold formatting on current selection\n */\n toggleBold: () => {\n // Use document.execCommand for now\n // In production, this would manipulate EditorState directly\n document.execCommand(\"bold\", false);\n return true;\n },\n },\n\n // Keyboard shortcuts\n keymap: {\n \"Mod-b\": \"toggleBold\",\n \"Mod-B\": \"toggleBold\",\n },\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * Italic Plugin - Native Implementation\n * Author: Ajay Kumar <ajaykr089@gmail.com>\n * \n * Provides italic text formatting with:\n * - Semantic <em> tag output\n * - Support for <i>, <em>, and inline font-style\n * - Keyboard shortcut (Cmd/Ctrl+I)\n * - Global command registration\n */\n\n/**\n * Toggle italic formatting on current selection\n */\nexport const toggleItalic = (): boolean => {\n document.execCommand('italic', false);\n return true;\n};\n\n/**\n * Register commands globally\n */\nconst registerCommand = (command: string, handler: () => void): void => {\n if (typeof window !== 'undefined') {\n (window as any).registerEditorCommand?.(command, handler);\n }\n};\n\n/**\n * Initialize global command registration\n */\nconst initializeCommands = (): void => {\n registerCommand('toggleItalic', toggleItalic);\n};\n\n// Initialize on load\nif (typeof window !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeCommands);\n } else {\n initializeCommands();\n }\n}\n\nexport const ItalicPlugin = (): Plugin => ({\n name: 'italic',\n \n marks: {\n italic: {\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n {\n style: 'font-style=italic'\n }\n ],\n toDOM: () => ['em', 0]\n }\n },\n \n toolbar: [\n {\n label: 'Italic',\n command: 'toggleItalic',\n type: 'button',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M16.7 4.7l-.1.9h-.3c-.6 0-1 0-1.4.3-.3.3-.4.6-.5 1.1l-2.1 9.8v.6c0 .5.4.8 1.4.8h.2l-.2.8H8l.2-.8h.2c1.1 0 1.8-.5 2-1.5l2-9.8.1-.5c0-.6-.4-.8-1.4-.8h-.3l.2-.9h5.8Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: 'Mod-i'\n }\n ],\n \n commands: {\n toggleItalic\n },\n \n keymap: {\n 'Mod-i': 'toggleItalic',\n 'Mod-I': 'toggleItalic'\n }\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * Underline Plugin - Native Implementation\n * \n * Adds underline formatting support with native command implementation.\n * Matches React version UI/UX exactly.\n */\nexport const UnderlinePlugin = (): Plugin => ({\n name: 'underline',\n \n // Schema definition for underline mark\n marks: {\n underline: {\n parseDOM: [{ tag: 'u' }],\n toDOM: () => ['u', {}, 0]\n }\n },\n \n // Toolbar button configuration (matching React version exactly)\n toolbar: [\n {\n label: 'Underline',\n command: 'toggleUnderline',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M16 5c.6 0 1 .4 1 1v7c0 2.8-2.2 5-5 5s-5-2.2-5-5V6c0-.6.4-1 1-1s1 .4 1 1v7c0 1.7 1.3 3 3 3s3-1.3 3-3V6c0-.6.4-1 1-1ZM4 17h16c.6 0 1 .4 1 1s-.4 1-1 1H4a1 1 0 1 1 0-2Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: 'Mod-u'\n }\n ],\n \n // Native command implementations\n commands: {\n /**\n * Toggle underline formatting on current selection\n */\n toggleUnderline: () => {\n document.execCommand('underline', false);\n return true;\n }\n },\n \n // Keyboard shortcuts\n keymap: {\n 'Mod-u': 'toggleUnderline',\n 'Mod-U': 'toggleUnderline'\n }\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * Strikethrough Plugin - Framework Agnostic\n * \n * Adds strikethrough formatting support with native command implementation.\n * No React dependency required.\n */\nexport const StrikethroughPlugin = (): Plugin => ({\n name: 'strikethrough',\n \n // Schema definition for strikethrough mark\n marks: {\n strikethrough: {\n parseDOM: [\n { tag: 's' },\n { tag: 'strike' },\n { tag: 'del' },\n {\n style: 'text-decoration',\n getAttrs: (value: string | HTMLElement) => {\n const decoration = typeof value === 'string' \n ? value \n : (value as HTMLElement).style.textDecoration;\n return decoration === 'line-through' && null;\n }\n }\n ],\n toDOM: () => ['s', 0]\n }\n },\n \n // Toolbar button configuration\n toolbar: [\n {\n label: 'Strikethrough',\n command: 'toggleStrikethrough',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><g fill-rule=\"evenodd\"><path d=\"M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 0 1 7 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1Z\"></path><path d=\"M5 11h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Z\" fill-rule=\"nonzero\"></path></g></svg>',\n shortcut: 'Mod-Shift-x'\n }\n ],\n \n // Native command implementations\n commands: {\n /**\n * Toggle strikethrough formatting on current selection\n */\n toggleStrikethrough: () => {\n document.execCommand('strikeThrough', false);\n return true;\n }\n },\n \n // Keyboard shortcuts\n keymap: {\n 'Mod-Shift-x': 'toggleStrikethrough',\n 'Mod-Shift-X': 'toggleStrikethrough'\n }\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * Clear Formatting Plugin - Framework Agnostic\n * \n * Removes all formatting from selected text with native command implementation.\n * No React dependency required.\n */\nexport const ClearFormattingPlugin = (): Plugin => ({\n name: \"clearFormatting\",\n\n // Toolbar button configuration\n toolbar: [\n {\n label: \"Clear Formatting\",\n command: \"clearFormatting\",\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M13.2 6a1 1 0 0 1 0 .2l-2.6 10a1 1 0 0 1-1 .8h-.2a.8.8 0 0 1-.8-1l2.6-10H8a1 1 0 1 1 0-2h9a1 1 0 0 1 0 2h-3.8ZM5 18h7a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Zm13 1.5L16.5 18 15 19.5a.7.7 0 0 1-1-1l1.5-1.5-1.5-1.5a.7.7 0 0 1 1-1l1.5 1.5 1.5-1.5a.7.7 0 0 1 1 1L17.5 17l1.5 1.5a.7.7 0 0 1-1 1Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: \"Mod-\\\\\",\n },\n ],\n\n // Native command implementations\n commands: {\n /**\n * Remove all formatting from current selection\n */\n clearFormatting: () => {\n document.execCommand(\"removeFormat\", false);\n return true;\n },\n },\n\n // Keyboard shortcuts\n keymap: {\n \"Mod-\\\\\": \"clearFormatting\",\n },\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * Heading Plugin - Framework Agnostic\n * \n * Adds heading support (H1-H6) with native command implementation.\n * No React dependency required.\n */\nexport const HeadingPlugin = (): Plugin => {\n const setBlockTypeImpl = (level: string) => {\n try {\n document.execCommand('formatBlock', false, level);\n return true;\n } catch (error) {\n console.error(`Failed to set block type to ${level}:`, error);\n return false;\n }\n };\n\n return {\n name: 'heading',\n \n // Toolbar button configuration with dropdown\n toolbar: [\n {\n label: 'Heading',\n command: 'setBlockType',\n type: 'dropdown',\n options: [\n { value: 'p', label: 'Paragraph' },\n { value: 'h1', label: 'Heading 1' },\n { value: 'h2', label: 'Heading 2' },\n { value: 'h3', label: 'Heading 3' },\n { value: 'h4', label: 'Heading 4' },\n { value: 'h5', label: 'Heading 5' },\n { value: 'h6', label: 'Heading 6' }\n ],\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M16.1 8.6 14.2 4l-1.4.5 2.8 7.4c.1.4.5.6.9.6h.1c.4-.1.6-.5.6-.9l1.8-4.8-1.4-.5-1.5 2.3ZM4 11.5h6V10H4v1.5ZM18.5 3v1L17 7l.9.9L20.7 3h-2.2ZM5.5 12h1v7h1v-7h1v-.5h-3V12Zm4 0h1v7h1v-7h1v-.5h-3V12Zm10 1.5a2 2 0 0 0-2-2h-1v7.5h1v-2.7h1a2 2 0 0 0 2-2v-.8Zm-2 1.3h-1v-2.3h1a.8.8 0 1 1 0 1.6v.7Z\" fill-rule=\"evenodd\"></path></svg>'\n }\n ],\n \n // Native command implementations\n commands: {\n /**\n * Set block type to specific heading level or paragraph\n */\n setBlockType: (level?: string) => {\n if (!level) return false;\n return setBlockTypeImpl(level);\n },\n \n /**\n * Set heading level 1\n */\n setHeading1: () => setBlockTypeImpl('h1'),\n \n /**\n * Set heading level 2\n */\n setHeading2: () => setBlockTypeImpl('h2'),\n \n /**\n * Set heading level 3\n */\n setHeading3: () => setBlockTypeImpl('h3'),\n \n /**\n * Set to paragraph\n */\n setParagraph: () => setBlockTypeImpl('p')\n },\n \n // Keyboard shortcuts\n keymap: {\n 'Mod-Alt-1': 'setHeading1',\n 'Mod-Alt-2': 'setHeading2',\n 'Mod-Alt-3': 'setHeading3',\n 'Mod-Alt-0': 'setParagraph'\n }\n };\n};\n","import { Plugin } from '@editora/core';\n\n/**\n * Blockquote Plugin - Framework Agnostic\n * \n * Adds blockquote support with native command implementation.\n * No React dependency required.\n */\nexport const BlockquotePlugin = (): Plugin => ({\n name: \"blockquote\",\n\n // Schema definition for blockquote node\n nodes: {\n blockquote: {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{ tag: \"blockquote\" }],\n toDOM: () => [\"blockquote\", 0],\n },\n },\n\n // Toolbar button configuration\n toolbar: [\n {\n label: \"Quote\",\n command: \"toggleBlockquote\",\n icon: '<svg fill=\"#000000\" height=\"24px\" width=\"24px\" version=\"1.1\" id=\"Icons\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 32 32\" xml:space=\"preserve\"><g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g><g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g><g id=\"SVGRepo_iconCarrier\"> <g> <path d=\"M13,11c0.6,0,1-0.4,1-1s-0.4-1-1-1c-5,0-9,4-9,9c0,2.8,2.2,5,5,5s5-2.2,5-5s-2.2-5-5-5c-0.3,0-0.7,0-1,0.1 C9.3,11.8,11,11,13,11z\"></path> <path d=\"M23,13c-0.3,0-0.7,0-1,0.1c1.3-1.3,3-2.1,5-2.1c0.6,0,1-0.4,1-1s-0.4-1-1-1c-5,0-9,4-9,9c0,2.8,2.2,5,5,5s5-2.2,5-5 S25.8,13,23,13z\"></path> </g> </g></svg>',\n shortcut: \"Mod-Shift-9\",\n },\n ],\n\n // Native command implementations\n commands: {\n /**\n * Toggle blockquote formatting on current selection\n */\n toggleBlockquote: () => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n // Check if already in blockquote\n let node = selection.anchorNode;\n let isInBlockquote = false;\n\n while (node && node !== document.body) {\n if (node.nodeName === \"BLOCKQUOTE\") {\n isInBlockquote = true;\n break;\n }\n node = node.parentNode;\n }\n\n if (isInBlockquote) {\n // Remove blockquote\n document.execCommand(\"formatBlock\", false, \"p\");\n } else {\n // Add blockquote\n document.execCommand(\"formatBlock\", false, \"blockquote\");\n }\n\n return true;\n },\n },\n\n // Keyboard shortcuts\n keymap: {\n \"Mod-Shift-9\": \"toggleBlockquote\",\n },\n});\n","class m {\n constructor(e = \"\") {\n this._lines = [], this._version = 0, this.setText(e);\n }\n // Get line at index\n getLine(e) {\n return this._lines[e] || \"\";\n }\n // Get all lines\n getLines() {\n return [...this._lines];\n }\n // Get total number of lines\n getLineCount() {\n return this._lines.length;\n }\n // Get total text content\n getText() {\n return this._lines.join(`\n`);\n }\n // Set entire text content\n setText(e) {\n this._lines = e.split(`\n`), this._version++;\n }\n // Get text in a range\n getTextInRange(e) {\n if (e.start.line === e.end.line)\n return this.getLine(e.start.line).substring(e.start.column, e.end.column);\n const t = [];\n t.push(this.getLine(e.start.line).substring(e.start.column));\n for (let n = e.start.line + 1; n < e.end.line; n++)\n t.push(this.getLine(n));\n return e.end.line < this.getLineCount() && t.push(this.getLine(e.end.line).substring(0, e.end.column)), t.join(`\n`);\n }\n // Replace text in range\n replaceRange(e, t) {\n const n = this.getTextInRange(e);\n if (e.start.line === e.end.line) {\n const i = this.getLine(e.start.line), s = i.substring(0, e.start.column) + t + i.substring(e.end.column);\n this._lines[e.start.line] = s;\n } else {\n const i = this.getLine(e.start.line), s = this.getLine(e.end.line), o = i.substring(0, e.start.column) + t, h = s.substring(e.end.column), r = t.split(`\n`);\n r[0] = o + r[0], r[r.length - 1] = r[r.length - 1] + h, this._lines.splice(e.start.line, e.end.line - e.start.line + 1, ...r);\n }\n return this._version++, { range: e, text: t, oldText: n };\n }\n // Insert text at position\n insertText(e, t) {\n const n = { start: e, end: e };\n return this.replaceRange(n, t);\n }\n // Delete text in range\n deleteRange(e) {\n return this.replaceRange(e, \"\");\n }\n // Convert position to offset\n positionToOffset(e) {\n let t = 0;\n for (let n = 0; n < e.line; n++)\n t += this.getLine(n).length + 1;\n return t += e.column, t;\n }\n // Convert offset to position\n offsetToPosition(e) {\n let t = e;\n for (let n = 0; n < this.getLineCount(); n++) {\n const i = this.getLine(n).length;\n if (t <= i)\n return { line: n, column: t };\n t -= i + 1;\n }\n return {\n line: this.getLineCount() - 1,\n column: this.getLine(this.getLineCount() - 1).length\n };\n }\n // Validate position\n isValidPosition(e) {\n return !(e.line < 0 || e.line >= this.getLineCount() || e.column < 0 || e.column > this.getLine(e.line).length);\n }\n // Validate range\n isValidRange(e) {\n return this.isValidPosition(e.start) && this.isValidPosition(e.end);\n }\n // Get version for change tracking\n getVersion() {\n return this._version;\n }\n // Clone the model\n clone() {\n const e = new m();\n return e._lines = [...this._lines], e._version = this._version, e;\n }\n}\nclass p {\n constructor(e) {\n this.gutterWidth = 50, this.lineHeight = 21, this.container = e, this.createDOM();\n }\n createDOM() {\n this.container.innerHTML = \"\";\n const e = document.createElement(\"div\");\n e.style.cssText = `\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n background: var(--editor-background, #1e1e1e);\n color: var(--editor-foreground, #f8f9fa);\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 14px;\n line-height: ${this.lineHeight}px;\n overflow: hidden;\n `, this.lineNumbersElement = document.createElement(\"div\"), this.lineNumbersElement.style.cssText = `\n position: sticky;\n left: 0;\n top: 0;\n width: ${this.gutterWidth}px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-gutter-foreground, #858585);\n padding: 0;\n text-align: right;\n border-right: 1px solid var(--editor-gutter-border, #3e3e42);\n user-select: none;\n overflow: hidden;\n z-index: 1;\n `, this.contentElement = document.createElement(\"div\"), this.contentElement.style.cssText = `\n flex: 1;\n padding: 0;\n background: transparent;\n border: none;\n outline: none;\n white-space: pre;\n overflow-x: auto;\n overflow-y: auto;\n min-height: 400px;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: inherit;\n tab-size: 2;\n -moz-tab-size: 2;\n `, this.contentElement.contentEditable = \"true\", this.contentElement.spellcheck = !1, e.appendChild(this.lineNumbersElement), e.appendChild(this.contentElement), this.container.appendChild(e), this.updateLineNumbers(1);\n }\n // Update line numbers\n updateLineNumbers(e) {\n const t = Math.max(e, 20), n = Array.from({ length: t }, (i, s) => s + 1);\n this.lineNumbersElement.innerHTML = n.map((i) => `<div style=\"height: ${this.lineHeight}px; line-height: ${this.lineHeight}px; padding-right: 12px;\">${i}</div>`).join(\"\");\n }\n // Get content element\n getContentElement() {\n return this.contentElement;\n }\n // Get line numbers element\n getLineNumbersElement() {\n return this.lineNumbersElement;\n }\n // Get text content\n getText() {\n return this.contentElement.textContent || \"\";\n }\n // Set text content\n setText(e) {\n this.contentElement.textContent = e;\n const t = e.split(`\n`).length;\n this.updateLineNumbers(t);\n }\n // Get cursor position from DOM selection\n getCursorPosition() {\n const e = window.getSelection();\n if (!e || e.rangeCount === 0)\n return { line: 0, column: 0 };\n const t = e.getRangeAt(0), n = t.cloneRange();\n n.selectNodeContents(this.contentElement), n.setEnd(t.endContainer, t.endOffset);\n const s = n.toString().split(`\n`);\n return {\n line: s.length - 1,\n column: s[s.length - 1].length\n };\n }\n // Set cursor position\n setCursorPosition(e) {\n const n = this.getText().split(`\n`), i = Math.min(e.line, n.length - 1), s = Math.min(e.column, n[i]?.length || 0);\n let o = 0;\n for (let g = 0; g < i; g++)\n o += n[g].length + 1;\n o += s;\n const h = document.createRange(), r = window.getSelection();\n let l = 0, c = null, a = 0;\n const u = document.createTreeWalker(\n this.contentElement,\n NodeFilter.SHOW_TEXT,\n null\n );\n let f;\n for (; f = u.nextNode(); ) {\n const g = f.textContent?.length || 0;\n if (l + g >= o) {\n c = f, a = o - l;\n break;\n }\n l += g;\n }\n if (c)\n try {\n h.setStart(c, a), h.setEnd(c, a), r?.removeAllRanges(), r?.addRange(h);\n } catch (g) {\n console.warn(\"Could not set cursor position:\", g);\n }\n }\n // Get selection range\n getSelectionRange() {\n const e = window.getSelection();\n if (!e || e.rangeCount === 0 || e.isCollapsed)\n return;\n const t = e.getRangeAt(0), n = t.cloneRange();\n n.selectNodeContents(this.contentElement), n.setEnd(t.startContainer, t.startOffset);\n const s = n.toString().split(`\n`), o = t.cloneRange();\n o.selectNodeContents(this.contentElement), o.setEnd(t.endContainer, t.endOffset);\n const r = o.toString().split(`\n`);\n return {\n start: {\n line: s.length - 1,\n column: s[s.length - 1].length\n },\n end: {\n line: r.length - 1,\n column: r[r.length - 1].length\n }\n };\n }\n // Set selection range\n setSelectionRange(e) {\n this.setCursorPosition(e.start);\n }\n // Focus the editor\n focus() {\n this.contentElement.focus();\n }\n // Blur the editor\n blur() {\n this.contentElement.blur();\n }\n // Set read-only mode\n setReadOnly(e) {\n this.contentElement.contentEditable = e ? \"false\" : \"true\";\n }\n // Apply theme\n applyTheme(e) {\n Object.entries(e).forEach(([t, n]) => {\n this.container.style.setProperty(`--${t}`, n);\n });\n }\n // Scroll to position\n scrollToPosition(e) {\n const t = this.lineNumbersElement.children[e.line];\n t && t.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n }\n // Get scroll position\n getScrollTop() {\n return this.contentElement.scrollTop;\n }\n // Set scroll position\n setScrollTop(e) {\n this.contentElement.scrollTop = e, this.lineNumbersElement.scrollTop = e;\n }\n // Destroy the view\n destroy() {\n this.container && this.container.parentNode && this.container.parentNode.removeChild(this.container);\n }\n}\nclass x {\n constructor(e, t = {}) {\n this.extensions = /* @__PURE__ */ new Map(), this.commands = /* @__PURE__ */ new Map(), this.eventListeners = /* @__PURE__ */ new Map(), this.folds = [], this.currentTheme = \"default\", this.isDestroyed = !1, this.config = {\n value: \"\",\n theme: \"default\",\n readOnly: !1,\n tabSize: 2,\n lineWrapping: !1,\n lineNumbers: !0,\n ...t\n }, this.textModel = new m(this.config.value), this.view = new p(e), this.view.setText(this.textModel.getText()), this.view.setReadOnly(this.config.readOnly || !1), this.setupEventHandlers(), this.config.extensions && this.config.extensions.forEach((n) => this.addExtension(n)), this.setTheme(this.config.theme);\n }\n // Public accessors for extensions\n getTextModel() {\n return this.textModel;\n }\n getView() {\n return this.view;\n }\n getConfig() {\n return { ...this.config };\n }\n // Get keymap extension if available\n getKeymapExtension() {\n return this.extensions.get(\"keymap\");\n }\n // Setup DOM event handlers\n setupEventHandlers() {\n const e = this.view.getContentElement();\n e.addEventListener(\"input\", () => {\n const t = this.view.getText(), n = this.textModel.getText();\n t !== n && (this.textModel.setText(t), this.emit(\"change\", [{ range: this.getFullRange(), text: t, oldText: n }]), this.updateLineNumbers());\n }), e.addEventListener(\"selectionchange\", () => {\n const t = this.getCursor(), n = this.getSelection();\n this.emit(\"cursor\", t), n && this.emit(\"selection\", n);\n }), e.addEventListener(\"keydown\", (t) => {\n this.emit(\"keydown\", t);\n for (const n of this.extensions.values())\n if (n.onKeyDown && n.onKeyDown(t) === !1) {\n t.preventDefault(), t.stopPropagation();\n return;\n }\n }), e.addEventListener(\"mousedown\", (t) => {\n this.emit(\"mousedown\", t);\n for (const n of this.extensions.values())\n if (n.onMouseDown && n.onMouseDown(t) === !1) {\n t.preventDefault(), t.stopPropagation();\n return;\n }\n }), e.addEventListener(\"focus\", () => {\n this.emit(\"focus\");\n }), e.addEventListener(\"blur\", () => {\n this.emit(\"blur\");\n });\n }\n // Update line numbers display\n updateLineNumbers() {\n const e = this.textModel.getLineCount();\n this.view.updateLineNumbers(e);\n }\n // Get full range of document\n getFullRange() {\n return {\n start: { line: 0, column: 0 },\n end: {\n line: this.textModel.getLineCount() - 1,\n column: this.textModel.getLine(this.textModel.getLineCount() - 1).length\n }\n };\n }\n // Emit events to listeners\n emit(e, ...t) {\n const n = this.eventListeners.get(e);\n n && n.forEach((i) => i(...t));\n }\n // State management\n getValue() {\n return this.textModel.getText();\n }\n setValue(e) {\n this.textModel.setText(e), this.view.setText(e), this.updateLineNumbers(), this.emit(\"change\", [{ range: this.getFullRange(), text: e, oldText: this.getValue() }]);\n }\n getState() {\n return {\n text: this.getValue(),\n cursor: this.getCursor(),\n selection: this.getSelection(),\n readOnly: this.config.readOnly || !1,\n theme: this.currentTheme\n };\n }\n // Cursor & Selection\n getCursor() {\n const e = this.view.getCursorPosition();\n return {\n position: e,\n anchor: e\n // For now, cursor and anchor are the same\n };\n }\n setCursor(e) {\n this.view.setCursorPosition(e), this.emit(\"cursor\", this.getCursor());\n }\n getSelection() {\n return this.view.getSelectionRange();\n }\n setSelection(e) {\n this.view.setSelectionRange(e), this.emit(\"selection\", e);\n }\n // Configuration\n setTheme(e) {\n this.currentTheme = e;\n const t = {\n \"editor-background\": e === \"dark\" ? \"#1e1e1e\" : \"#ffffff\",\n \"editor-foreground\": e === \"dark\" ? \"#f8f9fa\" : \"#1a1a1a\",\n \"editor-gutter-background\": e === \"dark\" ? \"#252526\" : \"#f8f9fa\",\n \"editor-gutter-foreground\": e === \"dark\" ? \"#858585\" : \"#666666\",\n \"editor-gutter-border\": e === \"dark\" ? \"#3e3e42\" : \"#e1e5e9\"\n };\n this.view.applyTheme(t);\n }\n setReadOnly(e) {\n this.config.readOnly = e, this.view.setReadOnly(e);\n }\n // Extensions & Commands\n addExtension(e) {\n if (this.extensions.has(e.name))\n throw new Error(`Extension '${e.name}' already exists`);\n this.extensions.set(e.name, e), e.setup(this);\n }\n removeExtension(e) {\n const t = this.extensions.get(e);\n t && t.destroy && t.destroy(), this.extensions.delete(e);\n }\n executeCommand(e, ...t) {\n const n = this.commands.get(e);\n n ? n(this, ...t) : console.warn(`Command '${e}' not found`);\n }\n // Register a command\n registerCommand(e, t) {\n this.commands.set(e, t);\n }\n // Search & Navigation\n search(e, t = {}) {\n const n = {\n caseSensitive: !1,\n regex: !1,\n ...t\n }, i = [], s = this.getValue();\n s.split(`\n`);\n let o = n.caseSensitive ? s : s.toLowerCase(), h = n.caseSensitive ? e : e.toLowerCase();\n if (n.regex) {\n const r = new RegExp(h, n.caseSensitive ? \"g\" : \"gi\");\n let l;\n for (; (l = r.exec(o)) !== null; ) {\n const c = this.textModel.offsetToPosition(l.index), a = this.textModel.offsetToPosition(l.index + l[0].length);\n i.push({\n range: { start: c, end: a },\n match: l[0]\n });\n }\n } else {\n let r = 0, l = o.indexOf(h, r);\n for (; l !== -1; ) {\n const c = l + e.length, a = this.textModel.offsetToPosition(l), u = this.textModel.offsetToPosition(c);\n i.push({\n range: { start: a, end: u },\n match: s.substring(l, c)\n }), r = c, l = o.indexOf(h, r);\n }\n }\n return i;\n }\n replace(e, t) {\n const n = this.textModel.replaceRange(e, t);\n this.view.setText(this.getValue()), this.emit(\"change\", [n]);\n }\n replaceAll(e, t, n = {}) {\n const i = this.search(e, n);\n let s = 0;\n for (let o = i.length - 1; o >= 0; o--)\n this.replace(i[o].range, t), s++;\n return s;\n }\n // Folding (basic implementation)\n fold(e) {\n const t = {\n start: e.start,\n end: e.end,\n collapsed: !0,\n level: 0\n };\n this.folds.push(t);\n }\n unfold(e) {\n this.folds = this.folds.filter(\n (t) => !(t.start.line === e.start.line && t.end.line === e.end.line)\n );\n }\n getFolds() {\n return [...this.folds];\n }\n // Utilities\n focus() {\n this.view.focus();\n }\n blur() {\n this.view.blur();\n }\n destroy() {\n if (!this.isDestroyed) {\n this.isDestroyed = !0;\n for (const e of this.extensions.values())\n e.destroy && e.destroy();\n this.extensions.clear(), this.view.destroy(), this.commands.clear(), this.eventListeners.clear();\n }\n }\n // Events\n on(e, t) {\n this.eventListeners.has(e) || this.eventListeners.set(e, []), this.eventListeners.get(e).push(t);\n }\n off(e, t) {\n if (!this.eventListeners.has(e)) return;\n const n = this.eventListeners.get(e);\n if (t) {\n const i = n.indexOf(t);\n i !== -1 && n.splice(i, 1);\n } else\n n.length = 0;\n }\n}\nclass y {\n constructor(e) {\n this.name = \"keymap\", this.editor = null, this.keymap = {}, this.isMac = navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0, this.keymap = e || this.getDefaultKeymap();\n }\n setup(e) {\n this.editor = e, e.on(\"keydown\", (t) => this.handleKeyDown(t));\n }\n handleKeyDown(e) {\n if (!this.editor) return;\n const t = this.findMatchingBinding(e);\n if (t)\n return this.editor.executeCommand(t.command), e.preventDefault(), e.stopPropagation(), !1;\n }\n findMatchingBinding(e) {\n const { key: t, ctrlKey: n, altKey: i, shiftKey: s, metaKey: o } = e, h = t.toLowerCase(), r = this.keymap[h];\n if (!r) return null;\n for (const l of r)\n if ((l.ctrlKey === n || !l.ctrlKey && !n) && (l.altKey === i || !l.altKey && !i) && (l.shiftKey === s || !l.shiftKey && !s) && (l.metaKey === o || !l.metaKey && !o))\n return l;\n return null;\n }\n getDefaultKeymap() {\n const e = {};\n return this.addBinding(e, \"f\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"find\"), this.addBinding(e, \"h\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"replace\"), this.addBinding(e, \"f3\", {}, \"findNext\"), this.addBinding(e, \"f3\", { shiftKey: !0 }, \"findPrev\"), this.addBinding(e, \"g\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"findNext\"), this.addBinding(e, \"[\", { ctrlKey: !this.isMac, metaKey: this.isMac, shiftKey: !0 }, \"fold\"), this.addBinding(e, \"]\", { ctrlKey: !this.isMac, metaKey: this.isMac, shiftKey: !0 }, \"unfold\"), this.addBinding(e, \"s\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"save\"), this.addBinding(e, \"z\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"undo\"), this.addBinding(e, \"y\", { ctrlKey: !this.isMac, metaKey: this.isMac }, \"redo\"), this.addBinding(e, \"z\", { ctrlKey: !this.isMac, metaKey: this.isMac, shiftKey: !0 }, \"redo\"), this.addBinding(e, \"t\", { ctrlKey: !this.isMac, metaKey: this.isMac, shiftKey: !0 }, \"toggleTheme\"), e;\n }\n addBinding(e, t, n, i) {\n const s = t.toLowerCase();\n e[s] || (e[s] = []), e[s].push({\n key: s,\n command: i,\n ...n\n });\n }\n // Public API for customizing keymap\n setKeymap(e) {\n this.keymap = { ...e };\n }\n addKeyBinding(e) {\n const t = e.key.toLowerCase();\n this.keymap[t] || (this.keymap[t] = []), this.keymap[t] = this.keymap[t].filter((n) => n.command !== e.command), this.keymap[t].push({\n ...e,\n key: t\n });\n }\n removeKeyBinding(e, t) {\n const n = e.toLowerCase();\n t ? this.keymap[n] && (this.keymap[n] = this.keymap[n].filter((i) => i.command !== t), this.keymap[n].length === 0 && delete this.keymap[n]) : delete this.keymap[n];\n }\n getKeymap() {\n return { ...this.keymap };\n }\n getBindingsForCommand(e) {\n const t = [];\n for (const n in this.keymap)\n for (const i of this.keymap[n])\n i.command === e && t.push({ ...i });\n return t;\n }\n getPlatformInfo() {\n return {\n isMac: this.isMac,\n platform: navigator.platform\n };\n }\n destroy() {\n this.keymap = {}, this.editor = null;\n }\n}\nclass b {\n constructor() {\n this.name = \"line-numbers\", this.editor = null, this.lineNumbersElement = null, this.isEnabled = !0;\n }\n setup(e) {\n this.editor = e, this.createLineNumbers(), e.registerCommand(\"toggleLineNumbers\", () => {\n this.toggle();\n }), e.on(\"change\", () => {\n this.updateLineNumbers();\n }), this.updateLineNumbers();\n }\n createLineNumbers() {\n if (!this.editor) return;\n const e = this.editor.getView();\n if (!e.container) return;\n this.lineNumbersElement = document.createElement(\"div\"), this.lineNumbersElement.style.cssText = `\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 50px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-gutter-foreground, #858585);\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 14px;\n line-height: 21px;\n padding: 0;\n text-align: right;\n border-right: 1px solid var(--editor-gutter-border, #3e3e42);\n user-select: none;\n overflow: hidden;\n z-index: 1;\n pointer-events: none;\n `;\n const n = e.getContentElement();\n n && n.parentNode && (n.parentNode.insertBefore(this.lineNumbersElement, n), n.style.marginLeft = \"60px\");\n }\n updateLineNumbers() {\n if (!this.lineNumbersElement || !this.editor || !this.isEnabled) return;\n const e = this.editor.getValue().split(`\n`).length, t = Array.from({ length: Math.max(e, 20) }, (n, i) => i + 1);\n this.lineNumbersElement.innerHTML = t.map((n) => `<div style=\"height: 21px; line-height: 21px; padding-right: 12px;\">${n}</div>`).join(\"\");\n }\n toggle() {\n this.isEnabled = !this.isEnabled, this.lineNumbersElement && (this.lineNumbersElement.style.display = this.isEnabled ? \"block\" : \"none\");\n const e = this.editor.getView().getContentElement();\n e && (e.style.marginLeft = this.isEnabled ? \"60px\" : \"0\"), this.updateLineNumbers();\n }\n destroy() {\n this.lineNumbersElement && this.lineNumbersElement.parentNode && this.lineNumbersElement.parentNode.removeChild(this.lineNumbersElement), this.lineNumbersElement = null, this.editor = null;\n }\n}\nclass v {\n constructor() {\n this.name = \"theme\", this.editor = null, this.currentTheme = \"dark\";\n }\n setup(e) {\n this.editor = e, e.registerCommand(\"setTheme\", (t) => {\n this.setTheme(t);\n }), e.registerCommand(\"toggleTheme\", () => {\n this.toggleTheme();\n }), this.setTheme(this.currentTheme);\n }\n setTheme(e) {\n this.editor && (this.currentTheme = e, this.editor.setTheme(e));\n }\n toggleTheme() {\n const e = this.currentTheme === \"dark\" ? \"light\" : \"dark\";\n this.setTheme(e);\n }\n getCurrentTheme() {\n return this.currentTheme;\n }\n destroy() {\n this.editor = null;\n }\n}\nclass E {\n constructor() {\n this.name = \"read-only\", this.editor = null, this.isReadOnly = !1;\n }\n setup(e) {\n this.editor = e, e.registerCommand(\"setReadOnly\", (t) => {\n this.setReadOnly(t);\n }), e.registerCommand(\"toggleReadOnly\", () => {\n this.toggleReadOnly();\n }), e.on(\"keydown\", (t) => {\n if (t.ctrlKey && t.key === \"r\")\n return t.preventDefault(), this.toggleReadOnly(), !1;\n });\n }\n setReadOnly(e) {\n this.editor && (this.isReadOnly = e, this.editor.setReadOnly(e));\n }\n toggleReadOnly() {\n this.setReadOnly(!this.isReadOnly);\n }\n isCurrentlyReadOnly() {\n return this.isReadOnly;\n }\n destroy() {\n this.editor = null;\n }\n}\nclass w {\n constructor() {\n this.name = \"search\", this.editor = null, this.searchUI = null, this.isVisible = !1, this.currentResults = [], this.currentIndex = -1;\n }\n setup(e) {\n this.editor = e, e.registerCommand(\"find\", () => {\n this.showSearch();\n }), e.registerCommand(\"findNext\", () => {\n this.findNext();\n }), e.registerCommand(\"findPrev\", () => {\n this.findPrev();\n }), e.registerCommand(\"replace\", () => {\n this.showReplace();\n }), e.registerCommand(\"replaceAll\", (t, n) => {\n this.replaceAll(t, n);\n });\n }\n showSearch() {\n if (this.editor && (this.searchUI || this.createSearchUI(), this.isVisible = !0, this.searchUI)) {\n this.searchUI.style.display = \"block\";\n const e = this.searchUI.querySelector(\"input\");\n e && (e.focus(), e.select());\n }\n }\n showReplace() {\n this.showSearch();\n const e = this.searchUI?.querySelector(\".search-replace-input\");\n e && (e.style.display = \"block\", e.focus());\n const t = this.searchUI?.querySelector(\".search-status\");\n t && (t.textContent = \"Replace mode - Enter to replace, Shift+Enter to replace all\");\n }\n hideSearch() {\n this.isVisible = !1, this.searchUI && (this.searchUI.style.display = \"none\"), this.clearHighlights();\n }\n createSearchUI() {\n if (!this.editor) return;\n const e = document.querySelector(\".rte-source-editor-modal\");\n if (!e) return;\n this.searchUI = document.createElement(\"div\"), this.searchUI.style.cssText = `\n position: absolute;\n top: 10px;\n right: 10px;\n background: var(--editor-background, #1e1e1e);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 4px;\n padding: 8px;\n z-index: 1000;\n display: none;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n min-width: 250px;\n `, this.searchUI.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n <input type=\"text\" placeholder=\"Find...\" style=\"\n flex: 1;\n padding: 4px 8px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-foreground, #f8f9fa);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 3px;\n font-size: 12px;\n outline: none;\n \" />\n <button class=\"search-prev\" style=\"\n padding: 2px 6px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-gutter-foreground, #858585);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 3px;\n cursor: pointer;\n font-size: 11px;\n \">↑</button>\n <button class=\"search-next\" style=\"\n padding: 2px 6px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-gutter-foreground, #858585);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 3px;\n cursor: pointer;\n font-size: 11px;\n \">↓</button>\n <button class=\"search-close\" style=\"\n padding: 2px 6px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-gutter-foreground, #858585);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 3px;\n cursor: pointer;\n font-size: 11px;\n \">×</button>\n </div>\n <div class=\"search-status\" style=\"\n font-size: 11px;\n color: var(--editor-gutter-foreground, #858585);\n text-align: center;\n \"></div>\n <input type=\"text\" class=\"search-replace-input\" placeholder=\"Replace with...\" style=\"\n width: 100%;\n padding: 4px 8px;\n background: var(--editor-gutter-background, #252526);\n color: var(--editor-foreground, #f8f9fa);\n border: 1px solid var(--editor-gutter-border, #3e3e42);\n border-radius: 3px;\n font-size: 12px;\n outline: none;\n display: none;\n margin-top: 4px;\n \" />\n `;\n const t = this.searchUI.querySelector(\"input\"), n = this.searchUI.querySelector(\".search-replace-input\"), i = this.searchUI.querySelector(\".search-prev\"), s = this.searchUI.querySelector(\".search-next\"), o = this.searchUI.querySelector(\".search-close\");\n t.addEventListener(\"input\", () => {\n this.performSearch(t.value);\n }), t.addEventListener(\"keydown\", (h) => {\n h.key === \"Enter\" && (h.preventDefault(), h.shiftKey ? this.findPrev() : this.findNext());\n }), n.addEventListener(\"keydown\", (h) => {\n h.key === \"Enter\" && (h.preventDefault(), h.shiftKey ? this.replaceAll(t.value, n.value) : this.replaceCurrent(t.value, n.value));\n }), i.addEventListener(\"click\", () => this.findPrev()), s.addEventListener(\"click\", () => this.findNext()), o.addEventListener(\"click\", () => this.hideSearch()), e.appendChild(this.searchUI);\n }\n performSearch(e) {\n if (!this.editor || !e.trim()) {\n this.clearHighlights(), this.updateStatus(\"\");\n return;\n }\n const t = this.editor.getValue(), n = [];\n let i = t.toLowerCase().indexOf(e.toLowerCase());\n for (; i !== -1; ) {\n const s = this.getPositionFromOffset(t, i), o = this.getPositionFromOffset(t, i + e.length);\n n.push({\n range: { start: s, end: o },\n match: t.substring(i, i + e.length)\n }), i = t.toLowerCase().indexOf(e.toLowerCase(), i + 1);\n }\n this.currentResults = n, this.currentIndex = this.currentResults.length > 0 ? 0 : -1, this.updateHighlights(), this.updateStatus(`${this.currentResults.length} matches`);\n }\n getPositionFromOffset(e, t) {\n const n = e.substring(0, t).split(`\n`), i = n.length - 1, s = n[n.length - 1].length;\n return { line: i, column: s };\n }\n findNext() {\n this.currentResults.length !== 0 && (this.currentIndex = (this.currentIndex + 1) % this.currentResults.length, this.updateHighlights());\n }\n findPrev() {\n this.currentResults.length !== 0 && (this.currentIndex = this.currentIndex <= 0 ? this.currentResults.length - 1 : this.currentIndex - 1, this.updateHighlights());\n }\n replaceCurrent(e, t) {\n if (!this.editor || !e.trim() || this.currentIndex === -1) return;\n const n = this.currentResults[this.currentIndex];\n if (!n) return;\n const i = this.editor.getValue(), s = this.getOffsetFromPosition(i, n.range.start), o = i.substring(0, s), h = i.substring(s + e.length), r = o + t + h;\n this.editor.setValue(r), this.performSearch(e), this.updateStatus(\"Replaced current occurrence\");\n }\n replaceAll(e, t) {\n if (!this.editor || !e.trim()) return;\n let n = this.editor.getValue(), i = 0, s = n.toLowerCase().indexOf(e.toLowerCase());\n for (; s !== -1; )\n n = n.substring(0, s) + t + n.substring(s + e.length), i++, s = n.toLowerCase().indexOf(e.toLowerCase(), s + t.length);\n i > 0 && (this.editor.setValue(n), this.updateStatus(`Replaced ${i} occurrences`));\n }\n getOffsetFromPosition(e, t) {\n const n = e.split(`\n`);\n let i = 0;\n for (let s = 0; s < t.line; s++)\n i += n[s].length + 1;\n return i += t.column, i;\n }\n updateHighlights() {\n this.clearHighlights(), !(this.currentResults.length === 0 || this.currentIndex === -1) && (this.currentResults[this.currentIndex], this.updateStatus(`${this.currentResults.length} matches (showing ${this.currentIndex + 1}/${this.currentResults.length})`));\n }\n clearHighlights() {\n }\n updateStatus(e) {\n const t = this.searchUI?.querySelector(\".search-status\");\n t && (t.textContent = e);\n }\n destroy() {\n this.searchUI && this.searchUI.parentNode && this.searchUI.parentNode.removeChild(this.searchUI), this.searchUI = null, this.editor = null;\n }\n}\nclass k {\n constructor() {\n this.name = \"bracket-matching\", this.editor = null, this.bracketPairs = {\n \"(\": \")\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"<\": \">\"\n }, this.reverseBracketPairs = {\n \")\": \"(\",\n \"]\": \"[\",\n \"}\": \"{\",\n \">\": \"<\"\n }, this.currentMatch = null;\n }\n setup(e) {\n this.editor = e, e.on(\"cursor\", () => {\n this.updateBracketMatching();\n }), e.on(\"change\", () => {\n this.updateBracketMatching();\n });\n }\n updateBracketMatching() {\n if (!this.editor) return;\n const e = this.editor.getCursor(), t = this.editor.getValue();\n this.clearBracketHighlighting();\n const n = this.getBracketAtPosition(t, e.position);\n if (!n) return;\n const i = this.findMatchingBracket(t, n);\n i && (this.currentMatch = i, this.highlightBrackets(i));\n }\n getBracketAtPosition(e, t) {\n const n = e.split(`\n`);\n if (t.line >= n.length) return null;\n const i = n[t.line];\n if (t.column >= i.length) return null;\n const s = i[t.column];\n return this.bracketPairs[s] || this.reverseBracketPairs[s] ? { char: s, position: t } : null;\n }\n findMatchingBracket(e, t) {\n const n = e.split(`\n`), i = t.position.line, s = t.position.column, o = t.char;\n return this.bracketPairs[o] ? this.findClosingBracket(e, n, i, s, o) : this.reverseBracketPairs[o] ? this.findOpeningBracket(e, n, i, s, o) : null;\n }\n findClosingBracket(e, t, n, i, s) {\n const o = this.bracketPairs[s];\n let h = 0;\n for (let r = n; r < t.length; r++) {\n const l = t[r], c = r === n ? i : 0;\n for (let a = c; a < l.length; a++) {\n const u = l[a];\n if (u === s)\n h++;\n else if (u === o && (h--, h === 0))\n return {\n open: { start: { line: n, column: i }, end: { line: n, column: i + 1 } },\n close: { start: { line: r, column: a }, end: { line: r, column: a + 1 } },\n type: s\n };\n }\n }\n return null;\n }\n findOpeningBracket(e, t, n, i, s) {\n const o = this.reverseBracketPairs[s];\n let h = 0;\n for (let r = n; r >= 0; r--) {\n const l = t[r], c = r === n ? i : l.length - 1;\n for (let a = c; a >= 0; a--) {\n const u = l[a];\n if (u === s)\n h++;\n else if (u === o && (h--, h === 0))\n return {\n open: { start: { line: r, column: a }, end: { line: r, column: a + 1 } },\n close: { start: { line: n, column: i }, end: { line: n, column: i + 1 } },\n type: o\n };\n }\n }\n return null;\n }\n highlightBrackets(e) {\n console.log(\"Bracket match found:\", e);\n }\n clearBracketHighlighting() {\n this.currentMatch = null;\n }\n getCurrentMatch() {\n return this.currentMatch;\n }\n destroy() {\n this.clearBracketHighlighting(), this.editor = null;\n }\n}\nclass C {\n constructor() {\n this.name = \"code-folding\", this.editor = null, this.foldIndicators = [], this.foldingUI = null;\n }\n setup(e) {\n this.editor = e, e.registerCommand(\"fold\", () => {\n console.log(\"Fold command executed - folding not yet implemented\"), this.foldAtCursor();\n }), e.registerCommand(\"unfold\", () => {\n console.log(\"Unfold command executed - unfolding not yet implemented\"), this.unfoldAtCursor();\n }), e.registerCommand(\"foldAll\", () => {\n console.log(\"Fold all command executed - folding not yet implemented\"), this.foldAll();\n }), e.registerCommand(\"unfoldAll\", () => {\n console.log(\"Unfold all command executed - unfolding not yet implemented\"), this.unfoldAll();\n }), e.on(\"change\", () => {\n this.updateFoldIndicators();\n }), this.createFoldingUI(), this.updateFoldIndicators();\n }\n createFoldingUI() {\n if (!this.editor) return;\n const e = document.querySelector(\".rte-source-editor-modal\");\n e && (this.foldingUI = document.createElement(\"div\"), this.foldingUI.style.cssText = `\n position: absolute;\n left: 40px;\n top: 0;\n bottom: 0;\n width: 20px;\n pointer-events: none;\n z-index: 2;\n `, e.appendChild(this.foldingUI));\n }\n updateFoldIndicators() {\n if (!this.editor || !this.foldingUI) return;\n this.foldingUI.innerHTML = \"\", this.foldIndicators = [];\n const t = this.editor.getValue().split(`\n`);\n this.findFoldableLines(t).forEach((i) => {\n this.createFoldIndicator(i);\n });\n }\n findFoldableLines(e) {\n const t = [];\n for (let n = 0; n < e.length; n++) {\n const i = e[n].trim();\n (i.startsWith(\"{\") || i.startsWith(\"function\") || i.startsWith(\"class\") || i.startsWith(\"if\") || i.includes(\"=>\") || i.startsWith(\"for\") || i.startsWith(\"while\") || i.startsWith(\"try\")) && t.push(n);\n }\n return t;\n }\n createFoldIndicator(e) {\n if (!this.foldingUI) return;\n const t = document.createElement(\"div\");\n t.style.cssText = `\n position: absolute;\n left: 0;\n top: ${e * 21}px;\n width: 20px;\n height: 21px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n pointer-events: auto;\n color: var(--editor-gutter-foreground, #858585);\n font-size: 10px;\n user-select: none;\n `, t.innerHTML = \"▶\", t.title = \"Code folding not yet implemented - click shows fold indicators\", t.addEventListener(\"click\", () => {\n console.log(`Fold toggle clicked at line ${e} - implementation pending`);\n }), this.foldingUI.appendChild(t), this.foldIndicators.push(t);\n }\n foldAtCursor() {\n console.log(\"foldAtCursor called - implementation pending\");\n }\n unfoldAtCursor() {\n console.log(\"unfoldAtCursor called - implementation pending\");\n }\n foldAll() {\n console.log(\"foldAll called - implementation pending\");\n }\n unfoldAll() {\n console.log(\"unfoldAll called - implementation pending\");\n }\n destroy() {\n this.foldingUI && this.foldingUI.parentNode && this.foldingUI.parentNode.removeChild(this.foldingUI), this.foldingUI = null, this.foldIndicators = [], this.editor = null;\n }\n}\nclass L {\n constructor() {\n this.name = \"syntax-highlighting\", this.editor = null, this.currentTheme = \"dark\";\n }\n setup(e) {\n this.editor = e, console.log(\"SyntaxHighlightingExtension: Isolated extension loaded - ready for use\");\n }\n // Extension provides methods that can be called by the editor\n setTheme(e) {\n this.currentTheme = e, console.log(`SyntaxHighlightingExtension: Theme changed to ${e}`);\n }\n // Method to get syntax highlighting colors for a given theme\n getSyntaxColors() {\n return this.currentTheme === \"dark\" ? {\n tag: \"#569cd6\",\n // Blue\n comment: \"#6a9955\",\n // Green\n attrValue: \"#ce9178\",\n // Orange\n text: \"#d4d4d4\"\n // Light gray\n } : {\n tag: \"#0000ff\",\n // Blue\n comment: \"#008000\",\n // Green\n attrValue: \"#a31515\",\n // Red\n text: \"#000000\"\n // Black\n };\n }\n // Method to parse and highlight HTML content (returns highlighted HTML string)\n highlightHTML(e) {\n const t = this.getSyntaxColors();\n let n = e;\n return n = n.replace(\n /(<\\/?[\\w:-]+(?:\\s[^>]*?)?\\/?>)/g,\n `<span style=\"color: ${t.tag};\">$1</span>`\n ), n = n.replace(\n /(<!--[\\s\\S]*?-->)/g,\n `<span style=\"color: ${t.comment};\">$1</span>`\n ), n = n.replace(\n /(\"[^\"]*\"|'[^']*')/g,\n `<span style=\"color: ${t.attrValue};\">$1</span>`\n ), n;\n }\n // Method to check if content contains syntax that should be highlighted\n shouldHighlight(e) {\n return /<\\/?[\\w:-]+|<!--/.test(e);\n }\n destroy() {\n this.editor = null, console.log(\"SyntaxHighlightingExtension: Extension destroyed\");\n }\n}\nfunction T(d, e) {\n const t = { ...e };\n return t.extensions || (t.extensions = []), t.extensions.some((i) => i.name === \"keymap\") || t.extensions.unshift(new y(t.keymap)), new x(d, t);\n}\nexport {\n k as BracketMatchingExtension,\n C as CodeFoldingExtension,\n x as EditorCore,\n y as KeymapExtension,\n b as LineNumbersExtension,\n E as ReadOnlyExtension,\n w as SearchExtension,\n L as SyntaxHighlightingExtension,\n m as TextModel,\n v as ThemeExtension,\n p as View,\n T as createEditor,\n x as default\n};\n","import { Plugin } from '@editora/core';\nimport {\n createEditor,\n EditorCore,\n LineNumbersExtension,\n ThemeExtension,\n ReadOnlyExtension,\n SearchExtension,\n BracketMatchingExtension,\n CodeFoldingExtension,\n SyntaxHighlightingExtension\n} from '@editora/light-code-editor';\n\nconst SOURCE_EDITOR_CSS = `/* Source Editor Dialog Styles */\n.rte-source-editor-overlay {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n background-color: rgba(0, 0, 0, 0.6) !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 10000 !important;\n padding: 20px !important;\n box-sizing: border-box !important;\n margin: 0 !important;\n}\n\n.rte-source-editor-overlay.fullscreen {\n padding: 0 !important;\n}\n\n.rte-source-editor-modal {\n background: white;\n border-radius: 8px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n width: 100%;\n max-width: 1200px;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n.rte-source-editor-overlay.fullscreen .rte-source-editor-modal {\n border-radius: 0;\n max-width: 100%;\n max-height: 100vh;\n width: 100%;\n height: 100vh;\n}\n\n.rte-source-editor-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e1e5e9;\n background: #f8f9fa;\n border-radius: 8px 8px 0 0;\n}\n\n.rte-source-editor-overlay.fullscreen .rte-source-editor-header {\n border-radius: 0;\n}\n\n.rte-source-editor-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.rte-source-editor-header-toolbar {\n display: flex;\n gap: 8px;\n margin-left: auto;\n margin-right: 16px;\n}\n\n.rte-source-editor-toolbar-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 4px;\n font-size: 16px;\n line-height: 1;\n transition: all 0.2s ease;\n color: #666;\n}\n\n.rte-source-editor-toolbar-btn:hover:not(:disabled) {\n background: #e1e5e9;\n color: #1a1a1a;\n}\n\n.rte-source-editor-toolbar-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.rte-source-editor-toolbar-btn.active {\n background: #007acc;\n color: white;\n}\n\n.rte-source-editor-toolbar-btn.active:hover {\n background: #0056b3;\n}\n\n.rte-source-editor-header-actions {\n display: flex;\n gap: 8px;\n}\n\n.rte-source-editor-fullscreen-btn,\n.rte-source-editor-close-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n color: #666;\n font-size: 16px;\n line-height: 1;\n transition: all 0.2s ease;\n}\n\n.rte-source-editor-fullscreen-btn:hover,\n.rte-source-editor-close-btn:hover {\n background: #e1e5e9;\n color: #1a1a1a;\n}\n\n.rte-source-editor-body {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.rte-source-editor-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n color: #666;\n position: absolute;\n z-index: 9;\n margin: 0 auto;\n width: 100%;\n top: 44%;\n}\n\n.rte-source-editor-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #e1e5e9;\n border-top: 3px solid #007acc;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 16px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.rte-source-editor-error {\n background: #fee;\n color: #c53030;\n padding: 12px 16px;\n border-left: 4px solid #c53030;\n margin: 16px;\n border-radius: 4px;\n font-size: 14px;\n}\n\n.rte-source-editor-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.rte-source-editor-warning {\n background: #fefcbf;\n color: #744210;\n padding: 8px 16px;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 1px solid #f6e05e;\n}\n\n.rte-source-editor-codemirror {\n flex: 1;\n overflow: auto;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.rte-source-editor-codemirror .cm-editor {\n height: 100%;\n}\n\n.rte-source-editor-codemirror .cm-focused {\n outline: none;\n}\n\n.rte-source-editor-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e1e5e9;\n background: #f8f9fa;\n border-radius: 0 0 8px 8px;\n}\n\n.rte-source-editor-overlay.fullscreen .rte-source-editor-footer {\n border-radius: 0;\n}\n\n.rte-source-editor-footer-info {\n font-size: 12px;\n color: #666;\n}\n\n.unsaved-changes {\n color: #d69e2e;\n font-weight: 500;\n}\n\n.rte-source-editor-footer-actions {\n display: flex;\n gap: 12px;\n}\n\n.rte-source-editor-btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.2s ease;\n}\n\n.rte-source-editor-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.rte-source-editor-btn-cancel {\n background: white;\n border-color: #d1d5db;\n color: #374151;\n}\n\n.rte-source-editor-btn-cancel:hover:not(:disabled) {\n background: #f9fafb;\n border-color: #9ca3af;\n}\n\n.rte-source-editor-btn-save {\n background: #007acc;\n color: white;\n}\n\n.rte-source-editor-btn-save:hover:not(:disabled) {\n background: #0056b3;\n}\n\n/* Dark theme support */\n@media (prefers-color-scheme: dark) {\n .rte-source-editor-modal {\n background: #1e1e1e;\n color: #f8f9fa;\n }\n\n .rte-source-editor-header {\n background: #2d2d2d;\n border-color: #404040;\n }\n\n .rte-source-editor-header h2 {\n color: #f8f9fa;\n }\n\n .rte-source-editor-fullscreen-btn,\n .rte-source-editor-close-btn {\n color: #ccc;\n }\n\n .rte-source-editor-fullscreen-btn:hover,\n .rte-source-editor-close-btn:hover {\n background: #404040;\n color: #f8f9fa;\n }\n\n .rte-source-editor-error {\n background: #2d1b1b;\n color: #fca5a5;\n border-color: #dc2626;\n }\n\n .rte-source-editor-warning {\n background: #2d2a1b;\n color: #fcd34d;\n border-color: #d97706;\n }\n\n .rte-source-editor-footer {\n background: #2d2d2d;\n border-color: #404040;\n }\n\n .rte-source-editor-footer-info {\n color: #ccc;\n }\n\n .rte-source-editor-btn-cancel {\n background: #374151;\n border-color: #4b5563;\n color: #f9fafb;\n }\n\n .rte-source-editor-btn-cancel:hover:not(:disabled) {\n background: #4b5563;\n border-color: #6b7280;\n }\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .rte-source-editor-overlay {\n padding: 10px;\n }\n\n .rte-source-editor-modal {\n max-height: 95vh;\n }\n\n .rte-source-editor-header {\n padding: 12px 16px;\n }\n\n .rte-source-editor-footer {\n padding: 12px 16px;\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .rte-source-editor-footer-actions {\n justify-content: stretch;\n }\n\n .rte-source-editor-btn {\n flex: 1;\n text-align: center;\n }\n}`;\n\n/**\n * Code Plugin - Framework Agnostic\n * \n * Adds HTML source view functionality.\n * Opens a dialog to edit the raw HTML source of the editor content.\n * No React dependency required.\n */\nexport const CodePlugin = (): Plugin => ({\n name: 'code',\n \n // Toolbar button configuration\n toolbar: [\n {\n label: 'Source',\n command: 'toggleSourceView',\n type: 'button',\n icon: '<>',\n shortcut: 'Mod-Shift-S'\n }\n ],\n \n // Native command implementations\n commands: {\n /**\n * Toggle HTML source view\n * Opens a dialog to edit raw HTML\n */\n toggleSourceView: () => {\n // Find the editor container and content area\n const findEditorContent = (): HTMLElement | null => {\n // PRIORITY 1: Try to find from current selection or focus\n // This ensures we get the correct editor in multi-instance scenarios\n const selection = window.getSelection();\n if (selection && selection.anchorNode) {\n let current = selection.anchorNode instanceof HTMLElement \n ? selection.anchorNode \n : selection.anchorNode.parentElement;\n \n // Traverse up to find .rte-content (the contenteditable element)\n while (current) {\n if (current.classList?.contains('rte-content')) {\n return current;\n }\n current = current.parentElement;\n }\n }\n \n // PRIORITY 2: Try to find from document.activeElement\n // If the editor was just focused by the toolbar\n if (document.activeElement) {\n let current = document.activeElement;\n \n // Check if activeElement itself is the content\n if (current.classList?.contains('rte-content')) {\n return current as HTMLElement;\n }\n \n // Or traverse up from activeElement\n while (current && current !== document.body) {\n if (current.classList?.contains('rte-content')) {\n return current as HTMLElement;\n }\n // Also check children\n const contentEl = current.querySelector('.rte-content') as HTMLElement;\n if (contentEl) return contentEl;\n \n current = current.parentElement!;\n }\n }\n \n // PRIORITY 3: Find from data-editora-editor (single instance fallback)\n const editorContainer = document.querySelector('[data-editora-editor]');\n if (editorContainer) {\n const contentEl = editorContainer.querySelector('.rte-content') as HTMLElement;\n if (contentEl) return contentEl;\n }\n \n // PRIORITY 4: Last resort - find any .rte-content\n return document.querySelector('.rte-content') as HTMLElement;\n };\n \n const contentElement = findEditorContent();\n \n if (!contentElement) {\n console.error('[CodePlugin] Editor content area not found');\n alert('Editor content area not found. Please click inside the editor first.');\n return false;\n }\n \n // Get current HTML\n const currentHtml = contentElement.innerHTML;\n \n // Format HTML for better readability\n const formatHTML = (html: string): string => {\n let formatted = '';\n let indentLevel = 0;\n const indentSize = 2;\n const tokens = html.split(/(<\\/?[a-zA-Z][^>]*>)/);\n\n for (const token of tokens) {\n if (!token.trim()) continue;\n\n if (token.match(/^<\\/[a-zA-Z]/)) {\n indentLevel = Math.max(0, indentLevel - 1);\n formatted += '\\n' + ' '.repeat(indentLevel * indentSize) + token;\n } else if (token.match(/^<[a-zA-Z]/) && !token.match(/\\/>$/)) {\n formatted += '\\n' + ' '.repeat(indentLevel * indentSize) + token;\n indentLevel++;\n } else if (token.match(/^<[a-zA-Z].*\\/>$/)) {\n formatted += '\\n' + ' '.repeat(indentLevel * indentSize) + token;\n } else {\n formatted += token.trim();\n }\n }\n return formatted.trim();\n };\n \n // Create source editor dialog\n const createSourceDialog = () => {\n let editorInstance: EditorCore | null = null;\n let currentTheme = 'dark';\n let isReadOnly = false;\n let isFullscreen = false;\n let hasUnsavedChanges = false;\n const originalHtml = currentHtml;\n const overlay = document.createElement('div');\n overlay.className = 'rte-source-editor-overlay';\n \n const dialog = document.createElement('div');\n dialog.className = 'rte-source-editor-modal';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-labelledby', 'source-editor-title');\n \n const header = document.createElement('div');\n header.className = 'rte-source-editor-header';\n header.innerHTML = `\n <h2 id=\"source-editor-title\">Source Editor</h2>\n <div class=\"rte-source-editor-header-toolbar\">\n <button class=\"rte-source-editor-toolbar-btn theme-toggle-btn\" title=\"Switch theme\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"/>\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/>\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/>\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/>\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/>\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/>\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/>\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/>\n </svg>\n </button>\n <button class=\"rte-source-editor-toolbar-btn readonly-toggle-btn\" title=\"Toggle read-only\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n </svg>\n </button>\n </div>\n <div class=\"rte-source-editor-header-actions\">\n <button class=\"rte-source-editor-fullscreen-btn\" title=\"Toggle fullscreen\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\"/>\n </svg>\n </button>\n <button class=\"rte-source-editor-close-btn\" aria-label=\"Close source editor\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n `;\n \n const body = document.createElement('div');\n body.className = 'rte-source-editor-body';\n \n const content = document.createElement('div');\n content.className = 'rte-source-editor-content';\n \n const warning = document.createElement('div');\n warning.className = 'rte-source-editor-warning';\n warning.textContent = '⚠️ Advanced users only. Invalid HTML may break the editor.';\n \n const editorContainer = document.createElement('div');\n editorContainer.className = 'rte-source-editor-light-editor';\n editorContainer.style.height = '400px';\n \n content.appendChild(warning);\n content.appendChild(editorContainer);\n body.appendChild(content);\n \n const footer = document.createElement('div');\n footer.className = 'rte-source-editor-footer';\n footer.innerHTML = `\n <div class=\"rte-source-editor-footer-info\">\n <span class=\"unsaved-changes\" style=\"display: none;\">• Unsaved changes</span>\n </div>\n <div class=\"rte-source-editor-footer-actions\">\n <button class=\"rte-source-editor-btn rte-source-editor-btn-cancel\">Cancel</button>\n <button class=\"rte-source-editor-btn rte-source-editor-btn-save\">Save</button>\n </div>\n `;\n \n // Assemble dialog\n dialog.appendChild(header);\n dialog.appendChild(body);\n dialog.appendChild(footer);\n overlay.appendChild(dialog);\n \n // Inject Source Editor CSS if not already present\n if (!document.getElementById('rte-source-editor-styles')) {\n const style = document.createElement('style');\n style.id = 'rte-source-editor-styles';\n style.textContent = SOURCE_EDITOR_CSS;\n document.head.appendChild(style);\n }\n \n document.body.appendChild(overlay);\n \n // Initialize code editor\n try {\n editorInstance = createEditor(editorContainer, {\n value: formatHTML(currentHtml),\n theme: 'dark',\n readOnly: false,\n extensions: [\n new LineNumbersExtension(),\n new ThemeExtension(),\n new ReadOnlyExtension(),\n new BracketMatchingExtension(),\n new SearchExtension(),\n new CodeFoldingExtension(),\n new SyntaxHighlightingExtension()\n ]\n });\n\n // Track changes\n editorInstance.on('change', () => {\n const newContent = editorInstance?.getValue() || '';\n hasUnsavedChanges = newContent !== formatHTML(originalHtml);\n const unsavedLabel = footer.querySelector('.unsaved-changes') as HTMLElement;\n if (unsavedLabel) {\n unsavedLabel.style.display = hasUnsavedChanges ? 'inline' : 'none';\n }\n });\n\n setTimeout(() => editorInstance?.focus(), 100);\n } catch (err) {\n console.error('Failed to initialize code editor:', err);\n }\n \n // Event handlers\n const updateUnsavedState = () => {\n const unsavedLabel = footer.querySelector('.unsaved-changes') as HTMLElement;\n if (unsavedLabel) {\n unsavedLabel.style.display = hasUnsavedChanges ? 'inline' : 'none';\n }\n };\n \n const toggleTheme = () => {\n currentTheme = currentTheme === 'dark' ? 'light' : 'dark';\n editorInstance?.setTheme(currentTheme);\n const themeBtn = header.querySelector('.theme-toggle-btn');\n if (themeBtn && currentTheme === 'light') {\n themeBtn.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/>\n </svg>\n `;\n }\n };\n \n const toggleReadOnly = () => {\n isReadOnly = !isReadOnly;\n editorInstance?.setReadOnly(isReadOnly);\n const readonlyBtn = header.querySelector('.readonly-toggle-btn');\n if (readonlyBtn) {\n if (isReadOnly) {\n readonlyBtn.classList.add('active');\n readonlyBtn.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>\n <circle cx=\"12\" cy=\"16\" r=\"1\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n `;\n } else {\n readonlyBtn.classList.remove('active');\n readonlyBtn.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n </svg>\n `;\n }\n }\n };\n \n const toggleFullscreen = () => {\n isFullscreen = !isFullscreen;\n if (isFullscreen) {\n overlay.classList.add('fullscreen');\n editorContainer.style.height = 'calc(100vh - 200px)';\n } else {\n overlay.classList.remove('fullscreen');\n editorContainer.style.height = '400px';\n }\n const fullscreenBtn = header.querySelector('.rte-source-editor-fullscreen-btn');\n if (fullscreenBtn) {\n fullscreenBtn.innerHTML = isFullscreen ? `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 0 2-2h3M3 16h3a2 2 0 0 0 2 2v3\"/>\n </svg>\n ` : `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\"/>\n </svg>\n `;\n }\n };\n \n const closeDialog = () => {\n if (editorInstance) {\n editorInstance.destroy();\n editorInstance = null;\n }\n document.body.removeChild(overlay);\n };\n \n const handleCancel = () => {\n if (hasUnsavedChanges) {\n if (!confirm('You have unsaved changes. Are you sure you want to cancel?')) {\n return;\n }\n }\n closeDialog();\n };\n \n const handleSave = () => {\n try {\n const htmlContent = editorInstance?.getValue() || '';\n \n // Basic HTML sanitization\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = htmlContent;\n const dangerous = tempDiv.querySelectorAll('script, iframe[src^=\"javascript:\"], object, embed');\n dangerous.forEach(el => el.remove());\n \n contentElement.innerHTML = tempDiv.innerHTML;\n hasUnsavedChanges = false;\n closeDialog();\n } catch (error) {\n alert('Failed to update HTML. Please check your syntax.');\n console.error('HTML update error:', error);\n }\n };\n \n // Attach event listeners\n header.querySelector('.theme-toggle-btn')?.addEventListener('click', toggleTheme);\n header.querySelector('.readonly-toggle-btn')?.addEventListener('click', toggleReadOnly);\n header.querySelector('.rte-source-editor-fullscreen-btn')?.addEventListener('click', toggleFullscreen);\n header.querySelector('.rte-source-editor-close-btn')?.addEventListener('click', closeDialog);\n footer.querySelector('.rte-source-editor-btn-cancel')?.addEventListener('click', handleCancel);\n footer.querySelector('.rte-source-editor-btn-save')?.addEventListener('click', handleSave);\n \n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) closeDialog();\n });\n \n // Keyboard shortcuts\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeDialog();\n document.removeEventListener('keydown', escHandler);\n }\n };\n document.addEventListener('keydown', escHandler);\n };\n \n createSourceDialog();\n return true;\n }\n },\n \n // Keyboard shortcuts\n keymap: {\n 'Mod-Shift-s': 'toggleSourceView',\n 'Mod-Shift-S': 'toggleSourceView'\n }\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * List Plugin - Native Implementation\n * Author: Ajay Kumar <ajaykr089@gmail.com>\n * \n * Provides bullet and ordered list functionality with:\n * - Bullet lists (unordered lists with • markers)\n * - Numbered lists (ordered lists with 1, 2, 3... markers)\n * - Toggle on/off behavior\n * - Keyboard shortcuts (Cmd-Shift-8, Cmd-Shift-7)\n * - Global command registration\n */\n\n/**\n * Toggle bullet (unordered) list\n */\nexport const toggleBulletList = (): boolean => {\n document.execCommand('insertUnorderedList', false);\n return true;\n};\n\n/**\n * Toggle numbered (ordered) list\n */\nexport const toggleOrderedList = (): boolean => {\n document.execCommand('insertOrderedList', false);\n return true;\n};\n\n/**\n * Register commands globally\n */\nconst registerCommand = (command: string, handler: () => void): void => {\n if (typeof window !== 'undefined') {\n (window as any).registerEditorCommand?.(command, handler);\n }\n};\n\n/**\n * Initialize global command registration\n */\nconst initializeCommands = (): void => {\n registerCommand('toggleBulletList', toggleBulletList);\n registerCommand('toggleOrderedList', toggleOrderedList);\n};\n\n// Initialize on load\nif (typeof window !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeCommands);\n } else {\n initializeCommands();\n }\n}\n\nexport const ListPlugin = (): Plugin => ({\n name: 'list',\n\n nodes: {\n bulletList: {\n content: 'listItem+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM: () => ['ul', 0]\n },\n orderedList: {\n content: 'listItem+',\n group: 'block',\n parseDOM: [{ tag: 'ol' }],\n toDOM: () => ['ol', 0]\n },\n listItem: {\n content: 'paragraph',\n parseDOM: [{ tag: 'li' }],\n toDOM: () => ['li', 0]\n }\n },\n\n toolbar: [\n {\n label: 'Bullet List',\n command: 'toggleBulletList',\n type: 'button',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M11 5h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2ZM4.5 6c0 .4.1.8.4 1 .3.4.7.5 1.1.5.4 0 .8-.1 1-.4.4-.3.5-.7.5-1.1 0-.4-.1-.8-.4-1-.3-.4-.7-.5-1.1-.5-.4 0-.8.1-1 .4-.4.3-.5.7-.5 1.1Zm0 6c0 .4.1.8.4 1 .3.4.7.5 1.1.5.4 0 .8-.1 1-.4.4-.3.5-.7.5-1.1 0-.4-.1-.8-.4-1-.3-.4-.7-.5-1.1-.5-.4 0-.8.1-1 .4-.4.3-.5.7-.5 1.1Zm0 6c0 .4.1.8.4 1 .3.4.7.5 1.1.5.4 0 .8-.1 1-.4.4-.3.5-.7.5-1.1 0-.4-.1-.8-.4-1-.3-.4-.7-.5-1.1-.5-.4 0-.8.1-1 .4-.4.3-.5.7-.5 1.1Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: 'Mod-Shift-8'\n },\n {\n label: 'Numbered List',\n command: 'toggleOrderedList',\n type: 'button',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M10 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2Zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 1 1 0-2ZM6 4v3.5c0 .3-.2.5-.5.5a.5.5 0 0 1-.5-.5V5h-.5a.5.5 0 0 1 0-1H6Zm-1 8.8l.2.2h1.3c.3 0 .5.2.5.5s-.2.5-.5.5H4.9a1 1 0 0 1-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 0 0 0-.2l-.7.3a.5.5 0 0 1-.7-.3.5.5 0 0 1 .3-.6l.7-.4c.5-.2 1.1 0 1.4.4.3.5.3 1.1-.1 1.5l-1.2.7Zm0 3.7v.5c0 .3.2.5.5.5h1c.3 0 .5.2.5.5s-.2.5-.5.5h-1a1.5 1.5 0 0 1-1.5-1.5v-.5c0-.3.1-.6.3-.8l1.3-1.4c.3-.4.1-.9-.2-1-.1 0-.2 0-.3.2l-.4.5a.5.5 0 0 1-.7.1.5.5 0 0 1-.1-.7l.4-.5c.5-.5 1.2-.6 1.8-.4.6.3 1 .9 1 1.6 0 .4-.2.8-.5 1.1l-1.3 1.4-.3.4Z\" fill-rule=\"evenodd\"></path></svg>',\n shortcut: 'Mod-Shift-7'\n }\n ],\n\n commands: {\n toggleBulletList,\n toggleOrderedList\n },\n\n keymap: {\n 'Mod-Shift-8': 'toggleBulletList',\n 'Mod-Shift-7': 'toggleOrderedList'\n }\n});\n","import { Plugin } from '@editora/core';\n\n/**\n * History Plugin - Native Implementation\n * Author: Ajay Kumar <ajaykr089@gmail.com>\n * \n * Provides comprehensive undo/redo functionality:\n * - ContentEditable native undo/redo (Ctrl/Cmd+Z, Ctrl/Cmd+Y)\n * - DOM-level undo/redo stack for A11y auto-fixes\n * - Global command registration system\n * - Attribute and text change tracking\n */\n\n// DOM undo/redo stacks for A11y and other DOM manipulations\nconst domUndoStack: Array<() => void> = [];\nconst domRedoStack: Array<() => void> = [];\n\n// Command registry for global access\nconst commandHandlers: Record<string, (...args: any[]) => void> = {};\n\n/**\n * Register a command globally\n */\nconst registerCommand = (command: string, handler: (...args: any[]) => void): void => {\n commandHandlers[command] = handler;\n \n // Expose to global window object for external access\n if (typeof window !== 'undefined') {\n if (!(window as any).registerEditorCommand) {\n (window as any).registerEditorCommand = (cmd: string, fn: (...args: any[]) => void) => {\n commandHandlers[cmd] = fn;\n };\n }\n (window as any).registerEditorCommand(command, handler);\n }\n};\n\n/**\n * Execute a registered command\n */\nconst execEditorCommand = (cmd: string, ...args: any[]): void => {\n if (commandHandlers[cmd]) {\n commandHandlers[cmd](...args);\n }\n};\n\n/**\n * Undo the last action (ContentEditable)\n */\nexport const undo = (): boolean => {\n document.execCommand('undo', false);\n return true;\n};\n\n/**\n * Redo the last undone action (ContentEditable)\n */\nexport const redo = (): boolean => {\n document.execCommand('redo', false);\n return true;\n};\n\n/**\n * Set an attribute on an element with undo support\n */\nexport const setAttribute = (el: HTMLElement, attr: string, value: string): void => {\n const prev = el.getAttribute(attr);\n el.setAttribute(attr, value);\n \n // Push undo action to stack\n domUndoStack.push(() => {\n if (prev == null) {\n el.removeAttribute(attr);\n } else {\n el.setAttribute(attr, prev);\n }\n });\n \n // Clear redo stack when new action is performed\n domRedoStack.length = 0;\n};\n\n/**\n * Set text content on an element with undo support\n */\nexport const setText = (el: HTMLElement, value: string): void => {\n const prev = el.textContent;\n el.textContent = value;\n \n // Push undo action to stack\n domUndoStack.push(() => {\n el.textContent = prev ?? '';\n });\n \n // Clear redo stack when new action is performed\n domRedoStack.length = 0;\n};\n\n/**\n * Auto-fix an A11y issue with undo support\n */\nexport const autoFixA11y = (issue: any): void => {\n const el = issue.element;\n if (!el) return;\n \n // Find the A11y rule\n const rule = (window as any).a11yRuleRegistry?.find((r: any) => r.id === issue.rule);\n \n let undoFn: (() => void) | null = null;\n \n if (rule && rule.fix) {\n // Capture current state of all attributes\n const prevAttrs: Record<string, string | null> = {};\n for (const attr of el.getAttributeNames()) {\n prevAttrs[attr] = el.getAttribute(attr);\n }\n \n // Apply the fix\n rule.fix(issue);\n \n // Create undo function\n undoFn = () => {\n for (const attr of Object.keys(prevAttrs)) {\n if (prevAttrs[attr] == null) {\n el.removeAttribute(attr);\n } else {\n el.setAttribute(attr, prevAttrs[attr]!);\n }\n }\n };\n }\n \n if (undoFn) {\n domUndoStack.push(undoFn);\n }\n \n // Clear redo stack when new action is performed\n domRedoStack.length = 0;\n};\n\n/**\n * Undo the last DOM change\n */\nexport const undoDom = (): void => {\n const fn = domUndoStack.pop();\n if (fn) {\n fn();\n domRedoStack.push(fn);\n }\n};\n\n/**\n * Redo the last undone DOM change\n */\nexport const redoDom = (): void => {\n const fn = domRedoStack.pop();\n if (fn) {\n fn();\n domUndoStack.push(fn);\n }\n};\n\n/**\n * Initialize global command system\n */\nconst initializeCommandSystem = (): void => {\n if (typeof window === 'undefined') return;\n \n // Set up global command executor if not already present\n if (!(window as any).execEditorCommand) {\n (window as any).execEditorCommand = execEditorCommand;\n }\n \n // Register all commands\n registerCommand('undo', undo);\n registerCommand('redo', redo);\n registerCommand('setAttribute', setAttribute);\n registerCommand('setText', setText);\n registerCommand('autoFixA11y', autoFixA11y);\n registerCommand('undoDom', undoDom);\n registerCommand('redoDom', redoDom);\n};\n\n// Initialize on load\nif (typeof window !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeCommandSystem);\n } else {\n initializeCommandSystem();\n }\n}\n\nexport const HistoryPlugin = (): Plugin => ({\n name: 'history',\n \n toolbar: [\n {\n label: 'Undo',\n command: 'undo',\n type: 'button',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M6.4 8H12c3.7 0 6.2 2 6.8 5.1.6 2.7-.4 5.6-2.3 6.8a1 1 0 0 1-1-1.8c1.1-.6 1.8-2.7 1.4-4.6-.5-2.1-2.1-3.5-4.9-3.5H6.4l3.3 3.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 1.4L6.4 8Z\" fill-rule=\"nonzero\"></path></svg>',\n shortcut: 'Mod-z'\n },\n {\n label: 'Redo',\n command: 'redo',\n type: 'button',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><path d=\"M17.6 10H12c-2.8 0-4.4 1.4-4.9 3.5-.4 2 .3 4 1.4 4.6a1 1 0 1 1-1 1.8c-2-1.2-2.9-4.1-2.3-6.8.6-3 3-5.1 6.8-5.1h5.6l-3.3-3.3a1 1 0 1 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4-1.4l3.3-3.3Z\" fill-rule=\"nonzero\"></path></svg>',\n shortcut: 'Mod-y'\n }\n ],\n \n commands: {\n undo,\n redo,\n setAttribute,\n setText,\n autoFixA11y,\n undoDom,\n redoDom\n },\n \n keymap: {\n 'Mod-z': 'undo',\n 'Mod-Z': 'undo',\n 'Mod-y': 'redo',\n 'Mod-Y': 'redo',\n 'Mod-Shift-z': 'redo',\n 'Mod-Shift-Z': 'redo'\n }\n});\n"],"names":["PluginLoader","name","factory","config","plugin","names","p","pluginString","EditorState","doc","selection","schema","content","Schema","nodes","marks","type","attrs","text","PluginManager","pluginConfig","pluginName","index","commands","command","args","mode","error","destroyPromises","CommandRegistry","initialCommands","handler","EditorEngine","value","newState","state","readonly","event","handlers","ToolbarRenderer","plugins","pluginLoader","toolbarString","groups","sections","s","allToolbarItems","itemMap","item","aliases","section","buttons","cmd","ltrItem","rtlItem","addCommentItem","toggleCommentsItem","actualCommand","container","buttonGroups","group","groupIndex","groupEl","button","separator","parent","dropdownEl","inlineMenuEl","groupButtonEl","inputEl","buttonEl","el","iconWrapper","itemsContainer","child","e","trigger","menu","option","isOpen","closeDropdown","allMenus","_a","m","dropdown","cleanup","FloatingToolbar","parentElement","x","y","StatusBar","info","leftSection","rightSection","leftItems","sel","pos","rightItems","key","span","getCursorPosition","contentElement","range","startOffset","getTextOffset","lines","line","column","rootElement","node","offset","textOffset","walker","currentNode","countLines","blocks","lineCount","lastBlock","_b","textLines","calculateTextStats","words","chars","getSelectionInfo","cursorPosition","selectedText","_ConfigResolver","sources","parsedAttributes","attributes","camelKey","str","_","letter","errors","configs","result","ConfigResolver","injectStyles","styleId","styleElement","styles","RichTextEditorElement","resolve","checkLoader","oldValue","newValue","initialContent","slot","n","loadedPlugins","registeredNames","toolbarSlot","statusBarSlot","toolbarItems","lastChild","commandFn","tempDiv","tagName","html","updateSelectionInfo","rect","selectionInfo","cls","i","attr","_c","_d","globalPluginLoader","pluginRegistry","BoldPlugin_native","ItalicPlugin_native","UnderlinePlugin_native","StrikethroughPlugin_native","ClearFormattingPlugin_native","HeadingPlugin_native","BlockquotePlugin_native","CodePlugin_native","ListPlugin_native","HistoryPlugin_native","initWebComponent","loader","existingElements","contents","weight","toggleItalic","registerCommand","initializeCommands","setBlockTypeImpl","level","isInBlockquote","o","h","r","g","c","a","u","f","l","b","v","E","w","k","C","t","L","T","d","SOURCE_EDITOR_CSS","current","contentEl","editorContainer","currentHtml","formatHTML","formatted","indentLevel","indentSize","tokens","token","editorInstance","currentTheme","isReadOnly","isFullscreen","hasUnsavedChanges","originalHtml","overlay","dialog","header","body","warning","footer","style","createEditor","LineNumbersExtension","ThemeExtension","ReadOnlyExtension","BracketMatchingExtension","SearchExtension","CodeFoldingExtension","SyntaxHighlightingExtension","unsavedLabel","err","toggleTheme","themeBtn","toggleReadOnly","readonlyBtn","toggleFullscreen","fullscreenBtn","closeDialog","handleCancel","handleSave","htmlContent","_e","_f","escHandler","toggleBulletList","toggleOrderedList","domUndoStack","domRedoStack","commandHandlers","fn","execEditorCommand","undo","redo","setAttribute","prev","setText","autoFixA11y","issue","rule","undoFn","prevAttrs","undoDom","redoDom","initializeCommandSystem"],"mappings":"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"}
|