@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.
Files changed (119) hide show
  1. package/README.md +9 -0
  2. package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs +475 -0
  3. package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs.map +1 -0
  4. package/dist/AnchorPlugin.native-7es9PVZ9.mjs +340 -0
  5. package/dist/AnchorPlugin.native-7es9PVZ9.mjs.map +1 -0
  6. package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs +449 -0
  7. package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs.map +1 -0
  8. package/dist/BlockquotePlugin.native-JFmOLsxN.mjs +48 -0
  9. package/dist/BlockquotePlugin.native-JFmOLsxN.mjs.map +1 -0
  10. package/dist/BoldPlugin.native-BAzzoqU5.mjs +45 -0
  11. package/dist/BoldPlugin.native-BAzzoqU5.mjs.map +1 -0
  12. package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs +79 -0
  13. package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs.map +1 -0
  14. package/dist/ChecklistPlugin.native-Dccs3nLe.mjs +153 -0
  15. package/dist/ChecklistPlugin.native-Dccs3nLe.mjs.map +1 -0
  16. package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs +27 -0
  17. package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs.map +1 -0
  18. package/dist/CodePlugin.native-DD9xFIid.mjs +1679 -0
  19. package/dist/CodePlugin.native-DD9xFIid.mjs.map +1 -0
  20. package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs +326 -0
  21. package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs.map +1 -0
  22. package/dist/CommentsPlugin.native-2zQV8Ia4.mjs +473 -0
  23. package/dist/CommentsPlugin.native-2zQV8Ia4.mjs.map +1 -0
  24. package/dist/DirectionPlugin.native-Be7wCzkI.mjs +59 -0
  25. package/dist/DirectionPlugin.native-Be7wCzkI.mjs.map +1 -0
  26. package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs +116 -0
  27. package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs.map +1 -0
  28. package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs +461 -0
  29. package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs.map +1 -0
  30. package/dist/EmojisPlugin.native-D6mJSnSR.mjs +1033 -0
  31. package/dist/EmojisPlugin.native-D6mJSnSR.mjs.map +1 -0
  32. package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs +106 -0
  33. package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs.map +1 -0
  34. package/dist/FontSizePlugin.native-DkLMLPue.mjs +186 -0
  35. package/dist/FontSizePlugin.native-DkLMLPue.mjs.map +1 -0
  36. package/dist/FootnotePlugin.native-BciVc9W6.mjs +128 -0
  37. package/dist/FootnotePlugin.native-BciVc9W6.mjs.map +1 -0
  38. package/dist/FullscreenPlugin.native-ChXyxeNw.mjs +77 -0
  39. package/dist/FullscreenPlugin.native-ChXyxeNw.mjs.map +1 -0
  40. package/dist/HeadingPlugin.native-DrLYwQnQ.mjs +64 -0
  41. package/dist/HeadingPlugin.native-DrLYwQnQ.mjs.map +1 -0
  42. package/dist/HistoryPlugin.native-DoDRifCf.mjs +89 -0
  43. package/dist/HistoryPlugin.native-DoDRifCf.mjs.map +1 -0
  44. package/dist/IndentPlugin.native-CbFugPoi.mjs +133 -0
  45. package/dist/IndentPlugin.native-CbFugPoi.mjs.map +1 -0
  46. package/dist/ItalicPlugin.native-CQjjDyUL.mjs +43 -0
  47. package/dist/ItalicPlugin.native-CQjjDyUL.mjs.map +1 -0
  48. package/dist/LineHeightPlugin.native-CWQT2FIa.mjs +73 -0
  49. package/dist/LineHeightPlugin.native-CWQT2FIa.mjs.map +1 -0
  50. package/dist/LinkPlugin.native-BdAOV-iu.mjs +206 -0
  51. package/dist/LinkPlugin.native-BdAOV-iu.mjs.map +1 -0
  52. package/dist/ListPlugin.native-CLFU5AUQ.mjs +59 -0
  53. package/dist/ListPlugin.native-CLFU5AUQ.mjs.map +1 -0
  54. package/dist/MathPlugin.native-DE_ii-LA.mjs +182 -0
  55. package/dist/MathPlugin.native-DE_ii-LA.mjs.map +1 -0
  56. package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs +533 -0
  57. package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs.map +1 -0
  58. package/dist/MergeTagPlugin.native-CrxyThyn.mjs +178 -0
  59. package/dist/MergeTagPlugin.native-CrxyThyn.mjs.map +1 -0
  60. package/dist/PageBreakPlugin.native-DDjcDyRW.mjs +172 -0
  61. package/dist/PageBreakPlugin.native-DDjcDyRW.mjs.map +1 -0
  62. package/dist/PreviewPlugin.native-DBvfpmIv.mjs +322 -0
  63. package/dist/PreviewPlugin.native-DBvfpmIv.mjs.map +1 -0
  64. package/dist/PrintPlugin.native-BUpm52VJ.mjs +311 -0
  65. package/dist/PrintPlugin.native-BUpm52VJ.mjs.map +1 -0
  66. package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs +731 -0
  67. package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs.map +1 -0
  68. package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs +465 -0
  69. package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs.map +1 -0
  70. package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs +43 -0
  71. package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs.map +1 -0
  72. package/dist/TablePlugin.native-EEWXn1-s.mjs +491 -0
  73. package/dist/TablePlugin.native-EEWXn1-s.mjs.map +1 -0
  74. package/dist/TemplatePlugin.native-BlSn1c9h.mjs +564 -0
  75. package/dist/TemplatePlugin.native-BlSn1c9h.mjs.map +1 -0
  76. package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs +97 -0
  77. package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs.map +1 -0
  78. package/dist/TextColorPlugin.native-D6SmTglm.mjs +432 -0
  79. package/dist/TextColorPlugin.native-D6SmTglm.mjs.map +1 -0
  80. package/dist/UnderlinePlugin.native-QpIcK4L2.mjs +35 -0
  81. package/dist/UnderlinePlugin.native-QpIcK4L2.mjs.map +1 -0
  82. package/dist/core.css +1 -0
  83. package/dist/documentManager-irzj9n3V.mjs +37627 -0
  84. package/dist/documentManager-irzj9n3V.mjs.map +1 -0
  85. package/dist/editorContainerHelpers-C7kdWnS0.mjs +27 -0
  86. package/dist/editorContainerHelpers-C7kdWnS0.mjs.map +1 -0
  87. package/dist/editora.min.js +519 -4
  88. package/dist/editora.min.js.map +1 -0
  89. package/dist/editora.umd.js +519 -4
  90. package/dist/editora.umd.js.map +1 -0
  91. package/dist/index-BF5RBhL9.js +4 -0
  92. package/dist/index-BF5RBhL9.js.map +1 -0
  93. package/dist/index-BPsf460l.mjs +1243 -0
  94. package/dist/index-BPsf460l.mjs.map +1 -0
  95. package/dist/index.cjs.js +517 -4
  96. package/dist/index.cjs.js.map +1 -0
  97. package/dist/index.es-CuicffkQ.mjs +6665 -0
  98. package/dist/index.es-CuicffkQ.mjs.map +1 -0
  99. package/dist/index.esm.js +1403 -122
  100. package/dist/index.esm.js.map +1 -0
  101. package/dist/plugin-loader.js +55 -0
  102. package/dist/plugin-loader.js.map +1 -0
  103. package/dist/purify.es-CKpwg8Tk.mjs +471 -0
  104. package/dist/purify.es-CKpwg8Tk.mjs.map +1 -0
  105. package/dist/webcomponent-core.js +1243 -0
  106. package/dist/webcomponent-core.js.map +1 -0
  107. package/dist/webcomponent-core.min.css +1 -0
  108. package/dist/webcomponent-core.min.js +597 -0
  109. package/dist/webcomponent-core.min.js.map +1 -0
  110. package/dist/webcomponent.cjs.js +2 -0
  111. package/dist/webcomponent.cjs.js.map +1 -0
  112. package/dist/webcomponent.esm.js +6 -0
  113. package/dist/webcomponent.esm.js.map +1 -0
  114. package/dist/webcomponent.js +1286 -0
  115. package/dist/webcomponent.js.map +1 -0
  116. package/dist/webcomponent.min.css +1 -0
  117. package/dist/webcomponent.min.js +4076 -0
  118. package/dist/webcomponent.min.js.map +1 -0
  119. package/package.json +64 -6
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,520 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class c{constructor(e,t,i){this.doc=e,this.selection=t,this.schema=i}static create(e,t){const i=t||e.node("doc",{},[e.node("paragraph")]);return new c(i,{anchor:0,head:0},e)}apply(e,t){return new c(e,t||this.selection,this.schema)}}class f{constructor(e){this.listeners=[],this.pluginManager=e;const t=e.buildSchema();this.state=c.create(t),this.commands=e.getCommands()}setState(e){this.state=e,this.listeners.forEach(t=>t(e))}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}execCommand(e){const t=this.commands[e];if(!t)return!1;const i=t(this.state);return i?(this.setState(i),!0):!1}setContent(e){this.setState(this.state.apply(e))}getContent(){return this.state.doc}}class p{constructor(e,t){this.nodes=new Map(Object.entries(e)),this.marks=new Map(Object.entries(t))}node(e,t,i){return{type:e,attrs:t,content:i}}text(e,t){return{type:"text",text:e,marks:t}}}class y{constructor(){this.plugins=[]}register(e){this.plugins.push(e)}buildSchema(){const e={},t={};return this.plugins.forEach(i=>{i.nodes&&Object.assign(e,i.nodes),i.marks&&Object.assign(t,i.marks)}),new p(e,t)}getCommands(){const e={};return this.plugins.forEach(t=>{t.commands&&Object.assign(e,t.commands)}),e}getToolbarItems(){return this.plugins.flatMap(e=>e.toolbar||[])}}class g{constructor(e){this.initialized=!1,this.plugin=e}initialize(e){if(this.initialized)return console.warn(`Plugin "${this.plugin.name}" already initialized`),!1;try{return this.context=e,this.plugin.context?.initialize&&this.plugin.context.initialize(),this.plugin.context?.onEditorReady&&e.provider&&this.plugin.context.onEditorReady(e),this.initialized=!0,!0}catch(t){return console.error(`Failed to initialize plugin "${this.plugin.name}":`,t),!1}}destroy(){if(!this.initialized)return!1;try{return this.plugin.context?.destroy&&this.plugin.context.destroy(),this.initialized=!1,this.context=void 0,!0}catch(e){return console.error(`Failed to destroy plugin "${this.plugin.name}":`,e),!1}}executeCommand(e,...t){if(!this.initialized)return console.warn(`Plugin "${this.plugin.name}" not initialized, cannot execute command "${e}"`),null;try{const i=this.plugin.commands?.[e];return i?i(...t):(console.warn(`Command "${e}" not found in plugin "${this.plugin.name}"`),null)}catch(i){return console.error(`Error executing command "${e}" in plugin "${this.plugin.name}":`,i),null}}getName(){return this.plugin.name}isInitialized(){return this.initialized}getPlugin(){return this.plugin}getContext(){return this.context}}function S(n){return new g(n)}class k{constructor(e){this.shortcuts=new Map,this.enabled=!0,this.isMac=typeof navigator<"u"&&navigator.platform.toUpperCase().indexOf("MAC")>=0,e?.enabled===!1&&(this.enabled=!1),this.registerDefaultShortcuts(),e?.shortcuts&&e.shortcuts.forEach(t=>this.registerShortcut(t)),e?.customShortcuts&&Object.values(e.customShortcuts).forEach(t=>{this.registerShortcut(t)})}registerDefaultShortcuts(){this.registerShortcut({key:"b",ctrl:!this.isMac,meta:this.isMac,command:"toggleBold",description:"Bold",preventDefault:!0}),this.registerShortcut({key:"i",ctrl:!this.isMac,meta:this.isMac,command:"toggleItalic",description:"Italic",preventDefault:!0}),this.registerShortcut({key:"u",ctrl:!this.isMac,meta:this.isMac,command:"toggleUnderline",description:"Underline",preventDefault:!0}),this.registerShortcut({key:"d",ctrl:!this.isMac,meta:this.isMac,command:"toggleStrikethrough",description:"Strikethrough",preventDefault:!0}),this.registerShortcut({key:"z",ctrl:!this.isMac,meta:this.isMac,command:"undo",description:"Undo",preventDefault:!0}),this.registerShortcut({key:"z",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"redo",description:"Redo",preventDefault:!0}),this.registerShortcut({key:"y",ctrl:!this.isMac,meta:this.isMac,command:"redo",description:"Redo",preventDefault:!0});for(let e=1;e<=6;e++)this.registerShortcut({key:String(e),ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"setBlockType",params:`h${e}`,description:`Heading ${e}`,preventDefault:!0});this.registerShortcut({key:"7",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"setBlockType",params:"p",description:"Paragraph",preventDefault:!0}),this.registerShortcut({key:"7",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleOrderedList",description:"Numbered List",preventDefault:!0}),this.registerShortcut({key:"8",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleBulletList",description:"Bullet List",preventDefault:!0}),this.registerShortcut({key:"k",ctrl:!this.isMac,meta:this.isMac,command:"openLinkDialog",description:"Insert/Edit Link",preventDefault:!0}),this.registerShortcut({key:"e",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertCodeBlock",description:"Code Block",preventDefault:!0}),this.registerShortcut({key:"q",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleBlockquote",description:"Blockquote",preventDefault:!0}),this.registerShortcut({key:"l",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"left",description:"Align Left",preventDefault:!0}),this.registerShortcut({key:"e",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"setTextAlignment",params:"center",description:"Align Center",preventDefault:!0}),this.registerShortcut({key:"r",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"right",description:"Align Right",preventDefault:!0}),this.registerShortcut({key:"j",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"justify",description:"Justify",preventDefault:!0}),this.registerShortcut({key:"\\",ctrl:!this.isMac,meta:this.isMac,command:"clearFormatting",description:"Clear Formatting",preventDefault:!0}),this.registerShortcut({key:"]",ctrl:!this.isMac,meta:this.isMac,command:"increaseIndent",description:"Indent",preventDefault:!0}),this.registerShortcut({key:"[",ctrl:!this.isMac,meta:this.isMac,command:"decreaseIndent",description:"Outdent",preventDefault:!0}),this.registerShortcut({key:"g",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"insertImage",description:"Insert Image",preventDefault:!0}),this.registerShortcut({key:"t",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"insertTable",description:"Insert Table",preventDefault:!0}),this.registerShortcut({key:"f11",command:"toggleFullscreen",description:"Toggle Fullscreen",preventDefault:!0}),this.registerShortcut({key:"p",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"togglePreview",description:"Preview",preventDefault:!0}),this.registerShortcut({key:"p",ctrl:!this.isMac,meta:this.isMac,command:"print",description:"Print",preventDefault:!0}),this.registerShortcut({key:"s",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"insertSpecialCharacter",description:"Insert Special Character",preventDefault:!0}),this.registerShortcut({key:"m",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"insertEmoji",description:"Insert Emoji",preventDefault:!0}),this.registerShortcut({key:"9",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleChecklist",description:"Checklist",preventDefault:!0}),this.registerShortcut({key:"a",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"toggleA11yChecker",description:"Accessibility Checker",preventDefault:!0}),this.registerShortcut({key:"F7",command:"toggleSpellCheck",description:"Spell Check",preventDefault:!0}),this.registerShortcut({key:"m",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertMath",description:"Insert Math",preventDefault:!0}),this.registerShortcut({key:"f",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertFootnote",description:"Insert Footnote",preventDefault:!0})}registerShortcut(e){const t=this.getShortcutKey(e);this.shortcuts.set(t,e)}unregisterShortcut(e){const t=this.getShortcutKey(e);this.shortcuts.delete(t)}getShortcutKey(e){const t=[];return e.ctrl&&t.push("ctrl"),e.alt&&t.push("alt"),e.shift&&t.push("shift"),e.meta&&t.push("meta"),t.push(e.key.toLowerCase()),t.join("+")}getEventKey(e){const t=[];return e.ctrlKey&&t.push("ctrl"),e.altKey&&t.push("alt"),e.shiftKey&&t.push("shift"),e.metaKey&&t.push("meta"),t.push(e.key.toLowerCase()),t.join("+")}handleKeyDown(e,t){if(!this.enabled)return!1;const i=this.getEventKey(e),r=this.shortcuts.get(i);return r?(r.preventDefault!==!1&&(e.preventDefault(),e.stopPropagation()),t(r.command,r.params),!0):!1}enable(){this.enabled=!0}disable(){this.enabled=!1}isEnabled(){return this.enabled}getAllShortcuts(){return Array.from(this.shortcuts.values())}getShortcutForCommand(e){return Array.from(this.shortcuts.values()).find(t=>t.command===e)}getShortcutDescription(e){const t=[];this.isMac?(e.meta&&t.push("โŒ˜"),e.ctrl&&t.push("โŒƒ"),e.alt&&t.push("โŒฅ"),e.shift&&t.push("โ‡ง")):(e.ctrl&&t.push("Ctrl"),e.alt&&t.push("Alt"),e.shift&&t.push("Shift"));const i=e.key.length===1?e.key.toUpperCase():e.key;return t.push(i),t.join("+")}getShortcutsHelp(){const e=this.getAllShortcuts(),t=new Map;e.forEach(r=>{const a=this.getShortcutCategory(r.command);t.has(a)||t.set(a,[]),t.get(a).push(r)});let i=`# Keyboard Shortcuts
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./index-BF5RBhL9.js");class v{constructor(e){if(this.listeners=[],e instanceof a.PluginManager)this.pluginManager=e;else{const i=e;this.pluginManager=new a.PluginManager,i.plugins&&Array.isArray(i.plugins)&&i.plugins.forEach(n=>{this.pluginManager.register(n)}),i.element&&(this.domElement=i.element,this.setupDOMElement(i))}const t=this.pluginManager.buildSchema();this.state=a.EditorState.create(t),this.commands=this.pluginManager.getCommands()}setupDOMElement(e){this.domElement&&(e.enableToolbar!==!1&&e.toolbarElement?this.toolbarElement=e.toolbarElement:e.enableToolbar!==!1&&(this.toolbarElement=document.createElement("div"),this.toolbarElement.className="editora-toolbar-container",this.domElement.appendChild(this.toolbarElement)),this.contentElement=document.createElement("div"),this.contentElement.contentEditable="true",this.contentElement.className="editora-content",this.contentElement.style.minHeight="200px",this.contentElement.style.outline="none",this.contentElement.style.padding="12px",e.content&&(this.contentElement.innerHTML=e.content),this.domElement.appendChild(this.contentElement),this.contentElement.addEventListener("input",()=>{this.listeners.forEach(t=>t(this.state))}))}setupKeyboardShortcuts(e){const t={};e.forEach(i=>{i.shortcut&&(t[i.shortcut.toLowerCase()]=i.command)}),document.addEventListener("keydown",i=>{if(this.contentElement!==document.activeElement&&!(document.activeElement instanceof HTMLElement&&document.activeElement.contentEditable==="true"))return;const n=[];(i.ctrlKey||i.metaKey)&&n.push("ctrl"),i.shiftKey&&n.push("shift"),i.altKey&&n.push("alt");const s=i.key.toLowerCase(),o=n.length>0?`${n.join("+")}+${s}`:s,r=t[o];r&&(i.preventDefault(),this.execCommand(r))})}handleToolbarCommand(e,t){const n=this.pluginManager.getToolbarItems().find(s=>s.id&&s.id===e||s.command===e);n&&(t!==void 0?this.execCommand(n.command,t):this.execCommand(n.command))}setState(e){this.state=e,this.listeners.forEach(t=>t(e))}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}on(e,t){return e==="change"||e==="input"?this.onChange(t):()=>{}}getElement(){return this.contentElement||this.domElement||null}execCommand(e,t){const i=this.commands[e];if(!i)return console.warn(`Command not found: ${e}`),!1;let n;return t!==void 0?n=i(this.state,t):n=i(this.state),n?(this.setState(n),!0):!1}setContent(e){typeof e=="string"?this.contentElement&&(this.contentElement.innerHTML=e):this.setState(this.state.apply(e))}getContent(){return this.contentElement?this.contentElement.innerHTML:this.state.doc}destroy(){this.listeners=[],this.contentElement&&this.contentElement.removeEventListener("input",()=>{})}}class f{constructor(e){this.initialized=!1,this.plugin=e}initialize(e){var t,i;if(this.initialized)return console.warn(`Plugin "${this.plugin.name}" already initialized`),!1;try{return this.context=e,(t=this.plugin.context)!=null&&t.initialize&&this.plugin.context.initialize(),(i=this.plugin.context)!=null&&i.onEditorReady&&e.provider&&this.plugin.context.onEditorReady(e),this.initialized=!0,!0}catch(n){return console.error(`Failed to initialize plugin "${this.plugin.name}":`,n),!1}}destroy(){var e;if(!this.initialized)return!1;try{return(e=this.plugin.context)!=null&&e.destroy&&this.plugin.context.destroy(),this.initialized=!1,this.context=void 0,!0}catch(t){return console.error(`Failed to destroy plugin "${this.plugin.name}":`,t),!1}}executeCommand(e,...t){var i;if(!this.initialized)return console.warn(`Plugin "${this.plugin.name}" not initialized, cannot execute command "${e}"`),null;try{const n=(i=this.plugin.commands)==null?void 0:i[e];return n?n(...t):(console.warn(`Command "${e}" not found in plugin "${this.plugin.name}"`),null)}catch(n){return console.error(`Error executing command "${e}" in plugin "${this.plugin.name}":`,n),null}}getName(){return this.plugin.name}isInitialized(){return this.initialized}getPlugin(){return this.plugin}getContext(){return this.context}}function E(l){return new f(l)}class S{constructor(e){this.shortcuts=new Map,this.enabled=!0,this.isMac=typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0,(e==null?void 0:e.enabled)===!1&&(this.enabled=!1),this.registerDefaultShortcuts(),e!=null&&e.shortcuts&&e.shortcuts.forEach(t=>this.registerShortcut(t)),e!=null&&e.customShortcuts&&Object.values(e.customShortcuts).forEach(t=>{this.registerShortcut(t)})}registerDefaultShortcuts(){this.registerShortcut({key:"b",ctrl:!this.isMac,meta:this.isMac,command:"toggleBold",description:"Bold",preventDefault:!0}),this.registerShortcut({key:"i",ctrl:!this.isMac,meta:this.isMac,command:"toggleItalic",description:"Italic",preventDefault:!0}),this.registerShortcut({key:"u",ctrl:!this.isMac,meta:this.isMac,command:"toggleUnderline",description:"Underline",preventDefault:!0}),this.registerShortcut({key:"d",ctrl:!this.isMac,meta:this.isMac,command:"toggleStrikethrough",description:"Strikethrough",preventDefault:!0}),this.registerShortcut({key:"z",ctrl:!this.isMac,meta:this.isMac,command:"undo",description:"Undo",preventDefault:!0}),this.registerShortcut({key:"z",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"redo",description:"Redo",preventDefault:!0}),this.registerShortcut({key:"y",ctrl:!this.isMac,meta:this.isMac,command:"redo",description:"Redo",preventDefault:!0});for(let e=1;e<=6;e++)this.registerShortcut({key:String(e),ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"setBlockType",params:`h${e}`,description:`Heading ${e}`,preventDefault:!0});this.registerShortcut({key:"7",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"setBlockType",params:"p",description:"Paragraph",preventDefault:!0}),this.registerShortcut({key:"7",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleOrderedList",description:"Numbered List",preventDefault:!0}),this.registerShortcut({key:"8",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleBulletList",description:"Bullet List",preventDefault:!0}),this.registerShortcut({key:"k",ctrl:!this.isMac,meta:this.isMac,command:"openLinkDialog",description:"Insert/Edit Link",preventDefault:!0}),this.registerShortcut({key:"e",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertCodeBlock",description:"Code Block",preventDefault:!0}),this.registerShortcut({key:"q",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleBlockquote",description:"Blockquote",preventDefault:!0}),this.registerShortcut({key:"l",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"left",description:"Align Left",preventDefault:!0}),this.registerShortcut({key:"e",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"setTextAlignment",params:"center",description:"Align Center",preventDefault:!0}),this.registerShortcut({key:"r",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"right",description:"Align Right",preventDefault:!0}),this.registerShortcut({key:"j",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"setTextAlignment",params:"justify",description:"Justify",preventDefault:!0}),this.registerShortcut({key:"\\",ctrl:!this.isMac,meta:this.isMac,command:"clearFormatting",description:"Clear Formatting",preventDefault:!0}),this.registerShortcut({key:"]",ctrl:!this.isMac,meta:this.isMac,command:"increaseIndent",description:"Indent",preventDefault:!0}),this.registerShortcut({key:"[",ctrl:!this.isMac,meta:this.isMac,command:"decreaseIndent",description:"Outdent",preventDefault:!0}),this.registerShortcut({key:"g",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"insertImage",description:"Insert Image",preventDefault:!0}),this.registerShortcut({key:"t",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"insertTable",description:"Insert Table",preventDefault:!0}),this.registerShortcut({key:"f11",command:"toggleFullscreen",description:"Toggle Fullscreen",preventDefault:!0}),this.registerShortcut({key:"p",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"togglePreview",description:"Preview",preventDefault:!0}),this.registerShortcut({key:"p",ctrl:!this.isMac,meta:this.isMac,command:"print",description:"Print",preventDefault:!0}),this.registerShortcut({key:"s",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"insertSpecialCharacter",description:"Insert Special Character",preventDefault:!0}),this.registerShortcut({key:"m",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"insertEmoji",description:"Insert Emoji",preventDefault:!0}),this.registerShortcut({key:"9",ctrl:!this.isMac,meta:this.isMac,shift:!0,command:"toggleChecklist",description:"Checklist",preventDefault:!0}),this.registerShortcut({key:"a",ctrl:!this.isMac,meta:this.isMac,shift:!0,alt:!0,command:"toggleA11yChecker",description:"Accessibility Checker",preventDefault:!0}),this.registerShortcut({key:"F7",command:"toggleSpellCheck",description:"Spell Check",preventDefault:!0}),this.registerShortcut({key:"m",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertMath",description:"Insert Math",preventDefault:!0}),this.registerShortcut({key:"f",ctrl:!this.isMac,meta:this.isMac,alt:!0,command:"insertFootnote",description:"Insert Footnote",preventDefault:!0})}registerShortcut(e){const t=this.getShortcutKey(e);this.shortcuts.set(t,e)}unregisterShortcut(e){const t=this.getShortcutKey(e);this.shortcuts.delete(t)}getShortcutKey(e){const t=[];return e.ctrl&&t.push("ctrl"),e.alt&&t.push("alt"),e.shift&&t.push("shift"),e.meta&&t.push("meta"),t.push(e.key.toLowerCase()),t.join("+")}getEventKey(e){const t=[];return e.ctrlKey&&t.push("ctrl"),e.altKey&&t.push("alt"),e.shiftKey&&t.push("shift"),e.metaKey&&t.push("meta"),t.push(e.key.toLowerCase()),t.join("+")}handleKeyDown(e,t){if(!this.enabled)return!1;const i=this.getEventKey(e),n=this.shortcuts.get(i);return n?(n.preventDefault!==!1&&(e.preventDefault(),e.stopPropagation()),t(n.command,n.params),!0):!1}enable(){this.enabled=!0}disable(){this.enabled=!1}isEnabled(){return this.enabled}getAllShortcuts(){return Array.from(this.shortcuts.values())}getShortcutForCommand(e){return Array.from(this.shortcuts.values()).find(t=>t.command===e)}getShortcutDescription(e){const t=[];this.isMac?(e.meta&&t.push("โŒ˜"),e.ctrl&&t.push("โŒƒ"),e.alt&&t.push("โŒฅ"),e.shift&&t.push("โ‡ง")):(e.ctrl&&t.push("Ctrl"),e.alt&&t.push("Alt"),e.shift&&t.push("Shift"));const i=e.key.length===1?e.key.toUpperCase():e.key;return t.push(i),t.join("+")}getShortcutsHelp(){const e=this.getAllShortcuts(),t=new Map;e.forEach(n=>{const s=this.getShortcutCategory(n.command);t.has(s)||t.set(s,[]),t.get(s).push(n)});let i=`# Keyboard Shortcuts
2
2
 
3
- `;return t.forEach((r,a)=>{i+=`## ${a}
3
+ `;return t.forEach((n,s)=>{i+=`## ${s}
4
4
 
5
- `,r.forEach(l=>{const o=this.getShortcutDescription(l);i+=`- **${o}**: ${l.description||l.command}
5
+ `,n.forEach(o=>{const r=this.getShortcutDescription(o);i+=`- **${r}**: ${o.description||o.command}
6
6
  `}),i+=`
7
- `}),i}getShortcutCategory(e){return e.includes("toggle")&&(e.includes("Bold")||e.includes("Italic")||e.includes("Underline")||e.includes("Strike")||e.includes("Code")||e.includes("Super")||e.includes("Sub"))?"Text Formatting":e.includes("Heading")||e.includes("Paragraph")?"Block Formatting":e.includes("List")||e.includes("Checklist")?"Lists":e.includes("Alignment")||e.includes("Indent")?"Alignment & Indentation":e.includes("undo")||e.includes("redo")?"History":e.includes("insert")?"Insert":e.includes("find")||e.includes("replace")?"Find & Replace":e.includes("Accessibility")||e.includes("spell")?"Tools":"Other"}}function M(n={}){const{enabled:e=!1,provider:t="browser",apiUrl:i="",apiHeaders:r={},language:a="en",customDictionary:l=[],ignoreAllCaps:o=!0,ignoreNumbers:m=!0}=n;return{name:"spellcheck",context:{initialize:()=>{if(e)switch(console.log("[Spellcheck Plugin] Initialized",{provider:t,language:a}),t){case"browser":console.log("[Spellcheck] Using browser spellcheck");break;case"local":console.log("[Spellcheck] Using local dictionary (not implemented)");break;case"api":i?console.log("[Spellcheck] Using API:",i):console.warn("[Spellcheck] API provider selected but no apiUrl provided");break}},destroy:()=>{console.log("[Spellcheck Plugin] Destroyed")},onEditorReady:u=>{console.log("[Spellcheck Plugin] Editor ready")}},commands:{toggleSpellcheck:()=>(console.log("[Spellcheck] Toggle command (not implemented)"),null),addToDictionary:u=>(console.log("[Spellcheck] Add to dictionary:",u),null),checkSpelling:async()=>(console.log("[Spellcheck] Check spelling (not implemented)"),null)},toolbar:e?[{label:"Spellcheck",command:"toggleSpellcheck",icon:"Aa",type:"button"}]:[]}}function b(n={}){const{uploadUrl:e="",libraryUrl:t="",maxFileSize:i=10*1024*1024,allowedTypes:r=["image/jpeg","image/png","image/gif","image/webp"],headers:a={},withCredentials:l=!1,chunkSize:o=1024*1024,enableChunking:m=!0,onProgress:u,onError:d,onSuccess:v}=n;return{name:"media",context:{initialize:()=>{console.log("[Media Plugin] Initialized",{uploadUrl:e,libraryUrl:t,maxFileSize:i,allowedTypes:r}),e||console.warn("[Media] No uploadUrl provided - upload will not work")},destroy:()=>{console.log("[Media Plugin] Destroyed")},onEditorReady:s=>{console.log("[Media Plugin] Editor ready")}},commands:{insertImage:async s=>{if(console.log("[Media] Insert image command (not implemented)",s),!s)return console.log("[Media] No file provided - should open picker"),null;if(!r.includes(s.type)){const h=new Error(`File type ${s.type} not allowed`);return d?.(h),null}if(s.size>i){const h=new Error(`File size ${s.size} exceeds max ${i}`);return d?.(h),null}return null},openMediaLibrary:()=>(console.log("[Media] Open media library (not implemented)"),t||console.warn("[Media] No libraryUrl provided"),null),uploadMedia:async s=>(console.log("[Media] Upload media (not implemented)",{name:s.name,size:s.size,type:s.type}),null)},toolbar:[{label:"Image",command:"insertImage",icon:"๐Ÿ–ผ๏ธ",type:"button"},{label:"Media Library",command:"openMediaLibrary",icon:"๐Ÿ“",type:"button"}]}}exports.Editor=f;exports.EditorState=c;exports.KeyboardShortcutManager=k;exports.PluginManager=y;exports.PluginRuntime=g;exports.Schema=p;exports.createMediaPlugin=b;exports.createPluginRuntime=S;exports.createSpellcheckPlugin=M;
7
+ `}),i}getShortcutCategory(e){return e.includes("toggle")&&(e.includes("Bold")||e.includes("Italic")||e.includes("Underline")||e.includes("Strike")||e.includes("Code")||e.includes("Super")||e.includes("Sub"))?"Text Formatting":e.includes("Heading")||e.includes("Paragraph")?"Block Formatting":e.includes("List")||e.includes("Checklist")?"Lists":e.includes("Alignment")||e.includes("Indent")?"Alignment & Indentation":e.includes("undo")||e.includes("redo")?"History":e.includes("insert")?"Insert":e.includes("find")||e.includes("replace")?"Find & Replace":e.includes("Accessibility")||e.includes("spell")?"Tools":"Other"}}function x(l={}){const{enabled:e=!1,provider:t="browser",apiUrl:i="",apiHeaders:n={},language:s="en",customDictionary:o=[],ignoreAllCaps:r=!0,ignoreNumbers:c=!0}=l;return{name:"spellcheck",context:{initialize:()=>{if(e)switch(console.log("[Spellcheck Plugin] Initialized",{provider:t,language:s}),t){case"browser":console.log("[Spellcheck] Using browser spellcheck");break;case"local":console.log("[Spellcheck] Using local dictionary (not implemented)");break;case"api":i?console.log("[Spellcheck] Using API:",i):console.warn("[Spellcheck] API provider selected but no apiUrl provided");break}},destroy:()=>{console.log("[Spellcheck Plugin] Destroyed")},onEditorReady:h=>{console.log("[Spellcheck Plugin] Editor ready")}},commands:{toggleSpellcheck:()=>(console.log("[Spellcheck] Toggle command (not implemented)"),null),addToDictionary:h=>(console.log("[Spellcheck] Add to dictionary:",h),null),checkSpelling:async()=>(console.log("[Spellcheck] Check spelling (not implemented)"),null)},toolbar:e?[{label:"Spellcheck",command:"toggleSpellcheck",icon:"Aa",type:"button"}]:[]}}function w(l={}){const{uploadUrl:e="",libraryUrl:t="",maxFileSize:i=10*1024*1024,allowedTypes:n=["image/jpeg","image/png","image/gif","image/webp"],headers:s={},withCredentials:o=!1,chunkSize:r=1024*1024,enableChunking:c=!0,onProgress:h,onError:u,onSuccess:A}=l;return{name:"media",context:{initialize:()=>{console.log("[Media Plugin] Initialized",{uploadUrl:e,libraryUrl:t,maxFileSize:i,allowedTypes:n}),e||console.warn("[Media] No uploadUrl provided - upload will not work")},destroy:()=>{console.log("[Media Plugin] Destroyed")},onEditorReady:d=>{console.log("[Media Plugin] Editor ready")}},commands:{insertImage:async d=>{if(console.log("[Media] Insert image command (not implemented)",d),!d)return console.log("[Media] No file provided - should open picker"),null;if(!n.includes(d.type)){const g=new Error(`File type ${d.type} not allowed`);return u==null||u(g),null}if(d.size>i){const g=new Error(`File size ${d.size} exceeds max ${i}`);return u==null||u(g),null}return null},openMediaLibrary:()=>(console.log("[Media] Open media library (not implemented)"),t||console.warn("[Media] No libraryUrl provided"),null),uploadMedia:async d=>(console.log("[Media] Upload media (not implemented)",{name:d.name,size:d.size,type:d.type}),null)},toolbar:[{label:"Image",command:"insertImage",icon:"๐Ÿ–ผ๏ธ",type:"button"},{label:"Media Library",command:"openMediaLibrary",icon:"๐Ÿ“",type:"button"}]}}class p{constructor(e,t={anchor:0,head:0}){this.doc=e,this.selection=t}getDocument(){return this.doc}setDocument(e){return new p(e,this.selection)}getSelection(){return{...this.selection}}setSelection(e){return new p(this.doc,e)}update(e,t){return new p(e||this.doc,t||this.selection)}getTextContent(){return""}isSelectionEmpty(){return this.selection.anchor===this.selection.head}}class m{constructor(e){this.config={closeOnEscape:!0,closeOnBackdrop:!0,...e},this.element=this.createElement(),this.attachEventListeners()}createElement(){const e=document.createElement("dialog");if(e.className="editora-dialog",this.config.width&&(e.style.width=this.config.width),this.config.height&&(e.style.height=this.config.height),e.innerHTML=`
8
+ <div class="editora-dialog-container">
9
+ <div class="editora-dialog-header">
10
+ <h3>${this.config.title}</h3>
11
+ <button class="editora-dialog-close" aria-label="Close">&times;</button>
12
+ </div>
13
+ <div class="editora-dialog-body">
14
+ ${typeof this.config.content=="string"?this.config.content:""}
15
+ </div>
16
+ <div class="editora-dialog-footer">
17
+ <button type="button" class="editora-btn editora-btn-cancel">Cancel</button>
18
+ <button type="button" class="editora-btn editora-btn-primary">OK</button>
19
+ </div>
20
+ </div>
21
+ `,typeof this.config.content!="string"){const t=e.querySelector(".editora-dialog-body");t&&(t.innerHTML="",t.appendChild(this.config.content))}return e}attachEventListeners(){const e=this.element.querySelector(".editora-dialog-close");e==null||e.addEventListener("click",()=>this.close());const t=this.element.querySelector(".editora-btn-cancel");t==null||t.addEventListener("click",()=>{var n,s;(s=(n=this.config).onCancel)==null||s.call(n),this.close()});const i=this.element.querySelector(".editora-btn-primary");i==null||i.addEventListener("click",()=>this.handleSubmit()),this.config.closeOnEscape&&this.element.addEventListener("cancel",n=>{n.preventDefault(),this.close()}),this.config.closeOnBackdrop&&this.element.addEventListener("click",n=>{const s=this.element.getBoundingClientRect();(n.clientX<s.left||n.clientX>s.right||n.clientY<s.top||n.clientY>s.bottom)&&this.close()})}handleSubmit(){var t,i,n,s;const e=this.element.querySelector("form");if(e){const o=new FormData(e);(i=(t=this.config).onSubmit)==null||i.call(t,o)}else{const o=this.element.querySelectorAll("input, select, textarea"),r=new FormData;o.forEach(c=>{c.name&&r.append(c.name,c.value)}),(s=(n=this.config).onSubmit)==null||s.call(n,r)}this.close()}show(){document.body.appendChild(this.element),this.element.showModal()}close(){this.element.close(),this.element.remove()}destroy(){this.close()}}class C{constructor(e){this.isOpen=!1,this.config=e,this.selectedValue=e.value,this.element=this.createElement(),this.attachEventListeners()}createElement(){const e=document.createElement("div");e.className="editora-dropdown",this.config.width&&(e.style.width=this.config.width);const t=this.config.options.find(n=>n.value===this.selectedValue),i=(t==null?void 0:t.label)||this.config.placeholder||"Select...";return e.innerHTML=`
22
+ <button class="editora-dropdown-toggle" type="button">
23
+ <span class="editora-dropdown-label">${i}</span>
24
+ <span class="editora-dropdown-arrow">โ–ผ</span>
25
+ </button>
26
+ <div class="editora-dropdown-menu" style="display: none;">
27
+ ${this.config.options.map(n=>`
28
+ <div class="editora-dropdown-item" data-value="${n.value}">
29
+ ${n.icon?`<span class="editora-dropdown-icon">${n.icon}</span>`:""}
30
+ <span>${n.label}</span>
31
+ </div>
32
+ `).join("")}
33
+ </div>
34
+ `,e}attachEventListeners(){const e=this.element.querySelector(".editora-dropdown-toggle"),t=this.element.querySelector(".editora-dropdown-menu");e.addEventListener("click",n=>{n.stopPropagation(),this.isOpen=!this.isOpen,t.style.display=this.isOpen?"block":"none"}),this.element.querySelectorAll(".editora-dropdown-item").forEach(n=>{n.addEventListener("click",()=>{var o,r;const s=n.getAttribute("data-value");s&&(this.setValue(s),(r=(o=this.config).onChange)==null||r.call(o,s),this.close())})}),document.addEventListener("click",n=>{this.element.contains(n.target)||this.close()})}setValue(e){this.selectedValue=e;const t=this.config.options.find(n=>n.value===e),i=this.element.querySelector(".editora-dropdown-label");i&&t&&(i.textContent=t.label)}getValue(){return this.selectedValue}close(){this.isOpen=!1;const e=this.element.querySelector(".editora-dropdown-menu");e&&(e.style.display="none")}getElement(){return this.element}destroy(){this.element.remove()}}class k{constructor(e){this.defaultPresets=["#000000","#434343","#666666","#999999","#B7B7B7","#CCCCCC","#D9D9D9","#EFEFEF","#F3F3F3","#FFFFFF","#980000","#FF0000","#FF9900","#FFFF00","#00FF00","#00FFFF","#4A86E8","#0000FF","#9900FF","#FF00FF","#E6B8AF","#F4CCCC","#FCE5CD","#FFF2CC","#D9EAD3","#D0E0E3","#C9DAF8","#CFE2F3","#D9D2E9","#EAD1DC"],this.config={presetColors:this.defaultPresets,...e},this.selectedColor=e.value,this.element=this.createElement(),this.attachEventListeners()}createElement(){var t;const e=document.createElement("div");return e.className="editora-color-picker",e.innerHTML=`
35
+ <div class="editora-color-picker-input">
36
+ <input type="color" value="${this.selectedColor||"#000000"}" />
37
+ <input type="text" value="${this.selectedColor||"#000000"}" placeholder="#000000" />
38
+ </div>
39
+ <div class="editora-color-picker-presets">
40
+ ${(t=this.config.presetColors)==null?void 0:t.map(i=>`
41
+ <button
42
+ class="editora-color-preset"
43
+ style="background-color: ${i};"
44
+ data-color="${i}"
45
+ title="${i}"
46
+ ></button>
47
+ `).join("")}
48
+ </div>
49
+ `,e}attachEventListeners(){const e=this.element.querySelector('input[type="color"]'),t=this.element.querySelector('input[type="text"]');e.addEventListener("input",n=>{var o,r;const s=n.target.value;t.value=s,this.selectedColor=s,(r=(o=this.config).onChange)==null||r.call(o,s)}),t.addEventListener("input",n=>{var o,r;const s=n.target.value;/^#[0-9A-Fa-f]{6}$/.test(s)&&(e.value=s,this.selectedColor=s,(r=(o=this.config).onChange)==null||r.call(o,s))}),this.element.querySelectorAll(".editora-color-preset").forEach(n=>{n.addEventListener("click",()=>{var o,r;const s=n.getAttribute("data-color");s&&(e.value=s,t.value=s,this.selectedColor=s,(r=(o=this.config).onChange)==null||r.call(o,s))})})}getValue(){return this.selectedColor}setValue(e){this.selectedColor=e;const t=this.element.querySelector('input[type="color"]'),i=this.element.querySelector('input[type="text"]');t&&(t.value=e),i&&(i.value=e)}getElement(){return this.element}destroy(){this.element.remove()}}class M{constructor(e){const{initialUrl:t="",initialText:i="",onSubmit:n,onCancel:s}=e;this.dialog=new m({title:"Insert/Edit Link",content:this.createFormHTML(t,i),onSubmit:o=>{const r=(o.get("url")||"").trim(),c=(o.get("text")||"").trim(),h=o.get("openInNewTab")==="on";if(!r){alert("Please enter a URL");return}n({url:r,text:c,openInNewTab:h}),this.dialog.close()},onCancel:()=>{s==null||s(),this.dialog.close()},width:"500px"})}createFormHTML(e,t){return`
50
+ <form class="link-dialog-form">
51
+ <div class="form-group">
52
+ <label for="link-url">URL</label>
53
+ <input
54
+ type="url"
55
+ id="link-url"
56
+ name="url"
57
+ placeholder="https://example.com"
58
+ value="${this.escapeHtml(e)}"
59
+ required
60
+ autofocus
61
+ />
62
+ <small>Enter the web address (URL) for the link</small>
63
+ </div>
64
+
65
+ <div class="form-group">
66
+ <label for="link-text">Link Text</label>
67
+ <input
68
+ type="text"
69
+ id="link-text"
70
+ name="text"
71
+ placeholder="Click here"
72
+ value="${this.escapeHtml(t)}"
73
+ />
74
+ <small>Text to display for the link (leave empty to use URL)</small>
75
+ </div>
76
+
77
+ <div class="form-group">
78
+ <label class="checkbox-label">
79
+ <input
80
+ type="checkbox"
81
+ name="openInNewTab"
82
+ id="link-new-tab"
83
+ />
84
+ <span>Open link in new tab</span>
85
+ </label>
86
+ </div>
87
+
88
+ <div class="form-actions">
89
+ <button type="button" class="btn btn-secondary" data-action="cancel">
90
+ Cancel
91
+ </button>
92
+ <button type="submit" class="btn btn-primary">
93
+ Insert Link
94
+ </button>
95
+ </div>
96
+ </form>
97
+ `}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}show(){this.dialog.show()}close(){this.dialog.close()}}class L{constructor(e){const{onSubmit:t,onCancel:i}=e;this.dialog=new m({title:"Insert Table",content:this.createFormHTML(),onSubmit:n=>{const s=parseInt(n.get("rows"),10),o=parseInt(n.get("cols"),10),r=n.get("headerRow")==="on";if(s<1||s>100){alert("Please enter a valid number of rows (1-100)");return}if(o<1||o>20){alert("Please enter a valid number of columns (1-20)");return}t({rows:s,cols:o,headerRow:r}),this.dialog.close()},onCancel:()=>{i==null||i(),this.dialog.close()},width:"400px"})}createFormHTML(){return`
98
+ <form class="table-dialog-form">
99
+ <div class="form-group">
100
+ <label for="table-rows">Rows</label>
101
+ <input
102
+ type="number"
103
+ id="table-rows"
104
+ name="rows"
105
+ min="1"
106
+ max="100"
107
+ value="3"
108
+ required
109
+ autofocus
110
+ />
111
+ <small>Number of rows (1-100)</small>
112
+ </div>
113
+
114
+ <div class="form-group">
115
+ <label for="table-cols">Columns</label>
116
+ <input
117
+ type="number"
118
+ id="table-cols"
119
+ name="cols"
120
+ min="1"
121
+ max="20"
122
+ value="3"
123
+ required
124
+ />
125
+ <small>Number of columns (1-20)</small>
126
+ </div>
127
+
128
+ <div class="form-group">
129
+ <label class="checkbox-label">
130
+ <input
131
+ type="checkbox"
132
+ name="headerRow"
133
+ id="table-header"
134
+ checked
135
+ />
136
+ <span>Include header row</span>
137
+ </label>
138
+ </div>
139
+
140
+ <div class="table-preview">
141
+ <strong>Preview:</strong>
142
+ <div id="table-preview-content" style="margin-top: 8px; font-size: 12px; color: #666;">
143
+ 3 rows ร— 3 columns with header
144
+ </div>
145
+ </div>
146
+
147
+ <div class="form-actions">
148
+ <button type="button" class="btn btn-secondary" data-action="cancel">
149
+ Cancel
150
+ </button>
151
+ <button type="submit" class="btn btn-primary">
152
+ Insert Table
153
+ </button>
154
+ </div>
155
+ </form>
156
+ `}show(){this.dialog.show(),this.attachPreviewListeners()}close(){this.dialog.close()}attachPreviewListeners(){const e=document.querySelector(".table-dialog-form");if(!e)return;const t=e.querySelector("#table-rows"),i=e.querySelector("#table-cols"),n=e.querySelector("#table-header"),s=e.querySelector("#table-preview-content"),o=()=>{const r=parseInt((t==null?void 0:t.value)||"3",10),c=parseInt((i==null?void 0:i.value)||"3",10),h=n==null?void 0:n.checked;s&&(s.textContent=`${r} rows ร— ${c} columns${h?" with header":""}`)};t==null||t.addEventListener("input",o),i==null||i.addEventListener("input",o),n==null||n.addEventListener("change",o)}}class T{constructor(e){this.config=e;const{onSubmit:t,onCancel:i}=e;this.dialog=new m({title:"Insert Image",content:this.createFormHTML(),onSubmit:n=>{const s=(n.get("src")||"").trim(),o=(n.get("alt")||"").trim(),r=(n.get("width")||"").trim(),c=(n.get("height")||"").trim();if(!s){alert("Please enter an image URL or upload an image");return}t({src:s,alt:o,width:r||void 0,height:c||void 0}),this.dialog.close()},onCancel:()=>{i==null||i(),this.dialog.close()},width:"500px"})}createFormHTML(){return`
157
+ <form class="image-dialog-form">
158
+ ${this.config.allowUpload?`
159
+ <div class="form-group">
160
+ <label for="image-upload">Upload Image</label>
161
+ <input
162
+ type="file"
163
+ id="image-upload"
164
+ accept="image/*"
165
+ />
166
+ <small>Or upload an image from your computer</small>
167
+ </div>
168
+ <div class="form-divider">OR</div>
169
+ `:""}
170
+
171
+ <div class="form-group">
172
+ <label for="image-src">Image URL</label>
173
+ <input
174
+ type="url"
175
+ id="image-src"
176
+ name="src"
177
+ placeholder="https://example.com/image.jpg"
178
+ ${this.config.allowUpload?"":"required autofocus"}
179
+ />
180
+ <small>Enter the web address (URL) of the image</small>
181
+ </div>
182
+
183
+ <div class="form-group">
184
+ <label for="image-alt">Alt Text</label>
185
+ <input
186
+ type="text"
187
+ id="image-alt"
188
+ name="alt"
189
+ placeholder="Description of the image"
190
+ />
191
+ <small>Alternative text for accessibility (recommended)</small>
192
+ </div>
193
+
194
+ <div class="form-row">
195
+ <div class="form-group">
196
+ <label for="image-width">Width</label>
197
+ <input
198
+ type="text"
199
+ id="image-width"
200
+ name="width"
201
+ placeholder="auto"
202
+ />
203
+ </div>
204
+
205
+ <div class="form-group">
206
+ <label for="image-height">Height</label>
207
+ <input
208
+ type="text"
209
+ id="image-height"
210
+ name="height"
211
+ placeholder="auto"
212
+ />
213
+ </div>
214
+ </div>
215
+
216
+ <div class="image-preview" id="image-preview" style="display: none;">
217
+ <strong>Preview:</strong>
218
+ <img id="preview-img" style="max-width: 100%; max-height: 200px; margin-top: 8px;" />
219
+ </div>
220
+
221
+ <div class="form-actions">
222
+ <button type="button" class="btn btn-secondary" data-action="cancel">
223
+ Cancel
224
+ </button>
225
+ <button type="submit" class="btn btn-primary">
226
+ Insert Image
227
+ </button>
228
+ </div>
229
+ </form>
230
+ `}show(){this.dialog.show(),this.attachImagePreview(),this.attachFileUpload()}close(){this.dialog.close()}attachImagePreview(){const e=document.querySelector(".image-dialog-form");if(!e)return;const t=e.querySelector("#image-src"),i=e.querySelector("#image-preview"),n=e.querySelector("#preview-img");t==null||t.addEventListener("input",()=>{const s=t.value.trim();s&&this.isValidImageUrl(s)?(n.src=s,i.style.display="block",n.onerror=()=>{i.style.display="none"}):i.style.display="none"})}attachFileUpload(){if(!this.config.allowUpload)return;const e=document.querySelector(".image-dialog-form");if(!e)return;const t=e.querySelector("#image-upload"),i=e.querySelector("#image-src");t==null||t.addEventListener("change",async n=>{var r;const s=(r=n.target.files)==null?void 0:r[0];if(!s)return;const o=new FileReader;o.onload=c=>{var u;const h=(u=c.target)==null?void 0:u.result;i.value=h,i.dispatchEvent(new Event("input"))},o.readAsDataURL(s)})}isValidImageUrl(e){try{return new URL(e),/\.(jpg|jpeg|png|gif|svg|webp|bmp)$/i.test(e)||e.startsWith("data:image/")}catch(t){return!1}}}class D{constructor(e){this.onSubmit=e.onSubmit;const t=this.createContent();this.dialog=new m({title:"Insert Math Equation",content:t,buttons:[{label:"Cancel",onClick:()=>this.dialog.close()},{label:"Insert",onClick:()=>this.handleSubmit(),primary:!0}]}),this.latexInput=t.querySelector("#math-latex"),this.previewDiv=t.querySelector("#math-preview"),this.displayTypeSelect=t.querySelector("#math-display-type"),this.latexInput.addEventListener("input",()=>this.updatePreview())}createContent(){const e=document.createElement("div");return e.className="math-dialog-content",e.style.minWidth="500px",e.innerHTML=`
231
+ <style>
232
+ .math-dialog-content {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 1rem;
236
+ }
237
+ .math-form-group {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 0.5rem;
241
+ }
242
+ .math-form-group label {
243
+ font-weight: 500;
244
+ color: #333;
245
+ }
246
+ .math-latex-input {
247
+ width: 100%;
248
+ min-height: 80px;
249
+ padding: 0.5rem;
250
+ border: 1px solid #ddd;
251
+ border-radius: 4px;
252
+ font-family: 'Courier New', monospace;
253
+ font-size: 14px;
254
+ resize: vertical;
255
+ }
256
+ .math-preview {
257
+ padding: 1rem;
258
+ background: #f9f9f9;
259
+ border: 1px solid #ddd;
260
+ border-radius: 4px;
261
+ min-height: 60px;
262
+ font-size: 18px;
263
+ text-align: center;
264
+ }
265
+ .math-preview:empty::before {
266
+ content: 'Preview will appear here...';
267
+ color: #999;
268
+ font-style: italic;
269
+ }
270
+ .math-symbols {
271
+ display: grid;
272
+ grid-template-columns: repeat(8, 1fr);
273
+ gap: 0.5rem;
274
+ padding: 0.5rem;
275
+ background: #f5f5f5;
276
+ border-radius: 4px;
277
+ }
278
+ .math-symbol-btn {
279
+ padding: 0.5rem;
280
+ border: 1px solid #ddd;
281
+ background: white;
282
+ border-radius: 4px;
283
+ cursor: pointer;
284
+ font-size: 18px;
285
+ transition: all 0.2s;
286
+ }
287
+ .math-symbol-btn:hover {
288
+ background: #e3f2fd;
289
+ border-color: #2196f3;
290
+ }
291
+ .math-display-select {
292
+ padding: 0.5rem;
293
+ border: 1px solid #ddd;
294
+ border-radius: 4px;
295
+ font-size: 14px;
296
+ }
297
+ </style>
298
+
299
+ <div class="math-form-group">
300
+ <label for="math-latex">LaTeX Expression:</label>
301
+ <textarea
302
+ id="math-latex"
303
+ class="math-latex-input"
304
+ placeholder="Enter LaTeX (e.g., x^2 + y^2 = r^2)"
305
+ ></textarea>
306
+ </div>
307
+
308
+ <div class="math-form-group">
309
+ <label>Common Symbols:</label>
310
+ <div class="math-symbols">
311
+ <button class="math-symbol-btn" data-symbol="\\frac{a}{b}" title="Fraction">a/b</button>
312
+ <button class="math-symbol-btn" data-symbol="x^{2}" title="Superscript">xยฒ</button>
313
+ <button class="math-symbol-btn" data-symbol="x_{i}" title="Subscript">xแตข</button>
314
+ <button class="math-symbol-btn" data-symbol="\\sqrt{x}" title="Square root">โˆšx</button>
315
+ <button class="math-symbol-btn" data-symbol="\\sum" title="Sum">โˆ‘</button>
316
+ <button class="math-symbol-btn" data-symbol="\\int" title="Integral">โˆซ</button>
317
+ <button class="math-symbol-btn" data-symbol="\\pi" title="Pi">ฯ€</button>
318
+ <button class="math-symbol-btn" data-symbol="\\alpha" title="Alpha">ฮฑ</button>
319
+ <button class="math-symbol-btn" data-symbol="\\beta" title="Beta">ฮฒ</button>
320
+ <button class="math-symbol-btn" data-symbol="\\gamma" title="Gamma">ฮณ</button>
321
+ <button class="math-symbol-btn" data-symbol="\\theta" title="Theta">ฮธ</button>
322
+ <button class="math-symbol-btn" data-symbol="\\lambda" title="Lambda">ฮป</button>
323
+ <button class="math-symbol-btn" data-symbol="\\infty" title="Infinity">โˆž</button>
324
+ <button class="math-symbol-btn" data-symbol="\\leq" title="Less or equal">โ‰ค</button>
325
+ <button class="math-symbol-btn" data-symbol="\\geq" title="Greater or equal">โ‰ฅ</button>
326
+ <button class="math-symbol-btn" data-symbol="\\neq" title="Not equal">โ‰ </button>
327
+ </div>
328
+ </div>
329
+
330
+ <div class="math-form-group">
331
+ <label for="math-preview">Preview:</label>
332
+ <div id="math-preview" class="math-preview"></div>
333
+ </div>
334
+
335
+ <div class="math-form-group">
336
+ <label for="math-display-type">Display Type:</label>
337
+ <select id="math-display-type" class="math-display-select">
338
+ <option value="inline">Inline (within text)</option>
339
+ <option value="block">Block (centered, new line)</option>
340
+ </select>
341
+ </div>
342
+ `,e.querySelectorAll(".math-symbol-btn").forEach(i=>{i.addEventListener("click",n=>{n.preventDefault();const s=i.getAttribute("data-symbol");if(s&&this.latexInput){const o=this.latexInput.selectionStart,r=this.latexInput.selectionEnd,c=this.latexInput.value;this.latexInput.value=c.substring(0,o)+s+c.substring(r),this.latexInput.focus(),this.latexInput.selectionStart=this.latexInput.selectionEnd=o+s.length,this.updatePreview()}})}),e}updatePreview(){const e=this.latexInput.value.trim();if(!e){this.previewDiv.textContent="";return}let t=e.replace(/\\frac\{([^}]+)\}\{([^}]+)\}/g,"($1)/($2)").replace(/\^\{([^}]+)\}/g,"^$1").replace(/\_\{([^}]+)\}/g,"_$1").replace(/\\sqrt\{([^}]+)\}/g,"โˆš($1)").replace(/\\sum/g,"โˆ‘").replace(/\\int/g,"โˆซ").replace(/\\pi/g,"ฯ€").replace(/\\alpha/g,"ฮฑ").replace(/\\beta/g,"ฮฒ").replace(/\\gamma/g,"ฮณ").replace(/\\theta/g,"ฮธ").replace(/\\lambda/g,"ฮป").replace(/\\infty/g,"โˆž").replace(/\\leq/g,"โ‰ค").replace(/\\geq/g,"โ‰ฅ").replace(/\\neq/g,"โ‰ ");this.previewDiv.textContent=t}handleSubmit(){const e=this.latexInput.value.trim();if(!e){alert("Please enter a LaTeX expression.");return}const t=this.displayTypeSelect.value;this.onSubmit({latex:e,display:t}),this.dialog.close()}show(){this.dialog.show(),this.latexInput.value="",this.previewDiv.textContent="",this.displayTypeSelect.value="inline",setTimeout(()=>this.latexInput.focus(),100)}close(){this.dialog.close()}}class I{constructor(e){this.characters={common:["ยฉ","ยฎ","โ„ข","ยง","ยถ","โ€ ","โ€ก","โ€ข","โ€ฃ","โƒ","โ—ฆ","โ–ช","โ–ซ","โ—Š","โ—‹","โ—","โ–ก","โ– ","โ–ณ","โ–ฒ","โ–ฝ","โ–ผ","โ—‡","โ—†","โ˜…","โ˜†"],arrows:["โ†","โ†’","โ†‘","โ†“","โ†”","โ†•","โ‡","โ‡’","โ‡‘","โ‡“","โ‡”","โ‡•","โŸต","โŸถ","โŸท","โ†–","โ†—","โ†˜","โ†™","โ‡–","โ‡—","โ‡˜","โ‡™"],currency:["$","โ‚ฌ","ยฃ","ยฅ","โ‚น","โ‚ฝ","โ‚ฉ","โ‚ช","โ‚ฆ","เธฟ","โ‚ด","โ‚ก","โ‚ต","โ‚ธ","โ‚ซ","โ‚ฑ","โ‚ฒ","โ‚ณ","โ‚ญ"],math:["ยฑ","ร—","รท","=","โ‰ ","โ‰ˆ","โ‰ก","โ‰ค","โ‰ฅ","<",">","โˆž","โˆ‘","โˆ","โˆซ","โˆ‚","โˆš","โˆ›","โˆœ","ยฐ","โ€ฒ","โ€ณ","โˆ ","โˆŸ","โŠฅ","โˆฅ"],greek:["ฮฑ","ฮฒ","ฮณ","ฮด","ฮต","ฮถ","ฮท","ฮธ","ฮน","ฮบ","ฮป","ฮผ","ฮฝ","ฮพ","ฮฟ","ฯ€","ฯ","ฯƒ","ฯ„","ฯ…","ฯ†","ฯ‡","ฯˆ","ฯ‰","ฮ‘","ฮ’","ฮ“","ฮ”","ฮ•","ฮ–","ฮ—","ฮ˜"],punctuation:["โ€š","โ€ž","โ€œ","โ€","โ€˜","โ€™","ยซ","ยป","โ€น","โ€บ","โ€”","โ€“","โ€ฆ","ยท","ยก","ยฟ","โ€ฐ","โ€ฒ","โ€ณ","โ€ด"],superscript:["โฐ","ยน","ยฒ","ยณ","โด","โต","โถ","โท","โธ","โน","โบ","โป","โผ","โฝ","โพ","โฟ","โฑ"],subscript:["โ‚€","โ‚","โ‚‚","โ‚ƒ","โ‚„","โ‚…","โ‚†","โ‚‡","โ‚ˆ","โ‚‰","โ‚Š","โ‚‹","โ‚Œ","โ‚","โ‚Ž"]},this.onSelect=e.onSelect;const t=this.createContent();this.dialog=new m({title:"Insert Special Character",content:t,buttons:[{label:"Close",onClick:()=>this.dialog.close()}]}),this.searchInput=t.querySelector("#char-search"),this.categorySelect=t.querySelector("#char-category"),this.charactersGrid=t.querySelector("#char-grid"),this.searchInput.addEventListener("input",()=>this.filterCharacters()),this.categorySelect.addEventListener("change",()=>this.updateGrid()),this.updateGrid()}createContent(){const e=document.createElement("div");return e.className="character-dialog-content",e.style.minWidth="500px",e.innerHTML=`
343
+ <style>
344
+ .character-dialog-content {
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: 1rem;
348
+ }
349
+ .char-controls {
350
+ display: flex;
351
+ gap: 0.5rem;
352
+ }
353
+ .char-search, .char-category {
354
+ padding: 0.5rem;
355
+ border: 1px solid #ddd;
356
+ border-radius: 4px;
357
+ font-size: 14px;
358
+ }
359
+ .char-search {
360
+ flex: 1;
361
+ }
362
+ .char-category {
363
+ min-width: 150px;
364
+ }
365
+ .char-grid {
366
+ display: grid;
367
+ grid-template-columns: repeat(10, 1fr);
368
+ gap: 0.5rem;
369
+ max-height: 300px;
370
+ overflow-y: auto;
371
+ padding: 1rem;
372
+ background: #f9f9f9;
373
+ border: 1px solid #ddd;
374
+ border-radius: 4px;
375
+ }
376
+ .char-button {
377
+ aspect-ratio: 1;
378
+ display: flex;
379
+ align-items: center;
380
+ justify-content: center;
381
+ padding: 0.5rem;
382
+ border: 1px solid #ddd;
383
+ background: white;
384
+ border-radius: 4px;
385
+ cursor: pointer;
386
+ font-size: 20px;
387
+ transition: all 0.2s;
388
+ }
389
+ .char-button:hover {
390
+ background: #e3f2fd;
391
+ border-color: #2196f3;
392
+ transform: scale(1.1);
393
+ }
394
+ .char-info {
395
+ padding: 0.5rem;
396
+ background: #f5f5f5;
397
+ border-radius: 4px;
398
+ font-size: 12px;
399
+ color: #666;
400
+ text-align: center;
401
+ }
402
+ </style>
403
+
404
+ <div class="char-controls">
405
+ <input
406
+ type="text"
407
+ id="char-search"
408
+ class="char-search"
409
+ placeholder="Search characters..."
410
+ />
411
+ <select id="char-category" class="char-category">
412
+ <option value="all">All Categories</option>
413
+ <option value="common">Common Symbols</option>
414
+ <option value="arrows">Arrows</option>
415
+ <option value="currency">Currency</option>
416
+ <option value="math">Mathematics</option>
417
+ <option value="greek">Greek Letters</option>
418
+ <option value="punctuation">Punctuation</option>
419
+ <option value="superscript">Superscript</option>
420
+ <option value="subscript">Subscript</option>
421
+ </select>
422
+ </div>
423
+
424
+ <div id="char-grid" class="char-grid"></div>
425
+
426
+ <div class="char-info">
427
+ Click any character to insert it into your document.
428
+ </div>
429
+ `,e}updateGrid(){const e=this.categorySelect.value;this.charactersGrid.innerHTML="";let t=[];e==="all"?t=Object.values(this.characters).flat():t=this.characters[e]||[],t.forEach(i=>{const n=document.createElement("button");n.className="char-button",n.textContent=i,n.title=`Insert ${i} (U+${i.charCodeAt(0).toString(16).toUpperCase()})`,n.addEventListener("click",s=>{s.preventDefault(),this.handleSelect(i)}),this.charactersGrid.appendChild(n)})}filterCharacters(){const e=this.searchInput.value.toLowerCase();this.charactersGrid.querySelectorAll(".char-button").forEach(i=>{const n=i.textContent||"",s=`u+${n.charCodeAt(0).toString(16)}`,o=!e||n.includes(e)||s.includes(e);i.style.display=o?"flex":"none"})}handleSelect(e){this.onSelect(e),this.dialog.close()}show(){this.dialog.show(),this.searchInput.value="",this.categorySelect.value="all",this.updateGrid(),setTimeout(()=>this.searchInput.focus(),100)}close(){this.dialog.close()}}class F{constructor(e){this.emojis={popular:["๐Ÿ˜€","๐Ÿ˜ƒ","๐Ÿ˜„","๐Ÿ˜","๐Ÿ˜Š","๐Ÿ˜","๐Ÿคฉ","๐Ÿ˜˜","๐Ÿ˜—","๐Ÿ˜š","๐Ÿ˜™","๐Ÿ™‚","๐Ÿค—","๐Ÿค”","๐Ÿคจ","๐Ÿ˜","๐Ÿ˜‘","๐Ÿ˜ถ","๐Ÿ™„","๐Ÿ˜","๐Ÿ‘","๐Ÿ‘Ž","๐Ÿ‘Œ","โœŒ๏ธ","๐Ÿคž","๐Ÿค","๐Ÿ‘","๐Ÿ™Œ","๐Ÿ‘‹","๐Ÿคš","โœ‹","๐Ÿ–๏ธ","๐Ÿ––","๐Ÿ‘Š","โœŠ","๐Ÿค›","๐Ÿคœ","๐Ÿ’ช"],smileys:["๐Ÿ˜€","๐Ÿ˜ƒ","๐Ÿ˜„","๐Ÿ˜","๐Ÿ˜†","๐Ÿ˜…","๐Ÿคฃ","๐Ÿ˜‚","๐Ÿ™‚","๐Ÿ™ƒ","๐Ÿ˜‰","๐Ÿ˜Š","๐Ÿ˜‡","๐Ÿฅฐ","๐Ÿ˜","๐Ÿคฉ","๐Ÿ˜˜","๐Ÿ˜—","๐Ÿ˜š","๐Ÿ˜™","๐Ÿ˜‹","๐Ÿ˜›","๐Ÿ˜œ","๐Ÿคช","๐Ÿ˜","๐Ÿค‘","๐Ÿค—","๐Ÿคญ","๐Ÿคซ","๐Ÿค”"],emotions:["๐Ÿ˜ณ","๐Ÿ˜ž","๐Ÿ˜Ÿ","๐Ÿ˜ ","๐Ÿ˜ก","๐Ÿคฌ","๐Ÿ˜”","๐Ÿ˜•","๐Ÿ™","๐Ÿ˜ฌ","๐Ÿฅบ","๐Ÿ˜ฃ","๐Ÿ˜–","๐Ÿ˜ซ","๐Ÿ˜ฉ","๐Ÿฅฑ","๐Ÿ˜ค","๐Ÿ˜ฎ","๐Ÿ˜ฑ","๐Ÿ˜จ","๐Ÿ˜ฐ","๐Ÿ˜ฅ","๐Ÿ˜ข","๐Ÿ˜ญ","๐Ÿ˜ช","๐Ÿ˜“","๐Ÿคค","๐Ÿ˜ด","๐Ÿ˜ท","๐Ÿค’"],gestures:["๐Ÿ‘","๐Ÿ‘Ž","๐Ÿ‘Œ","โœŒ๏ธ","๐Ÿคž","๐ŸคŸ","๐Ÿค˜","๐Ÿค™","๐Ÿ‘ˆ","๐Ÿ‘‰","๐Ÿ‘†","๐Ÿ‘‡","โ˜๏ธ","๐Ÿ‘‹","๐Ÿคš","โœ‹","๐Ÿ–๏ธ","๐Ÿ––","๐Ÿ‘","๐Ÿ™Œ","๐Ÿ‘","๐Ÿคฒ","๐Ÿค","๐Ÿ™","โœ๏ธ","๐Ÿ’…","๐Ÿคณ","๐Ÿ’ช","๐Ÿฆพ","๐Ÿฆฟ"],people:["๐Ÿ‘ถ","๐Ÿ‘ง","๐Ÿง’","๐Ÿ‘ฆ","๐Ÿ‘ฉ","๐Ÿง‘","๐Ÿ‘จ","๐Ÿ‘ต","๐Ÿง“","๐Ÿ‘ด","๐Ÿ‘ฒ","๐Ÿ‘ณ","๐Ÿง•","๐Ÿ‘ฎ","๐Ÿ‘ท","๐Ÿ’‚","๐Ÿ•ต๏ธ","๐Ÿ‘ฉโ€โš•๏ธ","๐Ÿ‘จโ€โš•๏ธ","๐Ÿ‘ฉโ€๐ŸŽ“","๐Ÿ‘จโ€๐ŸŽ“","๐Ÿ‘ฉโ€๐Ÿซ","๐Ÿ‘จโ€๐Ÿซ","๐Ÿ‘ฉโ€โš–๏ธ","๐Ÿ‘จโ€โš–๏ธ","๐Ÿ‘ฉโ€๐ŸŒพ","๐Ÿ‘จโ€๐ŸŒพ","๐Ÿ‘ฉโ€๐Ÿณ","๐Ÿ‘จโ€๐Ÿณ","๐Ÿ‘ฉโ€๐Ÿ”ง"],animals:["๐Ÿถ","๐Ÿฑ","๐Ÿญ","๐Ÿน","๐Ÿฐ","๐ŸฆŠ","๐Ÿป","๐Ÿผ","๐Ÿจ","๐Ÿฏ","๐Ÿฆ","๐Ÿฎ","๐Ÿท","๐Ÿธ","๐Ÿต","๐Ÿ™ˆ","๐Ÿ™‰","๐Ÿ™Š","๐Ÿ”","๐Ÿง","๐Ÿฆ","๐Ÿค","๐Ÿฃ","๐Ÿฅ","๐Ÿฆ†","๐Ÿฆ…","๐Ÿฆ‰","๐Ÿฆ‡","๐Ÿบ","๐Ÿ—"],nature:["๐ŸŒต","๐ŸŽ„","๐ŸŒฒ","๐ŸŒณ","๐ŸŒด","๐ŸŒฑ","๐ŸŒฟ","โ˜˜๏ธ","๐Ÿ€","๐ŸŽ","๐ŸŽ‹","๐Ÿƒ","๐Ÿ‚","๐Ÿ","๐Ÿ„","๐ŸŒพ","๐Ÿ’","๐ŸŒท","๐ŸŒน","๐Ÿฅ€","๐ŸŒบ","๐ŸŒธ","๐ŸŒผ","๐ŸŒป","๐ŸŒž","๐ŸŒ","๐ŸŒ›","๐ŸŒœ","โญ","๐ŸŒŸ"],food:["๐Ÿ","๐ŸŽ","๐Ÿ","๐ŸŠ","๐Ÿ‹","๐ŸŒ","๐Ÿ‰","๐Ÿ‡","๐Ÿ“","๐Ÿˆ","๐Ÿ’","๐Ÿ‘","๐Ÿฅญ","๐Ÿ","๐Ÿฅฅ","๐Ÿฅ","๐Ÿ…","๐Ÿ†","๐Ÿฅ‘","๐Ÿฅฆ","๐Ÿฅฌ","๐Ÿฅ’","๐ŸŒถ๏ธ","๐ŸŒฝ","๐Ÿฅ•","๐Ÿง„","๐Ÿง…","๐Ÿฅ”","๐Ÿ ","๐Ÿฅ"],objects:["โŒš","๐Ÿ“ฑ","๐Ÿ’ป","โŒจ๏ธ","๐Ÿ–ฅ๏ธ","๐Ÿ–จ๏ธ","๐Ÿ–ฑ๏ธ","๐Ÿ•น๏ธ","๐Ÿ’พ","๐Ÿ’ฟ","๐Ÿ“€","๐Ÿ“ท","๐Ÿ“น","๐ŸŽฅ","๐Ÿ“ž","โ˜Ž๏ธ","๐Ÿ“Ÿ","๐Ÿ“ ","๐Ÿ“บ","๐Ÿ“ป","๐ŸŽ™๏ธ","๐ŸŽš๏ธ","๐ŸŽ›๏ธ","๐Ÿงญ","โฑ๏ธ","โฐ","๐Ÿ“ก","๐Ÿ”‹","๐Ÿ”Œ","๐Ÿ’ก"],symbols:["โค๏ธ","๐Ÿงก","๐Ÿ’›","๐Ÿ’š","๐Ÿ’™","๐Ÿ’œ","๐Ÿ–ค","๐Ÿค","๐ŸคŽ","๐Ÿ’”","โฃ๏ธ","๐Ÿ’•","๐Ÿ’ž","๐Ÿ’“","๐Ÿ’—","๐Ÿ’–","๐Ÿ’˜","๐Ÿ’","โœจ","๐Ÿ’ซ","โญ","๐ŸŒŸ","โœ”๏ธ","โœ…","โŒ","โŽ","โž•","โž–","โœ–๏ธ","โž—"],activities:["โšฝ","๐Ÿ€","๐Ÿˆ","โšพ","๐ŸฅŽ","๐ŸŽพ","๐Ÿ","๐Ÿ‰","๐Ÿฅ","๐ŸŽฑ","๐Ÿช€","๐Ÿ“","๐Ÿธ","๐Ÿ’","๐Ÿ‘","๐Ÿฅ","๐Ÿ","๐Ÿชƒ","๐Ÿฅ…","โ›ณ","๐Ÿช","๐Ÿน","๐ŸŽฃ","๐Ÿคฟ","๐ŸฅŠ","๐Ÿฅ‹","๐ŸŽฝ","๐Ÿ›น","๐Ÿ›ผ","๐Ÿ›ท"]},this.onSelect=e.onSelect;const t=this.createContent();this.dialog=new m({title:"Insert Emoji",content:t,buttons:[{label:"Close",onClick:()=>this.dialog.close()}]}),this.searchInput=t.querySelector("#emoji-search"),this.categorySelect=t.querySelector("#emoji-category"),this.emojisGrid=t.querySelector("#emoji-grid"),this.searchInput.addEventListener("input",()=>this.filterEmojis()),this.categorySelect.addEventListener("change",()=>this.updateGrid()),this.updateGrid()}createContent(){const e=document.createElement("div");return e.className="emoji-dialog-content",e.style.minWidth="500px",e.innerHTML=`
430
+ <style>
431
+ .emoji-dialog-content {
432
+ display: flex;
433
+ flex-direction: column;
434
+ gap: 1rem;
435
+ }
436
+ .emoji-controls {
437
+ display: flex;
438
+ gap: 0.5rem;
439
+ }
440
+ .emoji-search, .emoji-category {
441
+ padding: 0.5rem;
442
+ border: 1px solid #ddd;
443
+ border-radius: 4px;
444
+ font-size: 14px;
445
+ }
446
+ .emoji-search {
447
+ flex: 1;
448
+ }
449
+ .emoji-category {
450
+ min-width: 150px;
451
+ }
452
+ .emoji-grid {
453
+ display: grid;
454
+ grid-template-columns: repeat(10, 1fr);
455
+ gap: 0.5rem;
456
+ max-height: 350px;
457
+ overflow-y: auto;
458
+ padding: 1rem;
459
+ background: #f9f9f9;
460
+ border: 1px solid #ddd;
461
+ border-radius: 4px;
462
+ }
463
+ .emoji-button {
464
+ aspect-ratio: 1;
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ padding: 0.5rem;
469
+ border: 1px solid #ddd;
470
+ background: white;
471
+ border-radius: 4px;
472
+ cursor: pointer;
473
+ font-size: 24px;
474
+ transition: all 0.2s;
475
+ }
476
+ .emoji-button:hover {
477
+ background: #fff3e0;
478
+ border-color: #ff9800;
479
+ transform: scale(1.15);
480
+ }
481
+ .emoji-info {
482
+ padding: 0.5rem;
483
+ background: #f5f5f5;
484
+ border-radius: 4px;
485
+ font-size: 12px;
486
+ color: #666;
487
+ text-align: center;
488
+ }
489
+ </style>
490
+
491
+ <div class="emoji-controls">
492
+ <input
493
+ type="text"
494
+ id="emoji-search"
495
+ class="emoji-search"
496
+ placeholder="Search emojis..."
497
+ />
498
+ <select id="emoji-category" class="emoji-category">
499
+ <option value="all">All Emojis</option>
500
+ <option value="popular">Popular</option>
501
+ <option value="smileys">Smileys & Faces</option>
502
+ <option value="emotions">Emotions</option>
503
+ <option value="gestures">Gestures & Hands</option>
504
+ <option value="people">People</option>
505
+ <option value="animals">Animals</option>
506
+ <option value="nature">Nature</option>
507
+ <option value="food">Food & Drink</option>
508
+ <option value="objects">Objects</option>
509
+ <option value="symbols">Symbols</option>
510
+ <option value="activities">Activities & Sports</option>
511
+ </select>
512
+ </div>
513
+
514
+ <div id="emoji-grid" class="emoji-grid"></div>
515
+
516
+ <div class="emoji-info">
517
+ Click any emoji to insert it into your document.
518
+ </div>
519
+ `,e}updateGrid(){const e=this.categorySelect.value;this.emojisGrid.innerHTML="";let t=[];e==="all"?t=Object.values(this.emojis).flat():t=this.emojis[e]||[],t.forEach(i=>{const n=document.createElement("button");n.className="emoji-button",n.textContent=i,n.title=`Insert ${i}`,n.addEventListener("click",s=>{s.preventDefault(),this.handleSelect(i)}),this.emojisGrid.appendChild(n)})}filterEmojis(){const e=this.searchInput.value.toLowerCase();this.emojisGrid.querySelectorAll(".emoji-button").forEach(i=>{const n=i.textContent||"",s=!e||n.includes(e);i.style.display=s?"flex":"none"})}handleSelect(e){this.onSelect(e),this.dialog.close()}show(){this.dialog.show(),this.searchInput.value="",this.categorySelect.value="popular",this.updateGrid(),setTimeout(()=>this.searchInput.focus(),100)}close(){this.dialog.close()}}class b{constructor(e={}){this.changeListeners=[],this.options=e,this.engine=new a.EditorEngine({content:e.content,plugins:e.plugins||[],readonly:e.readonly}),e.onChange&&this.onChange(e.onChange),this.engine.on("change",()=>{const t=this.getHTML();this.changeListeners.forEach(i=>i(t))})}mount(e,t){this.contentElement=e,this.toolbarElement=t,this.contentElement.contentEditable=this.options.readonly?"false":"true",this.contentElement.className="rte-content",this.options.content&&(this.contentElement.innerHTML=this.options.content),this.options.toolbar!==!1&&this.toolbarElement&&(this.toolbar=new a.ToolbarRenderer({items:typeof this.options.toolbar=="string"?this.options.toolbar:void 0},this.options.plugins||[]),this.toolbar.setCommandHandler((i,n)=>{this.execCommand(i,n)}),this.toolbar.render(this.toolbarElement)),this.contentElement.addEventListener("input",()=>{const i=this.getHTML();this.changeListeners.forEach(n=>n(i))}),this.options.onInit&&this.options.onInit(this.getAPI())}getHTML(){var e;return((e=this.contentElement)==null?void 0:e.innerHTML)||""}setHTML(e){this.contentElement&&(this.contentElement.innerHTML=e)}execCommand(e,t){const i=this.engine.execCommand(e,t);return this.toolbar,i}focus(){var e;(e=this.contentElement)==null||e.focus()}blur(){var e;(e=this.contentElement)==null||e.blur()}onChange(e){return this.changeListeners.push(e),()=>{const t=this.changeListeners.indexOf(e);t>-1&&this.changeListeners.splice(t,1)}}registerCommand(e,t){if(typeof window!="undefined"){const i=window.__editorCommands||new Map;i.set(e,t),window.__editorCommands=i}}getState(){return{plugins:this.options.plugins,config:this.options,engine:this.engine.getState()}}getAPI(){var e;return{getHTML:()=>this.getHTML(),setHTML:t=>this.setHTML(t),execCommand:(t,i)=>this.execCommand(t,i),focus:()=>this.focus(),blur:()=>this.blur(),destroy:()=>this.destroy(),registerCommand:(t,i)=>this.registerCommand(t,i),onChange:t=>this.onChange(t),getState:()=>this.getState(),toolbar:{items:((e=this.options.plugins)==null?void 0:e.flatMap(t=>t.toolbar||[]))||[]}}}destroy(){var e;this.engine.destroy(),(e=this.toolbar)==null||e.destroy(),this.changeListeners=[],this.options.onDestroy&&this.options.onDestroy()}}function P(l){return new b(l)}class y{constructor(e){this.options=e,this.containerElement=e.element;const t=this.resolvePlugins(e.plugins);this.engine=new a.EditorEngine({content:e.content,plugins:t,readonly:e.readonly}),this.initializeDOM()}resolvePlugins(e){return e?typeof e=="string"?(console.warn("String-based plugin loading not yet implemented for VanillaAdapter"),[]):e:[]}initializeDOM(){this.containerElement.innerHTML="",this.containerElement.classList.add("editora-editor"),this.options.enableToolbar!==!1&&this.options.toolbar!==!1&&(this.toolbarElement=document.createElement("div"),this.toolbarElement.className="editora-toolbar-container",this.containerElement.appendChild(this.toolbarElement),this.toolbar=new a.ToolbarRenderer({items:typeof this.options.toolbar=="string"?this.options.toolbar:void 0},this.options.plugins||[]),this.toolbar.setCommandHandler((e,t)=>{this.execCommand(e,t)}),this.toolbar.render(this.toolbarElement)),this.contentElement=document.createElement("div"),this.contentElement.className="editora-content",this.contentElement.contentEditable=this.options.readonly?"false":"true",this.contentElement.style.minHeight="200px",this.contentElement.style.outline="none",this.contentElement.style.padding="12px",this.options.content&&(this.contentElement.innerHTML=this.options.content),this.containerElement.appendChild(this.contentElement),this.contentElement.addEventListener("input",()=>{this.containerElement.dispatchEvent(new CustomEvent("change",{detail:{html:this.getContent()}}))})}getContent(){var e;return((e=this.contentElement)==null?void 0:e.innerHTML)||""}setContent(e){this.contentElement&&(this.contentElement.innerHTML=e)}execCommand(e,t){return this.engine.execCommand(e,t)}focus(){var e;(e=this.contentElement)==null||e.focus()}on(e,t){const i=n=>{t(n.detail)};return this.containerElement.addEventListener(e,i),()=>{this.containerElement.removeEventListener(e,i)}}destroy(){var e;this.engine.destroy(),(e=this.toolbar)==null||e.destroy(),this.containerElement.innerHTML=""}}function j(l){return new y(l)}function q(){typeof window!="undefined"&&!customElements.get("editora-editor")&&customElements.define("editora-editor",a.RichTextEditorElement)}exports.CommandRegistry=a.CommandRegistry;exports.ConfigResolver=a.ConfigResolver;exports.EditorEngine=a.EditorEngine;exports.EditorState=a.EditorState;exports.FloatingToolbar=a.FloatingToolbar;exports.PluginLoader=a.PluginLoader;exports.PluginManager=a.PluginManager;exports.RichTextEditorElement=a.RichTextEditorElement;exports.Schema=a.Schema;exports.StatusBar=a.StatusBar;exports.ToolbarRenderer=a.ToolbarRenderer;exports.calculateTextStats=a.calculateTextStats;exports.countLines=a.countLines;exports.getCursorPosition=a.getCursorPosition;exports.getSelectionInfo=a.getSelectionInfo;exports.getTextOffset=a.getTextOffset;exports.CharacterDialog=I;exports.ColorPicker=k;exports.Dialog=m;exports.DocumentModel=p;exports.Dropdown=C;exports.Editor=v;exports.EmojiDialog=F;exports.ImageDialog=T;exports.KeyboardShortcutManager=S;exports.LinkDialog=M;exports.MathDialog=D;exports.MediaPlugin=w;exports.PluginRuntime=f;exports.ReactAdapter=b;exports.SpellcheckPlugin=x;exports.TableDialog=L;exports.VanillaAdapter=y;exports.createEditor=j;exports.createPluginRuntime=E;exports.createReactAdapter=P;exports.initWebComponent=q;
520
+ //# sourceMappingURL=index.cjs.js.map