@qxs-bns/components-wc 0.0.2 → 0.0.3

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.
@@ -1,4 +1,4 @@
1
- import{Editor as e}from"@tiptap/core";import t from"@tiptap/extension-blockquote";import i from"@tiptap/extension-bold";import o from"@tiptap/extension-bullet-list";import r from"@tiptap/extension-code";import l from"@tiptap/extension-document";import s from"@tiptap/extension-heading";import n from"@tiptap/extension-history";import a from"@tiptap/extension-horizontal-rule";import d from"@tiptap/extension-image";import c from"@tiptap/extension-italic";import b from"@tiptap/extension-link";import p from"@tiptap/extension-list-item";import h from"@tiptap/extension-ordered-list";import g from"@tiptap/extension-paragraph";import u from"@tiptap/extension-strike";import{Table as x}from"@tiptap/extension-table";import{TableCell as m}from"@tiptap/extension-table-cell";import{TableHeader as v}from"@tiptap/extension-table-header";import{TableRow as f}from"@tiptap/extension-table-row";import _ from"@tiptap/extension-text";import y from"@tiptap/extension-text-align";import w from"@tiptap/extension-underline";import k from"../node_modules/.pnpm/@tiptap_extension-placeholder@3.20.5_@tiptap_extensions@3.20.5_@tiptap_core@3.20.5_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.mjs";import{css as C,LitElement as T,html as M}from"lit";import{property as $}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.mjs";import{state as A}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.mjs";import{safeCustomElement as R}from"../base/define.mjs";var B=Object.defineProperty,P=Object.getOwnPropertyDescriptor,S=(e,t,i,o)=>{for(var r,l=o>1?void 0:o?P(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(l=(o?r(t,i,l):r(l))||l);return o&&l&&B(t,i,l),l};let I=class extends T{constructor(){super(...arguments),this.content="",this.readonly=!1,this.preview=!1,this._editor=null,this._pendingContent=null,this._tableRows=3,this._tableCols=3,this._hoverRow=0,this._hoverCol=0,this._tableDropdownOpen=!1,this._isLoading=!0,this._tableCellToolbar={x:0,y:0,visible:!1,cellRow:0,cellCol:0},this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},this._imageToolbar={x:0,y:0,visible:!1},this._imageMoreMenuVisible=!1,this._hasSlashCommand=!1,this._tableEdgeDetectionSetup=!1}_initEditor(){if(this._editor)return;const C=this.shadowRoot?.querySelector(".editor-content");if(!C)return void requestAnimationFrame(()=>this._initEditor());this._isLoading=!1;const T=[l,g,_,i,c,w,u,r,s.configure({levels:[1,2,3]}),o,h,p,t,a,n,d.configure({inline:!1,allowBase64:!0}),b.configure({openOnClick:!1,HTMLAttributes:{rel:"noopener noreferrer"}}),y.configure({types:["heading","paragraph"]}),x.configure({resizable:!0}),f,m,v,k.configure({placeholder:"输入 / 唤出快捷命令"})];this._editor=new e({element:C,extensions:T,content:(this._pendingContent??this.content)||"<p></p>",editable:!this.readonly}),this._pendingContent=null,this._editor.on("selectionUpdate",()=>{this.requestUpdate(),this._updateBubbleMenuPosition(),this._editor?.isActive("table")?this._showTableCellToolbar():this._hideTableCellToolbar();const e=this._editor;if(e){const{selection:t}=e.state,{$from:i}=t;if("image"===i.node(i.depth).type.name){const t=e.view.coordsAtPos(i.start()),o=this.shadowRoot?.querySelector(".editor-wrapper")?.getBoundingClientRect();if(o){const e=t.left-o.left+(t.right-t.left)/2,i=t.top-o.top-40;this._showImageToolbar({x:e,y:i})}}else this._hideImageToolbar()}}),this._editor.on("transaction",()=>{this.requestUpdate(),this._editor?.isActive("table")?this._showTableCellToolbar():this._hideTableCellToolbar(),this._checkSlashCommand(),this._setupTableEdgeDetection()})}_setupTableEdgeDetection(){const e=this.shadowRoot?.querySelector(".editor-content");e&&!this._tableEdgeDetectionSetup&&(this._tableEdgeDetectionSetup=!0,e.addEventListener("mousemove",e=>{this._handleTableEdgeMouseMove(e)}),e.addEventListener("mouseleave",()=>{this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}}}),e.addEventListener("click",e=>{const t=e.target;if("IMG"===t.tagName){const e=this._editor?.view.posAtDOM(t,0);void 0!==e&&this._editor?.chain().focus().setNodeSelection(e).run()}}))}_handleTableEdgeMouseMove(e){if(!this._editor?.isActive("table"))return this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},void this.requestUpdate();const t=e.target.closest("table");if(!t)return this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},void this.requestUpdate();const i=t.getBoundingClientRect(),o=this.shadowRoot?.querySelector(".editor-wrapper");if(!o)return;const r=o.getBoundingClientRect(),l=e.clientX-r.left,s=e.clientY-r.top,n=10,a=i.height/t.rows.length;for(let o=0;o<t.rows.length;o++){const t=i.top+o*a,s=t+a;if(e.clientY>=t-n&&e.clientY<=t+n)return this._tableEdgeHover={type:"row",index:o,position:{x:l,y:t-r.top}},void this.requestUpdate();if(e.clientY>=s-n&&e.clientY<=s+n)return this._tableEdgeHover={type:"row",index:o+1,position:{x:l,y:s-r.top}},void this.requestUpdate()}const d=i.width/t.rows[0]?.cells.length||1;for(let o=0;o<(t.rows[0]?.cells.length||0);o++){const t=i.left+o*d,l=t+d;if(e.clientX>=t-n&&e.clientX<=t+n)return this._tableEdgeHover={type:"col",index:o,position:{x:t-r.left,y:s}},void this.requestUpdate();if(e.clientX>=l-n&&e.clientX<=l+n)return this._tableEdgeHover={type:"col",index:o+1,position:{x:l-r.left,y:s}},void this.requestUpdate()}this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},this.requestUpdate()}_checkSlashCommand(){if(!this._editor)return;const{selection:e}=this._editor.state,t=this._editor.state.doc.textBetween(Math.max(0,e.from-10),e.from," ");this._hasSlashCommand=t.endsWith("/")}firstUpdated(){this._initEditor()}updated(e){if(this._editor)return e.has("content")&&this._editor.commands.setContent(this.content||"<p></p>"),void(e.has("readonly")&&this._editor.setEditable(!this.readonly));e.has("content")&&(this._pendingContent=this.content);const t=this.shadowRoot?.querySelector(".editor-content");t&&!this._editor&&this._initEditor()}disconnectedCallback(){super.disconnectedCallback(),this._editor?.destroy(),this._editor=null}getContent(){return this._editor?.getHTML()??""}_applyFormat(e){if(this._hasSlashCommand&&this._editor){const{selection:e}=this._editor.state;this._editor.chain().focus().deleteRange({from:e.from-1,to:e.from}).run(),this._hasSlashCommand=!1}e()}_toggleBold(){this._applyFormat(()=>this._editor?.chain().focus().toggleBold().run())}_toggleItalic(){this._applyFormat(()=>this._editor?.chain().focus().toggleItalic().run())}_toggleUnderline(){this._applyFormat(()=>this._editor?.chain().focus().toggleUnderline().run())}_toggleStrike(){this._applyFormat(()=>this._editor?.chain().focus().toggleStrike().run())}_toggleCode(){this._applyFormat(()=>this._editor?.chain().focus().toggleCode().run())}_setHeading(e){this._applyFormat(()=>this._editor?.chain().focus().toggleHeading({level:e}).run())}_setParagraph(){this._applyFormat(()=>this._editor?.chain().focus().setParagraph().run())}_toggleBulletList(){this._applyFormat(()=>this._editor?.chain().focus().toggleBulletList().run())}_toggleOrderedList(){this._applyFormat(()=>this._editor?.chain().focus().toggleOrderedList().run())}_toggleBlockquote(){this._applyFormat(()=>this._editor?.chain().focus().toggleBlockquote().run())}_setTextAlign(e){this._applyFormat(()=>this._editor?.chain().focus().setTextAlign(e).run())}_setLink(){const e=window.prompt("请输入链接地址:");e&&this._applyFormat(()=>this._editor?.chain().focus().setLink({href:e}).run())}_unsetLink(){this._applyFormat(()=>this._editor?.chain().focus().unsetLink().run())}_insertTable(e,t){this._editor?.chain().focus().insertTable({rows:e??this._tableRows,cols:t??this._tableCols,withHeaderRow:!0}).run()}_handleImageUpload(e){const t=e.target,i=t.files?.[0];if(i){const e=new FileReader;e.onload=e=>{const t=e.target?.result;this._editor?.chain().focus().setImage({src:t}).run()},e.readAsDataURL(i)}t.value=""}_triggerImageUpload(){const e=this.shadowRoot?.querySelector(".image-input");e?.click()}_insertTableByClick(e,t){if(this._hasSlashCommand&&this._editor){const{selection:e}=this._editor.state;this._editor.chain().focus().deleteRange({from:e.from-1,to:e.from}).run(),this._hasSlashCommand=!1}this._tableRows=e,this._tableCols=t,this._insertTable(e,t)}_insertHorizontalRule(){this._editor?.chain().focus().setHorizontalRule().run()}_showTableCellToolbar(){if(!this._editor?.isActive("table"))return;const{state:e}=this._editor,{selection:t}=e,i=this._editor.view.coordsAtPos(t.from),o=this.shadowRoot?.querySelector(".editor-wrapper");if(!o)return;const r=o.getBoundingClientRect(),l=this._getTableCellRow(),s=this._getTableCellCol();(0===l||0===s)&&(this._tableCellToolbar={x:i.left-r.left,y:i.bottom-r.top+8,visible:!0,cellRow:l,cellCol:s})}_getTableCellRow(){if(!this._editor)return 0;const{selection:e}=this._editor.state,t=this._editor.state.doc.resolve(e.from);for(let e=t.depth;e>0;e--){if("tableCell"===t.node(e).type.name)return t.index(e-1)}return 0}_getTableCellCol(){if(!this._editor)return 0;const{selection:e}=this._editor.state,t=this._editor.state.doc.resolve(e.from);for(let e=t.depth;e>0;e--){if("tableCell"===t.node(e).type.name)return t.index(e)}return 0}_hideTableCellToolbar(){this._tableCellToolbar={...this._tableCellToolbar,visible:!1}}_addTableRowAbove(){this._editor?.chain().focus().addRowBefore().run(),this._hideTableCellToolbar()}_addTableRowBelow(){this._editor?.chain().focus().addRowAfter().run(),this._hideTableCellToolbar()}_addTableColumnLeft(){this._editor?.chain().focus().addColumnBefore().run(),this._hideTableCellToolbar()}_addTableColumnRight(){this._editor?.chain().focus().addColumnAfter().run(),this._hideTableCellToolbar()}_deleteTableRow(){this._editor?.chain().focus().deleteRow().run(),this._hideTableCellToolbar()}_deleteTableColumn(){this._editor?.chain().focus().deleteColumn().run(),this._hideTableCellToolbar()}_deleteTable(){this._editor?.chain().focus().deleteTable().run(),this._hideTableCellToolbar()}_showImageToolbar(e){this._imageToolbar={x:e.x,y:e.y,visible:!0},this._imageMoreMenuVisible=!1}_hideImageToolbar(){this._imageToolbar={...this._imageToolbar,visible:!1},this._imageMoreMenuVisible=!1}_toggleImageMoreMenu(){this._imageMoreMenuVisible=!this._imageMoreMenuVisible}_deleteImage(){this._editor?.chain().focus().deleteNode("image").run(),this._hideImageToolbar()}_insertImageAfter(){this._triggerImageUpload(),this._imageMoreMenuVisible=!1}_setImageAlignLeft(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 auto 0 0")}this._imageMoreMenuVisible=!1}_setImageAlignCenter(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 auto")}this._imageMoreMenuVisible=!1}_setImageAlignRight(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 0 0 auto")}this._imageMoreMenuVisible=!1}_updateImageToolbarPosition(){requestAnimationFrame(()=>{const e=this._editor;if(!e)return;const{selection:t}=e.state,{$from:i}=t;if("image"===i.node(i.depth).type.name?i.node(i.depth):null){const t=e.view.coordsAtPos(i.start()),o=this.shadowRoot?.querySelector(".editor-wrapper")?.getBoundingClientRect();if(o){const e=t.left-o.left+(t.right-t.left)/2,i=t.top-o.top-40;this._showImageToolbar({x:e,y:i})}}else this._hideImageToolbar()})}_getTextLabel(){const e=this._editor;return e?e.isActive("heading",{level:1})?"标题 1":e.isActive("heading",{level:2})?"标题 2":e.isActive("heading",{level:3})?"标题 3":"正文":"正文"}_getAlignLabel(){const e=this._editor;return e?e.isActive({textAlign:"center"})?"居中":e.isActive({textAlign:"right"})?"右对齐":"左对齐":"对齐"}_updateBubbleMenuPosition(){requestAnimationFrame(()=>{const e=this.shadowRoot?.querySelector(".bubble-menu"),t=this.shadowRoot?.querySelector(".ProseMirror"),i=this.shadowRoot?.querySelector(".editor-wrapper");if(!e||!t||!i)return;const o=this._editor,r=o?.isActive("table")??!1,{selection:l}=o?.state??{selection:null};if(r&&l&&!l.empty&&o){const{from:t,to:i}=l,r=o.state.doc.resolve(t),s=o.state.doc.resolve(i);let n=!1;for(let e=r.depth;e>=0;e--)if("table"===r.node(e).type.name){n=!0;break}const a=r.node(r.depth),d=s.node(s.depth);if("table"!==a.type.name&&"table"!==d.type.name||(n=!0),n)return e.style.opacity="0",void(e.style.visibility="hidden")}if(l&&!l.empty);else if(!l||l.empty&&!this._hasSlashCommand)return e.style.opacity="0",void(e.style.visibility="hidden");const s=i.getBoundingClientRect(),n=e.getBoundingClientRect(),{from:a}=l,d=this._editor?.view.coordsAtPos(a);if(!d)return;let c=d.left-s.left,b=d.top-s.top-40;c+n.width>s.width&&(c=s.width-n.width-8),c<0&&(c=8),b<0&&(b=d.bottom-s.top+8),e.style.left=`${c}px`,e.style.top=`${b}px`,e.style.opacity="1",e.style.visibility="visible"})}render(){const e=this._editor;return M`
1
+ import{Editor as e}from"@tiptap/core";import t from"@tiptap/extension-blockquote";import i from"@tiptap/extension-bold";import o from"@tiptap/extension-bullet-list";import r from"@tiptap/extension-code";import l from"@tiptap/extension-document";import s from"@tiptap/extension-heading";import n from"@tiptap/extension-history";import a from"@tiptap/extension-horizontal-rule";import d from"@tiptap/extension-image";import c from"@tiptap/extension-italic";import b from"@tiptap/extension-link";import p from"@tiptap/extension-list-item";import h from"@tiptap/extension-ordered-list";import g from"@tiptap/extension-paragraph";import u from"@tiptap/extension-strike";import{Table as x}from"@tiptap/extension-table";import{TableCell as m}from"@tiptap/extension-table-cell";import{TableHeader as v}from"@tiptap/extension-table-header";import{TableRow as f}from"@tiptap/extension-table-row";import _ from"@tiptap/extension-text";import y from"@tiptap/extension-text-align";import w from"@tiptap/extension-underline";import k from"../node_modules/.pnpm/@tiptap_extension-placeholder@3.20.5_@tiptap_extensions@3.20.5_@tiptap_core@3.20.5_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.mjs";import{css as C,LitElement as T,html as M}from"lit";import{property as $}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.mjs";import{state as A}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.mjs";import{safeCustomElement as R}from"../base/define.mjs";var B=Object.defineProperty,P=Object.getOwnPropertyDescriptor,S=(e,t,i,o)=>{for(var r,l=o>1?void 0:o?P(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(l=(o?r(t,i,l):r(l))||l);return o&&l&&B(t,i,l),l};let I=class extends T{constructor(){super(...arguments),this.content="",this.readonly=!1,this.preview=!1,this.uploadImage=async e=>new Promise((t,i)=>{const o=new FileReader;o.onload=e=>t(e.target?.result),o.onerror=i,o.readAsDataURL(e)}),this._editor=null,this._pendingContent=null,this._tableRows=3,this._tableCols=3,this._hoverRow=0,this._hoverCol=0,this._tableDropdownOpen=!1,this._isLoading=!0,this._tableCellToolbar={x:0,y:0,visible:!1,cellRow:0,cellCol:0},this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},this._imageToolbar={x:0,y:0,visible:!1},this._imageMoreMenuVisible=!1,this._hasSlashCommand=!1,this._tableEdgeDetectionSetup=!1}_initEditor(){if(this._editor)return;const C=this.shadowRoot?.querySelector(".editor-content");if(!C)return void requestAnimationFrame(()=>this._initEditor());this._isLoading=!1;const T=[l,g,_,i,c,w,u,r,s.configure({levels:[1,2,3]}),o,h,p,t,a,n,d.configure({inline:!1,allowBase64:!0}),b.configure({openOnClick:!1,HTMLAttributes:{rel:"noopener noreferrer"}}),y.configure({types:["heading","paragraph"]}),x.configure({resizable:!0}),f,m,v,k.configure({placeholder:"输入 / 唤出快捷命令"})];this._editor=new e({element:C,extensions:T,content:(this._pendingContent??this.content)||"<p></p>",editable:!this.readonly}),this._pendingContent=null,this._editor.on("selectionUpdate",()=>{this.requestUpdate(),this._updateBubbleMenuPosition(),this._editor?.isActive("table")?this._showTableCellToolbar():this._hideTableCellToolbar();const e=this._editor;if(e){const{selection:t}=e.state,{$from:i}=t;if("image"===i.node(i.depth).type.name){const t=e.view.coordsAtPos(i.start()),o=this.shadowRoot?.querySelector(".editor-wrapper")?.getBoundingClientRect();if(o){const e=t.left-o.left+(t.right-t.left)/2,i=t.top-o.top-40;this._showImageToolbar({x:e,y:i})}}else this._hideImageToolbar()}}),this._editor.on("transaction",()=>{this.requestUpdate(),this._editor?.isActive("table")?this._showTableCellToolbar():this._hideTableCellToolbar(),this._checkSlashCommand(),this._setupTableEdgeDetection()})}_setupTableEdgeDetection(){const e=this.shadowRoot?.querySelector(".editor-content");e&&!this._tableEdgeDetectionSetup&&(this._tableEdgeDetectionSetup=!0,e.addEventListener("mousemove",e=>{this._handleTableEdgeMouseMove(e)}),e.addEventListener("mouseleave",()=>{this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}}}),e.addEventListener("click",e=>{const t=e.target;if("IMG"===t.tagName){const e=this._editor?.view.posAtDOM(t,0);void 0!==e&&this._editor?.chain().focus().setNodeSelection(e).run()}}))}_handleTableEdgeMouseMove(e){if(!this._editor?.isActive("table"))return this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},void this.requestUpdate();const t=e.target.closest("table");if(!t)return this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},void this.requestUpdate();const i=t.getBoundingClientRect(),o=this.shadowRoot?.querySelector(".editor-wrapper");if(!o)return;const r=o.getBoundingClientRect(),l=e.clientX-r.left,s=e.clientY-r.top,n=10,a=i.height/t.rows.length;for(let o=0;o<t.rows.length;o++){const t=i.top+o*a,s=t+a;if(e.clientY>=t-n&&e.clientY<=t+n)return this._tableEdgeHover={type:"row",index:o,position:{x:l,y:t-r.top}},void this.requestUpdate();if(e.clientY>=s-n&&e.clientY<=s+n)return this._tableEdgeHover={type:"row",index:o+1,position:{x:l,y:s-r.top}},void this.requestUpdate()}const d=i.width/t.rows[0]?.cells.length||1;for(let o=0;o<(t.rows[0]?.cells.length||0);o++){const t=i.left+o*d,l=t+d;if(e.clientX>=t-n&&e.clientX<=t+n)return this._tableEdgeHover={type:"col",index:o,position:{x:t-r.left,y:s}},void this.requestUpdate();if(e.clientX>=l-n&&e.clientX<=l+n)return this._tableEdgeHover={type:"col",index:o+1,position:{x:l-r.left,y:s}},void this.requestUpdate()}this._tableEdgeHover={type:null,index:0,position:{x:0,y:0}},this.requestUpdate()}_checkSlashCommand(){if(!this._editor)return;const{selection:e}=this._editor.state,t=this._editor.state.doc.textBetween(Math.max(0,e.from-10),e.from," ");this._hasSlashCommand=t.endsWith("/")}firstUpdated(){this._initEditor()}updated(e){if(this._editor)return e.has("content")&&this._editor.commands.setContent(this.content||"<p></p>"),void(e.has("readonly")&&this._editor.setEditable(!this.readonly));e.has("content")&&(this._pendingContent=this.content);const t=this.shadowRoot?.querySelector(".editor-content");t&&!this._editor&&this._initEditor()}disconnectedCallback(){super.disconnectedCallback(),this._editor?.destroy(),this._editor=null}getContent(){return this._editor?.getHTML()??""}_applyFormat(e){if(this._hasSlashCommand&&this._editor){const{selection:e}=this._editor.state;this._editor.chain().focus().deleteRange({from:e.from-1,to:e.from}).run(),this._hasSlashCommand=!1}e()}_toggleBold(){this._applyFormat(()=>this._editor?.chain().focus().toggleBold().run())}_toggleItalic(){this._applyFormat(()=>this._editor?.chain().focus().toggleItalic().run())}_toggleUnderline(){this._applyFormat(()=>this._editor?.chain().focus().toggleUnderline().run())}_toggleStrike(){this._applyFormat(()=>this._editor?.chain().focus().toggleStrike().run())}_toggleCode(){this._applyFormat(()=>this._editor?.chain().focus().toggleCode().run())}_setHeading(e){this._applyFormat(()=>this._editor?.chain().focus().toggleHeading({level:e}).run())}_setParagraph(){this._applyFormat(()=>this._editor?.chain().focus().setParagraph().run())}_toggleBulletList(){this._applyFormat(()=>this._editor?.chain().focus().toggleBulletList().run())}_toggleOrderedList(){this._applyFormat(()=>this._editor?.chain().focus().toggleOrderedList().run())}_toggleBlockquote(){this._applyFormat(()=>this._editor?.chain().focus().toggleBlockquote().run())}_setTextAlign(e){this._applyFormat(()=>this._editor?.chain().focus().setTextAlign(e).run())}_setLink(){const e=window.prompt("请输入链接地址:");e&&this._applyFormat(()=>this._editor?.chain().focus().setLink({href:e}).run())}_unsetLink(){this._applyFormat(()=>this._editor?.chain().focus().unsetLink().run())}_insertTable(e,t){this._editor?.chain().focus().insertTable({rows:e??this._tableRows,cols:t??this._tableCols,withHeaderRow:!0}).run()}async _handleImageUpload(e){const t=e.target,i=t.files?.[0];if(i)try{const e=await this.uploadImage(i);this._editor?.chain().focus().setImage({src:e}).run()}catch(e){}t.value=""}_triggerImageUpload(){const e=this.shadowRoot?.querySelector(".image-input");e?.click()}_insertTableByClick(e,t){if(this._hasSlashCommand&&this._editor){const{selection:e}=this._editor.state;this._editor.chain().focus().deleteRange({from:e.from-1,to:e.from}).run(),this._hasSlashCommand=!1}this._tableRows=e,this._tableCols=t,this._insertTable(e,t)}_insertHorizontalRule(){this._editor?.chain().focus().setHorizontalRule().run()}_showTableCellToolbar(){if(!this._editor?.isActive("table"))return;const{state:e}=this._editor,{selection:t}=e,i=this._editor.view.coordsAtPos(t.from),o=this.shadowRoot?.querySelector(".editor-wrapper");if(!o)return;const r=o.getBoundingClientRect(),l=this._getTableCellRow(),s=this._getTableCellCol();(0===l||0===s)&&(this._tableCellToolbar={x:i.left-r.left,y:i.bottom-r.top+8,visible:!0,cellRow:l,cellCol:s})}_getTableCellRow(){if(!this._editor)return 0;const{selection:e}=this._editor.state,t=this._editor.state.doc.resolve(e.from);for(let e=t.depth;e>0;e--){if("tableCell"===t.node(e).type.name)return t.index(e-1)}return 0}_getTableCellCol(){if(!this._editor)return 0;const{selection:e}=this._editor.state,t=this._editor.state.doc.resolve(e.from);for(let e=t.depth;e>0;e--){if("tableCell"===t.node(e).type.name)return t.index(e)}return 0}_hideTableCellToolbar(){this._tableCellToolbar={...this._tableCellToolbar,visible:!1}}_addTableRowAbove(){this._editor?.chain().focus().addRowBefore().run(),this._hideTableCellToolbar()}_addTableRowBelow(){this._editor?.chain().focus().addRowAfter().run(),this._hideTableCellToolbar()}_addTableColumnLeft(){this._editor?.chain().focus().addColumnBefore().run(),this._hideTableCellToolbar()}_addTableColumnRight(){this._editor?.chain().focus().addColumnAfter().run(),this._hideTableCellToolbar()}_deleteTableRow(){this._editor?.chain().focus().deleteRow().run(),this._hideTableCellToolbar()}_deleteTableColumn(){this._editor?.chain().focus().deleteColumn().run(),this._hideTableCellToolbar()}_deleteTable(){this._editor?.chain().focus().deleteTable().run(),this._hideTableCellToolbar()}_showImageToolbar(e){this._imageToolbar={x:e.x,y:e.y,visible:!0},this._imageMoreMenuVisible=!1}_hideImageToolbar(){this._imageToolbar={...this._imageToolbar,visible:!1},this._imageMoreMenuVisible=!1}_toggleImageMoreMenu(){this._imageMoreMenuVisible=!this._imageMoreMenuVisible}_deleteImage(){this._editor?.chain().focus().deleteNode("image").run(),this._hideImageToolbar()}_insertImageAfter(){this._triggerImageUpload(),this._imageMoreMenuVisible=!1}_setImageAlignLeft(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 auto 0 0")}this._imageMoreMenuVisible=!1}_setImageAlignCenter(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 auto")}this._imageMoreMenuVisible=!1}_setImageAlignRight(){const e=this._editor;if(e){const{selection:t}=e.state,i=t.from;e.chain().focus().setNodeSelection(i).run();const o=this.shadowRoot?.querySelector(".ProseMirror img.ProseMirror-selectednode");o&&(o.style.display="block",o.style.margin="0 0 0 auto")}this._imageMoreMenuVisible=!1}_updateImageToolbarPosition(){requestAnimationFrame(()=>{const e=this._editor;if(!e)return;const{selection:t}=e.state,{$from:i}=t;if("image"===i.node(i.depth).type.name?i.node(i.depth):null){const t=e.view.coordsAtPos(i.start()),o=this.shadowRoot?.querySelector(".editor-wrapper")?.getBoundingClientRect();if(o){const e=t.left-o.left+(t.right-t.left)/2,i=t.top-o.top-40;this._showImageToolbar({x:e,y:i})}}else this._hideImageToolbar()})}_getTextLabel(){const e=this._editor;return e?e.isActive("heading",{level:1})?"标题 1":e.isActive("heading",{level:2})?"标题 2":e.isActive("heading",{level:3})?"标题 3":"正文":"正文"}_getAlignLabel(){const e=this._editor;return e?e.isActive({textAlign:"center"})?"居中":e.isActive({textAlign:"right"})?"右对齐":"左对齐":"对齐"}_updateBubbleMenuPosition(){requestAnimationFrame(()=>{const e=this.shadowRoot?.querySelector(".bubble-menu"),t=this.shadowRoot?.querySelector(".ProseMirror"),i=this.shadowRoot?.querySelector(".editor-wrapper");if(!e||!t||!i)return;const o=this._editor,r=o?.isActive("table")??!1,{selection:l}=o?.state??{selection:null};if(r&&l&&!l.empty&&o){const{from:t,to:i}=l,r=o.state.doc.resolve(t),s=o.state.doc.resolve(i);let n=!1;for(let e=r.depth;e>=0;e--)if("table"===r.node(e).type.name){n=!0;break}const a=r.node(r.depth),d=s.node(s.depth);if("table"!==a.type.name&&"table"!==d.type.name||(n=!0),n)return e.style.opacity="0",void(e.style.visibility="hidden")}if(l&&!l.empty);else if(!l||l.empty&&!this._hasSlashCommand)return e.style.opacity="0",void(e.style.visibility="hidden");const s=i.getBoundingClientRect(),n=e.getBoundingClientRect(),{from:a}=l,d=this._editor?.view.coordsAtPos(a);if(!d)return;let c=d.left-s.left,b=d.top-s.top-40;c+n.width>s.width&&(c=s.width-n.width-8),c<0&&(c=8),b<0&&(b=d.bottom-s.top+8),e.style.left=`${c}px`,e.style.top=`${b}px`,e.style.opacity="1",e.style.visibility="visible"})}render(){const e=this._editor;return M`
2
2
  <div class="editor-wrapper ${this._isLoading?"loading":""} ${this.preview?"preview":""}">
3
3
  ${this._isLoading?M`
4
4
  <div class="loading-placeholder">
@@ -927,5 +927,5 @@ import{Editor as e}from"@tiptap/core";import t from"@tiptap/extension-blockquote
927
927
  outline: 2px solid #1e96fc;
928
928
  outline-offset: 2px;
929
929
  }
930
- `,S([$({type:String,attribute:"content"})],I.prototype,"content",2),S([$({type:Boolean,attribute:"readonly"})],I.prototype,"readonly",2),S([$({type:Boolean,attribute:"preview"})],I.prototype,"preview",2),S([A()],I.prototype,"_pendingContent",2),S([A()],I.prototype,"_hoverRow",2),S([A()],I.prototype,"_hoverCol",2),S([A()],I.prototype,"_tableDropdownOpen",2),S([A()],I.prototype,"_isLoading",2),S([A()],I.prototype,"_tableCellToolbar",2),S([A()],I.prototype,"_tableEdgeHover",2),S([A()],I.prototype,"_imageToolbar",2),S([A()],I.prototype,"_imageMoreMenuVisible",2),S([A()],I.prototype,"_hasSlashCommand",2),I=S([R("qxs-blocksuite-editor")],I);export{I as QxsBlocksuiteEditor};
930
+ `,S([$({type:String,attribute:"content"})],I.prototype,"content",2),S([$({type:Boolean,attribute:"readonly"})],I.prototype,"readonly",2),S([$({type:Boolean,attribute:"preview"})],I.prototype,"preview",2),S([$({type:Object,attribute:"upload-image"})],I.prototype,"uploadImage",2),S([A()],I.prototype,"_pendingContent",2),S([A()],I.prototype,"_hoverRow",2),S([A()],I.prototype,"_hoverCol",2),S([A()],I.prototype,"_tableDropdownOpen",2),S([A()],I.prototype,"_isLoading",2),S([A()],I.prototype,"_tableCellToolbar",2),S([A()],I.prototype,"_tableEdgeHover",2),S([A()],I.prototype,"_imageToolbar",2),S([A()],I.prototype,"_imageMoreMenuVisible",2),S([A()],I.prototype,"_hasSlashCommand",2),I=S([R("qxs-blocksuite-editor")],I);export{I as QxsBlocksuiteEditor};
931
931
  //# sourceMappingURL=blocksuite-editor.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocksuite-editor.mjs","sources":["../../../../packages/components-wc/src/editor/blocksuite-editor.ts"],"sourcesContent":["import { Editor } from '@tiptap/core'\nimport Blockquote from '@tiptap/extension-blockquote'\nimport Bold from '@tiptap/extension-bold'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport Code from '@tiptap/extension-code'\nimport Document from '@tiptap/extension-document'\nimport Heading from '@tiptap/extension-heading'\nimport History from '@tiptap/extension-history'\nimport HorizontalRule from '@tiptap/extension-horizontal-rule'\nimport Image from '@tiptap/extension-image'\nimport Italic from '@tiptap/extension-italic'\nimport Link from '@tiptap/extension-link'\nimport ListItem from '@tiptap/extension-list-item'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport Paragraph from '@tiptap/extension-paragraph'\nimport Strike from '@tiptap/extension-strike'\nimport { Table } from '@tiptap/extension-table'\nimport { TableCell } from '@tiptap/extension-table-cell'\nimport { TableHeader } from '@tiptap/extension-table-header'\nimport { TableRow } from '@tiptap/extension-table-row'\nimport Text from '@tiptap/extension-text'\nimport TextAlign from '@tiptap/extension-text-align'\nimport Underline from '@tiptap/extension-underline'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\n\n@safeCustomElement('qxs-blocksuite-editor')\nexport class QxsBlocksuiteEditor extends LitElement {\n static styles = css`\n :host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, sans-serif;\n }\n\n .editor-wrapper {\n border: 1px solid #e3e3e3;\n border-radius: 12px;\n background: transparent;\n overflow: visible;\n position: relative;\n }\n\n .editor-wrapper:focus-within {\n border-color: #1e96fc;\n box-shadow: 0 0 0 2px rgba(30, 150, 252, 0.1);\n }\n\n .editor-wrapper.preview {\n border: none;\n border-radius: 0;\n background: transparent;\n }\n\n .editor-wrapper.preview .editor-content {\n padding: 8px 12px;\n min-height: unset;\n }\n\n .editor-content {\n padding: 16px 20px;\n min-height: 200px;\n cursor: text;\n }\n\n .editor-content:empty::before {\n content: '输入 / 唤出快捷命令';\n color: #c0c0c0;\n pointer-events: none;\n display: block;\n margin-top: 80px;\n text-align: center;\n }\n\n .editor-content .ProseMirror:empty {\n min-height: 200px;\n }\n\n .ProseMirror p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n color: #c0c0c0;\n pointer-events: none;\n float: left;\n height: 0;\n }\n\n .editor-wrapper.loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n background: #fafafa;\n }\n\n .loading-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n color: #909399;\n font-size: 14px;\n }\n\n .loading-spinner {\n width: 24px;\n height: 24px;\n border: 2px solid #e3e3e3;\n border-top-color: #1e96fc;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .ProseMirror {\n outline: none;\n line-height: 1.7;\n color: #37352f;\n font-size: 15px;\n }\n\n .ProseMirror > * + * {\n margin-top: 0.5em;\n }\n\n .ProseMirror > *:first-child {\n margin-top: 0 !important;\n }\n\n .ProseMirror p {\n margin: 0;\n }\n\n .ProseMirror h1 {\n font-size: 1.875em;\n font-weight: 700;\n margin: 0 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror > h1:first-child {\n margin-top: 0 !important;\n line-height: 1.15;\n }\n\n .ProseMirror > p:first-child {\n margin-top: 0 !important;\n }\n\n .ProseMirror h2 {\n font-size: 1.5em;\n font-weight: 600;\n margin: 0.5em 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror h3 {\n font-size: 1.25em;\n font-weight: 600;\n margin: 0.5em 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror ul,\n .ProseMirror ol {\n padding-left: 1.5em;\n margin: 0;\n }\n\n .ProseMirror li {\n margin: 0.1em 0;\n }\n\n .ProseMirror li::marker {\n color: #37352f;\n }\n\n .ProseMirror strong {\n font-weight: 700;\n }\n\n .ProseMirror em {\n font-style: italic;\n font-synthesis: none;\n transform: skewX(-12deg);\n display: inline-block;\n }\n\n .ProseMirror u {\n text-decoration: underline;\n }\n\n .ProseMirror s {\n text-decoration: line-through;\n color: #787774;\n }\n\n .ProseMirror code {\n background: rgba(135, 131, 120, 0.14);\n color: #eb5757;\n padding: 2px 4px;\n border-radius: 4px;\n font-family: 'SFMono-Regular', Menlo, Consolas, monospace;\n font-size: 85%;\n }\n\n .ProseMirror pre {\n background: #f6f6f7;\n border-radius: 8px;\n padding: 12px 16px;\n overflow-x: auto;\n }\n\n .ProseMirror pre code {\n background: none;\n padding: 0;\n color: #37352f;\n }\n\n .ProseMirror blockquote {\n border-left: 3px solid #e3e3e3;\n padding-left: 1em;\n margin: 0.75em 0;\n color: #787774;\n }\n\n .ProseMirror hr {\n border: none;\n border-top: 1px solid #e3e3e3;\n margin: 1.5em 0;\n }\n\n .ProseMirror img {\n max-width: 100%;\n height: auto;\n border-radius: 8px;\n }\n\n .ProseMirror a {\n color: #1e96fc;\n text-decoration: underline;\n cursor: pointer;\n }\n\n .ProseMirror img.ProseMirror-selectednode {\n outline: 2px solid #1e96fc;\n }\n\n /* Table styles */\n .ProseMirror table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .ProseMirror th,\n .ProseMirror td {\n border: 1px solid #e3e3e3;\n padding: 8px 12px;\n text-align: left;\n vertical-align: top;\n }\n\n .ProseMirror th {\n background: #fafafa;\n font-weight: 600;\n }\n\n .ProseMirror .selectedCell {\n background: rgba(30, 150, 252, 0.1);\n }\n\n /* Table Cell Toolbar */\n .table-cell-toolbar {\n position: absolute;\n z-index: 50;\n display: flex;\n gap: 2px;\n padding: 4px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n\n .table-cell-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #606266;\n transition: all 0.15s;\n }\n\n .table-cell-toolbar-btn:hover {\n background: #ecf5ff;\n color: #1e96fc;\n }\n\n .table-cell-toolbar-btn.danger:hover {\n background: #fef0f0;\n color: #f56c6c;\n }\n\n /* Table Edge Add Button */\n .table-edge-add {\n position: absolute;\n z-index: 40;\n display: none;\n width: 20px;\n height: 20px;\n align-items: center;\n justify-content: center;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n color: #606266;\n transition: all 0.15s;\n }\n\n .table-edge-add:hover {\n background: #ecf5ff;\n border-color: #1e96fc;\n color: #1e96fc;\n }\n\n .table-edge-add.visible {\n display: flex;\n }\n\n .table-edge-add-row {\n width: 100%;\n height: 8px;\n left: 0;\n border-radius: 0 0 4px 4px;\n }\n\n .table-edge-add-col {\n height: 100%;\n width: 8px;\n top: 0;\n border-radius: 0 4px 4px 0;\n }\n\n /* Bubble Menu - 企业级风格 */\n .bubble-menu {\n position: absolute;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 100;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s, visibility 0.15s, transform 0.15s;\n transform: translateY(4px);\n max-width: calc(100vw - 40px);\n }\n\n .bubble-menu.is-visible {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-menu.is-visible {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n }\n\n .bubble-btn:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-btn.is-active {\n background: #1e96fc;\n color: #fff;\n }\n\n .bubble-btn svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .bubble-divider {\n width: 1px;\n height: 16px;\n background: #e3e3e3;\n margin: 0 3px;\n }\n\n /* Dropdown */\n .bubble-dropdown {\n position: relative;\n }\n\n .bubble-dropdown-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 0 6px;\n height: 28px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n transition: all 0.15s;\n white-space: nowrap;\n }\n\n .bubble-dropdown-btn:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-dropdown-btn svg {\n width: 12px;\n height: 12px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .bubble-dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 4px;\n min-width: 120px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n padding: 4px;\n opacity: 0;\n visibility: hidden;\n transform: translateY(-4px);\n transition: all 0.15s;\n z-index: 101;\n }\n\n .bubble-dropdown:hover .bubble-dropdown-menu,\n .bubble-dropdown.is-open .bubble-dropdown-menu {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-dropdown-item {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 6px 8px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n text-align: left;\n transition: all 0.15s;\n }\n\n .bubble-dropdown-item:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-dropdown-item.is-active {\n background: #1e96fc;\n color: #fff;\n }\n\n .bubble-dropdown-item svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .image-input {\n display: none;\n }\n\n .table-grid-preview {\n display: grid;\n grid-template-columns: repeat(10, 18px);\n gap: 2px;\n padding: 8px;\n }\n\n .table-grid-preview .table-cell {\n width: 18px;\n height: 18px;\n border: 1px solid #e3e3e3;\n border-radius: 2px;\n background: #fff;\n cursor: pointer;\n transition: all 0.1s;\n }\n\n .table-grid-preview .table-cell:hover {\n background: rgba(30, 150, 252, 0.3);\n border-color: #1e96fc;\n }\n\n .table-grid-preview .table-cell.selected {\n background: rgba(30, 150, 252, 0.15);\n border-color: rgba(30, 150, 252, 0.5);\n }\n\n .table-size-hint {\n text-align: center;\n padding: 4px 8px 6px;\n font-size: 10px;\n color: #8c8c8c;\n }\n\n /* Image Toolbar */\n .image-toolbar {\n position: absolute;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 100;\n transform: translateX(-50%);\n }\n\n .image-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #595959;\n transition: all 0.15s;\n }\n\n .image-toolbar-btn:hover {\n background: #f5f5f5;\n color: #1e96fc;\n }\n\n .image-toolbar-btn.danger:hover {\n background: #fff1f0;\n color: #ff4d4f;\n }\n\n .image-toolbar-btn svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .image-toolbar-divider {\n width: 1px;\n height: 20px;\n background: #e3e3e3;\n margin: 0 4px;\n }\n\n /* Image More Menu */\n .image-more-menu {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 4px;\n padding: 4px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 101;\n min-width: 120px;\n }\n\n .image-more-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n font-size: 13px;\n color: #595959;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .image-more-menu-item:hover {\n background: #f5f5f5;\n color: #1e96fc;\n }\n\n .image-more-menu-item svg {\n width: 14px;\n height: 14px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n /* Selected Image */\n .ProseMirror img.selected {\n outline: 2px solid #1e96fc;\n outline-offset: 2px;\n }\n `\n\n @property({ type: String, attribute: 'content' })\n content = ''\n\n @property({ type: Boolean, attribute: 'readonly' })\n readonly = false\n\n @property({ type: Boolean, attribute: 'preview' })\n preview = false\n\n private _editor: Editor | null = null\n @state() private _pendingContent: string | null = null\n private _tableRows = 3\n private _tableCols = 3\n @state() private _hoverRow = 0\n @state() private _hoverCol = 0\n @state() private _tableDropdownOpen = false\n @state() private _isLoading = true\n @state() private _tableCellToolbar: { x: number, y: number, visible: boolean, cellRow: number, cellCol: number } = { x: 0, y: 0, visible: false, cellRow: 0, cellCol: 0 }\n @state() private _tableEdgeHover: { type: 'row' | 'col' | null, index: number, position: { x: number, y: number } } = { type: null, index: 0, position: { x: 0, y: 0 } }\n @state() private _imageToolbar: { x: number, y: number, visible: boolean } = { x: 0, y: 0, visible: false }\n @state() private _imageMoreMenuVisible = false\n @state() private _hasSlashCommand = false\n\n private _initEditor() {\n if (this._editor) return\n \n const el = this.shadowRoot?.querySelector<HTMLElement>('.editor-content')\n if (!el) { \n requestAnimationFrame(() => this._initEditor())\n return \n }\n \n this._isLoading = false\n\n const extensions: any[] = [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n Heading.configure({ levels: [1, 2, 3] }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n History,\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n },\n }),\n TextAlign.configure({\n types: ['heading', 'paragraph'],\n }),\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({\n placeholder: '输入 / 唤出快捷命令',\n }),\n ]\n\n this._editor = new Editor({\n element: el,\n extensions,\n content: (this._pendingContent ?? this.content) || '<p></p>',\n editable: !this.readonly,\n })\n\n this._pendingContent = null\n\n this._editor.on('selectionUpdate', () => {\n this.requestUpdate()\n this._updateBubbleMenuPosition()\n if (this._editor?.isActive('table')) {\n this._showTableCellToolbar()\n } else {\n this._hideTableCellToolbar()\n }\n // Image selection detection\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const { $from } = selection\n const node = $from.node($from.depth)\n if (node.type.name === 'image') {\n const coords = editor.view.coordsAtPos($from.start())\n const wrapperRect = this.shadowRoot?.querySelector('.editor-wrapper')?.getBoundingClientRect()\n if (wrapperRect) {\n const x = coords.left - wrapperRect.left + (coords.right - coords.left) / 2\n const y = coords.top - wrapperRect.top - 40\n this._showImageToolbar({ x, y })\n }\n } else {\n this._hideImageToolbar()\n }\n }\n })\n\n this._editor.on('transaction', () => {\n this.requestUpdate()\n if (this._editor?.isActive('table')) {\n this._showTableCellToolbar()\n } else {\n this._hideTableCellToolbar()\n }\n this._checkSlashCommand()\n this._setupTableEdgeDetection()\n })\n }\n\n private _tableEdgeDetectionSetup = false\n\n private _setupTableEdgeDetection() {\n const editorContent = this.shadowRoot?.querySelector('.editor-content')\n if (!editorContent || this._tableEdgeDetectionSetup) return\n \n this._tableEdgeDetectionSetup = true\n \n editorContent.addEventListener('mousemove', (e: Event) => {\n this._handleTableEdgeMouseMove(e as MouseEvent)\n })\n\n editorContent.addEventListener('mouseleave', () => {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n })\n\n // Image click to select\n editorContent.addEventListener('click', (e: Event) => {\n const target = e.target as HTMLElement\n if (target.tagName === 'IMG') {\n const pos = this._editor?.view.posAtDOM(target, 0)\n if (pos !== undefined) {\n this._editor?.chain().focus().setNodeSelection(pos).run()\n }\n }\n })\n }\n\n private _handleTableEdgeMouseMove(e: MouseEvent) {\n if (!this._editor?.isActive('table')) {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n return\n }\n\n const target = e.target as HTMLElement\n const table = target.closest('table')\n if (!table) {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n return\n }\n\n const tableRect = table.getBoundingClientRect()\n const editorWrapper = this.shadowRoot?.querySelector('.editor-wrapper')\n if (!editorWrapper) return\n const wrapperRect = editorWrapper.getBoundingClientRect()\n\n const relativeX = e.clientX - wrapperRect.left\n const relativeY = e.clientY - wrapperRect.top\n\n const edgeThreshold = 10\n const rowHeight = tableRect.height / table.rows.length\n\n for (let i = 0; i < table.rows.length; i++) {\n const rowTop = tableRect.top + i * rowHeight\n const rowBottom = rowTop + rowHeight\n \n if (e.clientY >= rowTop - edgeThreshold && e.clientY <= rowTop + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'row',\n index: i,\n position: { x: relativeX, y: rowTop - wrapperRect.top }\n }\n this.requestUpdate()\n return\n }\n \n if (e.clientY >= rowBottom - edgeThreshold && e.clientY <= rowBottom + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'row',\n index: i + 1,\n position: { x: relativeX, y: rowBottom - wrapperRect.top }\n }\n this.requestUpdate()\n return\n }\n }\n\n const colWidth = tableRect.width / table.rows[0]?.cells.length || 1\n for (let i = 0; i < (table.rows[0]?.cells.length || 0); i++) {\n const colLeft = tableRect.left + i * colWidth\n const colRight = colLeft + colWidth\n \n if (e.clientX >= colLeft - edgeThreshold && e.clientX <= colLeft + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'col',\n index: i,\n position: { x: colLeft - wrapperRect.left, y: relativeY }\n }\n this.requestUpdate()\n return\n }\n \n if (e.clientX >= colRight - edgeThreshold && e.clientX <= colRight + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'col',\n index: i + 1,\n position: { x: colRight - wrapperRect.left, y: relativeY }\n }\n this.requestUpdate()\n return\n }\n }\n\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n }\n\n private _checkSlashCommand() {\n if (!this._editor) return\n const { selection } = this._editor.state\n const textBefore = this._editor.state.doc.textBetween(\n Math.max(0, selection.from - 10),\n selection.from,\n ' '\n )\n this._hasSlashCommand = textBefore.endsWith('/')\n }\n\n firstUpdated() {\n this._initEditor()\n }\n\n updated(changed: Map<string, unknown>) {\n if (this._editor) {\n if (changed.has('content')) {\n this._editor.commands.setContent(this.content || '<p></p>')\n }\n if (changed.has('readonly')) {\n this._editor.setEditable(!this.readonly)\n }\n return\n }\n\n if (changed.has('content')) {\n this._pendingContent = this.content\n }\n\n const el = this.shadowRoot?.querySelector<HTMLElement>('.editor-content')\n if (el && !this._editor) {\n this._initEditor()\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this._editor?.destroy()\n this._editor = null\n }\n\n getContent(): string {\n return this._editor?.getHTML() ?? ''\n }\n\n private _applyFormat(command: () => void) {\n if (this._hasSlashCommand && this._editor) {\n const { selection } = this._editor.state\n this._editor.chain().focus().deleteRange({ from: selection.from - 1, to: selection.from }).run()\n this._hasSlashCommand = false\n }\n command()\n }\n\n private _toggleBold() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBold().run())\n }\n\n private _toggleItalic() {\n this._applyFormat(() => this._editor?.chain().focus().toggleItalic().run())\n }\n\n private _toggleUnderline() {\n this._applyFormat(() => this._editor?.chain().focus().toggleUnderline().run())\n }\n\n private _toggleStrike() {\n this._applyFormat(() => this._editor?.chain().focus().toggleStrike().run())\n }\n\n private _toggleCode() {\n this._applyFormat(() => this._editor?.chain().focus().toggleCode().run())\n }\n\n private _setHeading(level: number) {\n this._applyFormat(() => this._editor?.chain().focus().toggleHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run())\n }\n\n private _setParagraph() {\n this._applyFormat(() => this._editor?.chain().focus().setParagraph().run())\n }\n\n private _toggleBulletList() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBulletList().run())\n }\n\n private _toggleOrderedList() {\n this._applyFormat(() => this._editor?.chain().focus().toggleOrderedList().run())\n }\n\n private _toggleBlockquote() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBlockquote().run())\n }\n\n private _setTextAlign(align: string) {\n this._applyFormat(() => this._editor?.chain().focus().setTextAlign(align as any).run())\n }\n\n private _setLink() {\n // eslint-disable-next-line no-alert\n const url = window.prompt('请输入链接地址:')\n if (url) {\n this._applyFormat(() => this._editor?.chain().focus().setLink({ href: url }).run())\n }\n }\n\n private _unsetLink() {\n this._applyFormat(() => this._editor?.chain().focus().unsetLink().run())\n }\n\n private _insertTable(rows?: number, cols?: number) {\n this._editor?.chain().focus().insertTable({ rows: rows ?? this._tableRows, cols: cols ?? this._tableCols, withHeaderRow: true }).run()\n }\n\n private _handleImageUpload(e: Event) {\n const input = e.target as HTMLInputElement\n const file = input.files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = (res) => {\n const src = res.target?.result as string\n this._editor?.chain().focus().setImage({ src }).run()\n }\n reader.readAsDataURL(file)\n }\n input.value = ''\n }\n\n private _triggerImageUpload() {\n const input = this.shadowRoot?.querySelector<HTMLInputElement>('.image-input')\n input?.click()\n }\n\n private _insertTableByClick(rows: number, cols: number) {\n if (this._hasSlashCommand && this._editor) {\n const { selection } = this._editor.state\n this._editor.chain().focus().deleteRange({ from: selection.from - 1, to: selection.from }).run()\n this._hasSlashCommand = false\n }\n this._tableRows = rows\n this._tableCols = cols\n this._insertTable(rows, cols)\n }\n\n private _insertHorizontalRule() {\n this._editor?.chain().focus().setHorizontalRule().run()\n }\n\n private _showTableCellToolbar() {\n if (!this._editor?.isActive('table')) return\n const { state } = this._editor\n const { selection } = state\n const coords = this._editor.view.coordsAtPos(selection.from)\n const editorWrapper = this.shadowRoot?.querySelector<HTMLElement>('.editor-wrapper')\n if (!editorWrapper) return\n const wrapperRect = editorWrapper.getBoundingClientRect()\n\n const cellRow = this._getTableCellRow()\n const cellCol = this._getTableCellCol()\n const isTopRow = cellRow === 0\n const isLeftCol = cellCol === 0\n\n // Only show toolbar on top row or left column\n if (!isTopRow && !isLeftCol) return\n\n this._tableCellToolbar = {\n x: coords.left - wrapperRect.left,\n y: coords.bottom - wrapperRect.top + 8,\n visible: true,\n cellRow,\n cellCol,\n }\n }\n\n private _getTableCellRow(): number {\n if (!this._editor) return 0\n const { selection } = this._editor.state\n const $pos = this._editor.state.doc.resolve(selection.from)\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d)\n if (node.type.name === 'tableCell') {\n return $pos.index(d - 1)\n }\n }\n return 0\n }\n\n private _getTableCellCol(): number {\n if (!this._editor) return 0\n const { selection } = this._editor.state\n const $pos = this._editor.state.doc.resolve(selection.from)\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d)\n if (node.type.name === 'tableCell') {\n return $pos.index(d)\n }\n }\n return 0\n }\n\n private _hideTableCellToolbar() {\n this._tableCellToolbar = { ...this._tableCellToolbar, visible: false }\n }\n\n private _addTableRowAbove() {\n this._editor?.chain().focus().addRowBefore().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableRowBelow() {\n this._editor?.chain().focus().addRowAfter().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableColumnLeft() {\n this._editor?.chain().focus().addColumnBefore().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableColumnRight() {\n this._editor?.chain().focus().addColumnAfter().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTableRow() {\n this._editor?.chain().focus().deleteRow().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTableColumn() {\n this._editor?.chain().focus().deleteColumn().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTable() {\n this._editor?.chain().focus().deleteTable().run()\n this._hideTableCellToolbar()\n }\n\n // Image Toolbar Methods\n private _showImageToolbar(pos: { x: number, y: number }) {\n this._imageToolbar = { x: pos.x, y: pos.y, visible: true }\n this._imageMoreMenuVisible = false\n }\n\n private _hideImageToolbar() {\n this._imageToolbar = { ...this._imageToolbar, visible: false }\n this._imageMoreMenuVisible = false\n }\n\n private _toggleImageMoreMenu() {\n this._imageMoreMenuVisible = !this._imageMoreMenuVisible\n }\n\n private _deleteImage() {\n this._editor?.chain().focus().deleteNode('image').run()\n this._hideImageToolbar()\n }\n\n private _insertImageAfter() {\n this._triggerImageUpload()\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignLeft() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 auto 0 0'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignCenter() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 auto'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignRight() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 0 0 auto'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _updateImageToolbarPosition() {\n requestAnimationFrame(() => {\n const editor = this._editor\n if (!editor) return\n\n const { selection } = editor.state\n const { $from } = selection\n\n // Find if we're inside an image node\n const imageNode = $from.node($from.depth).type.name === 'image'\n ? $from.node($from.depth)\n : null\n\n if (imageNode) {\n const coords = editor.view.coordsAtPos($from.start())\n const wrapperRect = this.shadowRoot?.querySelector('.editor-wrapper')?.getBoundingClientRect()\n if (wrapperRect) {\n const x = coords.left - wrapperRect.left + (coords.right - coords.left) / 2\n const y = coords.top - wrapperRect.top - 40\n this._showImageToolbar({ x, y })\n }\n } else {\n this._hideImageToolbar()\n }\n })\n }\n\n private _getTextLabel(): string {\n const editor = this._editor\n if (!editor) { return '正文' }\n if (editor.isActive('heading', { level: 1 })) { return '标题 1' }\n if (editor.isActive('heading', { level: 2 })) { return '标题 2' }\n if (editor.isActive('heading', { level: 3 })) { return '标题 3' }\n return '正文'\n }\n\n private _getAlignLabel(): string {\n const editor = this._editor\n if (!editor) { return '对齐' }\n if (editor.isActive({ textAlign: 'center' })) { return '居中' }\n if (editor.isActive({ textAlign: 'right' })) { return '右对齐' }\n return '左对齐'\n }\n\n private _updateBubbleMenuPosition() {\n requestAnimationFrame(() => {\n const bubbleMenu = this.shadowRoot?.querySelector<HTMLElement>('.bubble-menu')\n const proseMirror = this.shadowRoot?.querySelector<HTMLElement>('.ProseMirror')\n const editorWrapper = this.shadowRoot?.querySelector<HTMLElement>('.editor-wrapper')\n if (!bubbleMenu || !proseMirror || !editorWrapper) { return }\n\n const editor = this._editor\n const isInTable = editor?.isActive('table') ?? false\n const { selection } = editor?.state ?? { selection: null }\n\n // 如果选中了表格节点(而不只是单元格内的文字),隐藏菜单\n if (isInTable && selection && !selection.empty && editor) {\n const { from, to } = selection\n const $from = editor.state.doc.resolve(from)\n const $to = editor.state.doc.resolve(to)\n // 检查选区起点和终点之间是否有表格节点\n let hasTableInSelection = false\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type.name === 'table') {\n hasTableInSelection = true\n break\n }\n }\n // 如果选区起点在表格外但终点在表格内,或者选区跨越了表格\n const fromAncestor = $from.node($from.depth)\n const toAncestor = $to.node($to.depth)\n if (fromAncestor.type.name === 'table' || toAncestor.type.name === 'table') {\n hasTableInSelection = true\n }\n if (hasTableInSelection) {\n bubbleMenu.style.opacity = '0'\n bubbleMenu.style.visibility = 'hidden'\n return\n }\n }\n\n // 如果有选中文字,显示菜单\n if (selection && !selection.empty) {\n // continue to show menu\n } else if (!selection || (selection.empty && !this._hasSlashCommand)) {\n bubbleMenu.style.opacity = '0'\n bubbleMenu.style.visibility = 'hidden'\n return\n }\n\n const wrapperRect = editorWrapper.getBoundingClientRect()\n const menuRect = bubbleMenu.getBoundingClientRect()\n\n const { from } = selection!\n const coords = this._editor?.view.coordsAtPos(from)\n if (!coords) { return }\n\n let left = coords.left - wrapperRect.left\n let top = coords.top - wrapperRect.top - 40\n\n if (left + menuRect.width > wrapperRect.width) {\n left = wrapperRect.width - menuRect.width - 8\n }\n if (left < 0) {\n left = 8\n }\n\n if (top < 0) {\n top = coords.bottom - wrapperRect.top + 8\n }\n\n bubbleMenu.style.left = `${left}px`\n bubbleMenu.style.top = `${top}px`\n bubbleMenu.style.opacity = '1'\n bubbleMenu.style.visibility = 'visible'\n })\n }\n\n render() {\n const editor = this._editor\n\n return html`\n <div class=\"editor-wrapper ${this._isLoading ? 'loading' : ''} ${this.preview ? 'preview' : ''}\">\n ${this._isLoading ? html`\n <div class=\"loading-placeholder\">\n <div class=\"loading-spinner\"></div>\n <span>编辑器加载中...</span>\n </div>\n ` : ''}\n <input\n type=\"file\"\n accept=\"image/*\"\n class=\"image-input\"\n @change=${this._handleImageUpload}\n />\n\n <!-- Bubble Menu (悬浮操作栏) -->\n ${!this.preview ? html`\n <div class=\"bubble-menu\">\n <!-- 文本格式 -->\n <button\n class=\"bubble-btn ${editor?.isActive('bold') ? 'is-active' : ''}\"\n @click=${this._toggleBold}\n title=\"加粗\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('italic') ? 'is-active' : ''}\"\n @click=${this._toggleItalic}\n title=\"斜体\"\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('underline') ? 'is-active' : ''}\"\n @click=${this._toggleUnderline}\n title=\"下划线\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\"/><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('strike') ? 'is-active' : ''}\"\n @click=${this._toggleStrike}\n title=\"删除线\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 5.3 3.9h.2m8.2 3.2c.3.4.4.8.4 1.3 0 2.9-2.7 3.6-6.2 3.6-2.3 0-4.4-.3-6.2-.9M4 12h16\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 文本类型下拉 -->\n <div class=\"bubble-dropdown\">\n <button class=\"bubble-dropdown-btn\">\n ${this._getTextLabel()}\n <svg viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <button\n class=\"bubble-dropdown-item ${!editor?.isActive('heading') ? 'is-active' : ''}\"\n @click=${this._setParagraph}\n >\n 正文\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 1 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(1)}\n >\n 标题 1\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 2 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(2)}\n >\n 标题 2\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 3 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(3)}\n >\n 标题 3\n </button>\n </div>\n </div>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 对齐下拉 -->\n <div class=\"bubble-dropdown\">\n <button class=\"bubble-dropdown-btn\">\n ${this._getAlignLabel()}\n <svg viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'left' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('left')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\"/></svg>\n 左对齐\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'center' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('center')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>\n 居中\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'right' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('right')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\"/></svg>\n 右对齐\n </button>\n </div>\n </div>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 行内代码 -->\n <button\n class=\"bubble-btn ${editor?.isActive('code') ? 'is-active' : ''}\"\n @click=${this._toggleCode}\n title=\"行内代码\"\n >\n <svg viewBox=\"0 0 24 24\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>\n </button>\n\n <!-- 链接 -->\n <button\n class=\"bubble-btn ${editor?.isActive('link') ? 'is-active' : ''}\"\n @click=${this._setLink}\n title=\"链接\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>\n </button>\n\n <!-- 图片 -->\n <button\n class=\"bubble-btn\"\n @click=${this._triggerImageUpload}\n title=\"图片\"\n >\n <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 列表 -->\n <button\n class=\"bubble-btn ${editor?.isActive('bulletList') ? 'is-active' : ''}\"\n @click=${this._toggleBulletList}\n title=\"无序列表\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\"/>\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\"/>\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\"/>\n <circle cx=\"4\" cy=\"6\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"12\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"18\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n </svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('orderedList') ? 'is-active' : ''}\"\n @click=${this._toggleOrderedList}\n title=\"有序列表\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/>\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/>\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/>\n <path d=\"M4 6h1v4\"/>\n <path d=\"M4 10h2\"/>\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1.5\"/>\n </svg>\n </button>\n\n <!-- 引用 -->\n <button\n class=\"bubble-btn ${editor?.isActive('blockquote') ? 'is-active' : ''}\"\n @click=${this._toggleBlockquote}\n title=\"引用\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\"/><path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 表格下拉 -->\n <div\n class=\"bubble-dropdown ${this._tableDropdownOpen ? 'is-open' : ''}\"\n @mouseenter=${() => {\n this._tableDropdownOpen = true\n this._hoverRow = 0\n this._hoverCol = 0\n }}\n @mouseleave=${() => this._tableDropdownOpen = false}\n >\n <button class=\"bubble-dropdown-btn\" title=\"表格\">\n <svg viewBox=\"0 0 24 24\" style=\"width:18px;height:18px;stroke:currentColor;stroke-width:2;fill:none;\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <div class=\"table-grid-preview\">\n ${this._renderTableGrid()}\n </div>\n <div class=\"table-size-hint\">\n <span>${this._hoverRow > 0 ? `${this._hoverRow} × ${this._hoverCol}` : `${this._tableRows} × ${this._tableCols}`}</span>\n </div>\n </div>\n </div>\n </div>\n ` : ''}\n\n <div class=\"editor-content\"></div>\n\n <!-- Table Cell Toolbar -->\n ${this._tableCellToolbar.visible && editor?.isActive('table')\n ? html`\n <div\n class=\"table-cell-toolbar\"\n style=\"left: ${this._tableCellToolbar.x}px; top: ${this._tableCellToolbar.y}px;\"\n @mousedown=${(e: Event) => e.preventDefault()}\n >\n ${this._tableCellToolbar.cellRow === 0 ? html`\n <button class=\"table-cell-toolbar-btn\" title=\"上方添加行\" @click=${this._addTableRowAbove}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"7\"/><line x1=\"10\" y1=\"5\" x2=\"14\" y2=\"5\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn\" title=\"下方添加行\" @click=${this._addTableRowBelow}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"17\"/><line x1=\"10\" y1=\"19\" x2=\"14\" y2=\"19\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除行\" @click=${this._deleteTableRow}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"9\" y1=\"10\" x2=\"9\" y2=\"14\"/><line x1=\"15\" y1=\"10\" x2=\"15\" y2=\"14\"/></svg>\n </button>\n ` : ''}\n ${this._tableCellToolbar.cellCol === 0 ? html`\n ${this._tableCellToolbar.cellRow !== 0 ? html`<div style=\"width:1px;height:20px;background:#e3e3e3;margin:0 4px;\"></div>` : ''}\n <button class=\"table-cell-toolbar-btn\" title=\"左侧添加列\" @click=${this._addTableColumnLeft}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"3\" y1=\"12\" x2=\"7\" y2=\"12\"/><line x1=\"5\" y1=\"10\" x2=\"5\" y2=\"14\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn\" title=\"右侧添加列\" @click=${this._addTableColumnRight}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"21\" y1=\"12\" x2=\"17\" y2=\"12\"/><line x1=\"19\" y1=\"10\" x2=\"19\" y2=\"14\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除列\" @click=${this._deleteTableColumn}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"10\" y1=\"9\" x2=\"14\" y2=\"9\"/><line x1=\"10\" y1=\"15\" x2=\"14\" y2=\"15\"/></svg>\n </button>\n ` : ''}\n ${this._tableCellToolbar.cellRow === 0 && this._tableCellToolbar.cellCol === 0 ? html`\n <div style=\"width:1px;height:20px;background:#e3e3e3;margin:0 4px;\"></div>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除表格\" @click=${this._deleteTable}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n </button>\n ` : ''}\n </div>\n `\n : ''}\n\n <!-- Image Toolbar -->\n ${this._imageToolbar.visible\n ? html`\n <div\n class=\"image-toolbar\"\n style=\"left: ${this._imageToolbar.x}px; top: ${this._imageToolbar.y}px;\"\n @mousedown=${(e: Event) => e.preventDefault()}\n >\n <button class=\"image-toolbar-btn danger\" title=\"删除图片\" @click=${this._deleteImage}>\n <svg viewBox=\"0 0 24 24\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n </button>\n <button class=\"image-toolbar-btn\" title=\"添加图片\" @click=${this._insertImageAfter}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>\n </button>\n <div class=\"image-toolbar-divider\"></div>\n <div style=\"position: relative;\">\n <button class=\"image-toolbar-btn\" title=\"更多\" @click=${this._toggleImageMoreMenu}>\n <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/></svg>\n </button>\n ${this._imageMoreMenuVisible\n ? html`\n <div class=\"image-more-menu\">\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignLeft}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\"/></svg>\n 左对齐\n </button>\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignCenter}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>\n 居中\n </button>\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignRight}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\"/></svg>\n 右对齐\n </button>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n : ''}\n </div>\n `\n }\n\n private _renderTableGrid() {\n const cells = []\n for (let i = 0; i < 100; i++) {\n const row = Math.floor(i / 10) + 1\n const col = (i % 10) + 1\n const isHighlight = this._hoverRow > 0 && row <= this._hoverRow && col <= this._hoverCol\n cells.push(html`\n <div\n class=\"table-cell ${isHighlight ? 'selected' : ''}\"\n @click=${() => {\n this._insertTableByClick(row, col)\n this._tableDropdownOpen = false\n }}\n @mouseenter=${() => {\n this._hoverRow = row\n this._hoverCol = col\n }}\n @mouseleave=${() => {\n this._hoverRow = 0\n this._hoverCol = 0\n }}\n ></div>\n `)\n }\n return cells\n }\n}\n\nexport function register() {}\n"],"names":["QxsBlocksuiteEditor","LitElement","constructor","super","arguments","this","content","readonly","preview","_editor","_pendingContent","_tableRows","_tableCols","_hoverRow","_hoverCol","_tableDropdownOpen","_isLoading","_tableCellToolbar","x","y","visible","cellRow","cellCol","_tableEdgeHover","type","index","position","_imageToolbar","_imageMoreMenuVisible","_hasSlashCommand","_tableEdgeDetectionSetup","_initEditor","el","shadowRoot","querySelector","requestAnimationFrame","extensions","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","Heading","configure","levels","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","History","Image","inline","allowBase64","Link","openOnClick","HTMLAttributes","rel","TextAlign","types","Table","resizable","TableRow","TableCell","TableHeader","Placeholder","placeholder","Editor","element","editable","on","requestUpdate","_updateBubbleMenuPosition","isActive","_showTableCellToolbar","_hideTableCellToolbar","editor","selection","state","$from","node","depth","name","coords","view","coordsAtPos","start","wrapperRect","getBoundingClientRect","left","right","top","_showImageToolbar","_hideImageToolbar","_checkSlashCommand","_setupTableEdgeDetection","editorContent","addEventListener","e","_handleTableEdgeMouseMove","target","tagName","pos","posAtDOM","chain","focus","setNodeSelection","run","table","closest","tableRect","editorWrapper","relativeX","clientX","relativeY","clientY","edgeThreshold","rowHeight","height","rows","length","i","rowTop","rowBottom","colWidth","width","cells","colLeft","colRight","textBefore","doc","textBetween","Math","max","from","endsWith","firstUpdated","updated","changed","has","commands","setContent","setEditable","disconnectedCallback","destroy","getContent","getHTML","_applyFormat","command","deleteRange","to","_toggleBold","toggleBold","_toggleItalic","toggleItalic","_toggleUnderline","toggleUnderline","_toggleStrike","toggleStrike","_toggleCode","toggleCode","_setHeading","level","toggleHeading","_setParagraph","setParagraph","_toggleBulletList","toggleBulletList","_toggleOrderedList","toggleOrderedList","_toggleBlockquote","toggleBlockquote","_setTextAlign","align","setTextAlign","_setLink","url","window","prompt","setLink","href","_unsetLink","unsetLink","_insertTable","cols","insertTable","withHeaderRow","_handleImageUpload","input","file","files","reader","FileReader","onload","res","src","result","setImage","readAsDataURL","value","_triggerImageUpload","click","_insertTableByClick","_insertHorizontalRule","setHorizontalRule","_getTableCellRow","_getTableCellCol","bottom","$pos","resolve","d","_addTableRowAbove","addRowBefore","_addTableRowBelow","addRowAfter","_addTableColumnLeft","addColumnBefore","_addTableColumnRight","addColumnAfter","_deleteTableRow","deleteRow","_deleteTableColumn","deleteColumn","_deleteTable","deleteTable","_toggleImageMoreMenu","_deleteImage","deleteNode","_insertImageAfter","_setImageAlignLeft","img","style","display","margin","_setImageAlignCenter","_setImageAlignRight","_updateImageToolbarPosition","_getTextLabel","_getAlignLabel","textAlign","bubbleMenu","proseMirror","isInTable","empty","$to","hasTableInSelection","fromAncestor","toAncestor","opacity","visibility","menuRect","render","html","_renderTableGrid","preventDefault","row","floor","col","isHighlight","push","styles","css","__decorateClass","property","String","attribute","prototype","Boolean","safeCustomElement"],"mappings":"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"}
1
+ {"version":3,"file":"blocksuite-editor.mjs","sources":["../../../../packages/components-wc/src/editor/blocksuite-editor.ts"],"sourcesContent":["import { Editor } from '@tiptap/core'\nimport Blockquote from '@tiptap/extension-blockquote'\nimport Bold from '@tiptap/extension-bold'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport Code from '@tiptap/extension-code'\nimport Document from '@tiptap/extension-document'\nimport Heading from '@tiptap/extension-heading'\nimport History from '@tiptap/extension-history'\nimport HorizontalRule from '@tiptap/extension-horizontal-rule'\nimport Image from '@tiptap/extension-image'\nimport Italic from '@tiptap/extension-italic'\nimport Link from '@tiptap/extension-link'\nimport ListItem from '@tiptap/extension-list-item'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport Paragraph from '@tiptap/extension-paragraph'\nimport Strike from '@tiptap/extension-strike'\nimport { Table } from '@tiptap/extension-table'\nimport { TableCell } from '@tiptap/extension-table-cell'\nimport { TableHeader } from '@tiptap/extension-table-header'\nimport { TableRow } from '@tiptap/extension-table-row'\nimport Text from '@tiptap/extension-text'\nimport TextAlign from '@tiptap/extension-text-align'\nimport Underline from '@tiptap/extension-underline'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\n\n@safeCustomElement('qxs-blocksuite-editor')\nexport class QxsBlocksuiteEditor extends LitElement {\n static styles = css`\n :host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, sans-serif;\n }\n\n .editor-wrapper {\n border: 1px solid #e3e3e3;\n border-radius: 12px;\n background: transparent;\n overflow: visible;\n position: relative;\n }\n\n .editor-wrapper:focus-within {\n border-color: #1e96fc;\n box-shadow: 0 0 0 2px rgba(30, 150, 252, 0.1);\n }\n\n .editor-wrapper.preview {\n border: none;\n border-radius: 0;\n background: transparent;\n }\n\n .editor-wrapper.preview .editor-content {\n padding: 8px 12px;\n min-height: unset;\n }\n\n .editor-content {\n padding: 16px 20px;\n min-height: 200px;\n cursor: text;\n }\n\n .editor-content:empty::before {\n content: '输入 / 唤出快捷命令';\n color: #c0c0c0;\n pointer-events: none;\n display: block;\n margin-top: 80px;\n text-align: center;\n }\n\n .editor-content .ProseMirror:empty {\n min-height: 200px;\n }\n\n .ProseMirror p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n color: #c0c0c0;\n pointer-events: none;\n float: left;\n height: 0;\n }\n\n .editor-wrapper.loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n background: #fafafa;\n }\n\n .loading-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n color: #909399;\n font-size: 14px;\n }\n\n .loading-spinner {\n width: 24px;\n height: 24px;\n border: 2px solid #e3e3e3;\n border-top-color: #1e96fc;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .ProseMirror {\n outline: none;\n line-height: 1.7;\n color: #37352f;\n font-size: 15px;\n }\n\n .ProseMirror > * + * {\n margin-top: 0.5em;\n }\n\n .ProseMirror > *:first-child {\n margin-top: 0 !important;\n }\n\n .ProseMirror p {\n margin: 0;\n }\n\n .ProseMirror h1 {\n font-size: 1.875em;\n font-weight: 700;\n margin: 0 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror > h1:first-child {\n margin-top: 0 !important;\n line-height: 1.15;\n }\n\n .ProseMirror > p:first-child {\n margin-top: 0 !important;\n }\n\n .ProseMirror h2 {\n font-size: 1.5em;\n font-weight: 600;\n margin: 0.5em 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror h3 {\n font-size: 1.25em;\n font-weight: 600;\n margin: 0.5em 0 0.25em;\n line-height: 1.3;\n }\n\n .ProseMirror ul,\n .ProseMirror ol {\n padding-left: 1.5em;\n margin: 0;\n }\n\n .ProseMirror li {\n margin: 0.1em 0;\n }\n\n .ProseMirror li::marker {\n color: #37352f;\n }\n\n .ProseMirror strong {\n font-weight: 700;\n }\n\n .ProseMirror em {\n font-style: italic;\n font-synthesis: none;\n transform: skewX(-12deg);\n display: inline-block;\n }\n\n .ProseMirror u {\n text-decoration: underline;\n }\n\n .ProseMirror s {\n text-decoration: line-through;\n color: #787774;\n }\n\n .ProseMirror code {\n background: rgba(135, 131, 120, 0.14);\n color: #eb5757;\n padding: 2px 4px;\n border-radius: 4px;\n font-family: 'SFMono-Regular', Menlo, Consolas, monospace;\n font-size: 85%;\n }\n\n .ProseMirror pre {\n background: #f6f6f7;\n border-radius: 8px;\n padding: 12px 16px;\n overflow-x: auto;\n }\n\n .ProseMirror pre code {\n background: none;\n padding: 0;\n color: #37352f;\n }\n\n .ProseMirror blockquote {\n border-left: 3px solid #e3e3e3;\n padding-left: 1em;\n margin: 0.75em 0;\n color: #787774;\n }\n\n .ProseMirror hr {\n border: none;\n border-top: 1px solid #e3e3e3;\n margin: 1.5em 0;\n }\n\n .ProseMirror img {\n max-width: 100%;\n height: auto;\n border-radius: 8px;\n }\n\n .ProseMirror a {\n color: #1e96fc;\n text-decoration: underline;\n cursor: pointer;\n }\n\n .ProseMirror img.ProseMirror-selectednode {\n outline: 2px solid #1e96fc;\n }\n\n /* Table styles */\n .ProseMirror table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .ProseMirror th,\n .ProseMirror td {\n border: 1px solid #e3e3e3;\n padding: 8px 12px;\n text-align: left;\n vertical-align: top;\n }\n\n .ProseMirror th {\n background: #fafafa;\n font-weight: 600;\n }\n\n .ProseMirror .selectedCell {\n background: rgba(30, 150, 252, 0.1);\n }\n\n /* Table Cell Toolbar */\n .table-cell-toolbar {\n position: absolute;\n z-index: 50;\n display: flex;\n gap: 2px;\n padding: 4px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n\n .table-cell-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #606266;\n transition: all 0.15s;\n }\n\n .table-cell-toolbar-btn:hover {\n background: #ecf5ff;\n color: #1e96fc;\n }\n\n .table-cell-toolbar-btn.danger:hover {\n background: #fef0f0;\n color: #f56c6c;\n }\n\n /* Table Edge Add Button */\n .table-edge-add {\n position: absolute;\n z-index: 40;\n display: none;\n width: 20px;\n height: 20px;\n align-items: center;\n justify-content: center;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n color: #606266;\n transition: all 0.15s;\n }\n\n .table-edge-add:hover {\n background: #ecf5ff;\n border-color: #1e96fc;\n color: #1e96fc;\n }\n\n .table-edge-add.visible {\n display: flex;\n }\n\n .table-edge-add-row {\n width: 100%;\n height: 8px;\n left: 0;\n border-radius: 0 0 4px 4px;\n }\n\n .table-edge-add-col {\n height: 100%;\n width: 8px;\n top: 0;\n border-radius: 0 4px 4px 0;\n }\n\n /* Bubble Menu - 企业级风格 */\n .bubble-menu {\n position: absolute;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 100;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s, visibility 0.15s, transform 0.15s;\n transform: translateY(4px);\n max-width: calc(100vw - 40px);\n }\n\n .bubble-menu.is-visible {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-menu.is-visible {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s;\n position: relative;\n }\n\n .bubble-btn:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-btn.is-active {\n background: #1e96fc;\n color: #fff;\n }\n\n .bubble-btn svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .bubble-divider {\n width: 1px;\n height: 16px;\n background: #e3e3e3;\n margin: 0 3px;\n }\n\n /* Dropdown */\n .bubble-dropdown {\n position: relative;\n }\n\n .bubble-dropdown-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 0 6px;\n height: 28px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n transition: all 0.15s;\n white-space: nowrap;\n }\n\n .bubble-dropdown-btn:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-dropdown-btn svg {\n width: 12px;\n height: 12px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .bubble-dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 4px;\n min-width: 120px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n padding: 4px;\n opacity: 0;\n visibility: hidden;\n transform: translateY(-4px);\n transition: all 0.15s;\n z-index: 101;\n }\n\n .bubble-dropdown:hover .bubble-dropdown-menu,\n .bubble-dropdown.is-open .bubble-dropdown-menu {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n\n .bubble-dropdown-item {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 6px 8px;\n border: none;\n background: transparent;\n color: #37352f;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n text-align: left;\n transition: all 0.15s;\n }\n\n .bubble-dropdown-item:hover {\n background: rgba(55, 53, 47, 0.08);\n }\n\n .bubble-dropdown-item.is-active {\n background: #1e96fc;\n color: #fff;\n }\n\n .bubble-dropdown-item svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .image-input {\n display: none;\n }\n\n .table-grid-preview {\n display: grid;\n grid-template-columns: repeat(10, 18px);\n gap: 2px;\n padding: 8px;\n }\n\n .table-grid-preview .table-cell {\n width: 18px;\n height: 18px;\n border: 1px solid #e3e3e3;\n border-radius: 2px;\n background: #fff;\n cursor: pointer;\n transition: all 0.1s;\n }\n\n .table-grid-preview .table-cell:hover {\n background: rgba(30, 150, 252, 0.3);\n border-color: #1e96fc;\n }\n\n .table-grid-preview .table-cell.selected {\n background: rgba(30, 150, 252, 0.15);\n border-color: rgba(30, 150, 252, 0.5);\n }\n\n .table-size-hint {\n text-align: center;\n padding: 4px 8px 6px;\n font-size: 10px;\n color: #8c8c8c;\n }\n\n /* Image Toolbar */\n .image-toolbar {\n position: absolute;\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 100;\n transform: translateX(-50%);\n }\n\n .image-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #595959;\n transition: all 0.15s;\n }\n\n .image-toolbar-btn:hover {\n background: #f5f5f5;\n color: #1e96fc;\n }\n\n .image-toolbar-btn.danger:hover {\n background: #fff1f0;\n color: #ff4d4f;\n }\n\n .image-toolbar-btn svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n .image-toolbar-divider {\n width: 1px;\n height: 20px;\n background: #e3e3e3;\n margin: 0 4px;\n }\n\n /* Image More Menu */\n .image-more-menu {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 4px;\n padding: 4px;\n background: #fff;\n border: 1px solid #e3e3e3;\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n z-index: 101;\n min-width: 120px;\n }\n\n .image-more-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: none;\n background: transparent;\n width: 100%;\n text-align: left;\n font-size: 13px;\n color: #595959;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .image-more-menu-item:hover {\n background: #f5f5f5;\n color: #1e96fc;\n }\n\n .image-more-menu-item svg {\n width: 14px;\n height: 14px;\n stroke: currentColor;\n stroke-width: 2;\n fill: none;\n }\n\n /* Selected Image */\n .ProseMirror img.selected {\n outline: 2px solid #1e96fc;\n outline-offset: 2px;\n }\n `\n\n @property({ type: String, attribute: 'content' })\n content = ''\n\n @property({ type: Boolean, attribute: 'readonly' })\n readonly = false\n\n @property({ type: Boolean, attribute: 'preview' })\n preview = false\n\n @property({ type: Object, attribute: 'upload-image' })\n uploadImage: (file: File) => Promise<string> = async (file: File) => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = (e) => resolve(e.target?.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n }\n\n private _editor: Editor | null = null\n @state() private _pendingContent: string | null = null\n private _tableRows = 3\n private _tableCols = 3\n @state() private _hoverRow = 0\n @state() private _hoverCol = 0\n @state() private _tableDropdownOpen = false\n @state() private _isLoading = true\n @state() private _tableCellToolbar: { x: number, y: number, visible: boolean, cellRow: number, cellCol: number } = { x: 0, y: 0, visible: false, cellRow: 0, cellCol: 0 }\n @state() private _tableEdgeHover: { type: 'row' | 'col' | null, index: number, position: { x: number, y: number } } = { type: null, index: 0, position: { x: 0, y: 0 } }\n @state() private _imageToolbar: { x: number, y: number, visible: boolean } = { x: 0, y: 0, visible: false }\n @state() private _imageMoreMenuVisible = false\n @state() private _hasSlashCommand = false\n\n private _initEditor() {\n if (this._editor) return\n \n const el = this.shadowRoot?.querySelector<HTMLElement>('.editor-content')\n if (!el) { \n requestAnimationFrame(() => this._initEditor())\n return \n }\n \n this._isLoading = false\n\n const extensions: any[] = [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n Heading.configure({ levels: [1, 2, 3] }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n History,\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n },\n }),\n TextAlign.configure({\n types: ['heading', 'paragraph'],\n }),\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({\n placeholder: '输入 / 唤出快捷命令',\n }),\n ]\n\n this._editor = new Editor({\n element: el,\n extensions,\n content: (this._pendingContent ?? this.content) || '<p></p>',\n editable: !this.readonly,\n })\n\n this._pendingContent = null\n\n this._editor.on('selectionUpdate', () => {\n this.requestUpdate()\n this._updateBubbleMenuPosition()\n if (this._editor?.isActive('table')) {\n this._showTableCellToolbar()\n } else {\n this._hideTableCellToolbar()\n }\n // Image selection detection\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const { $from } = selection\n const node = $from.node($from.depth)\n if (node.type.name === 'image') {\n const coords = editor.view.coordsAtPos($from.start())\n const wrapperRect = this.shadowRoot?.querySelector('.editor-wrapper')?.getBoundingClientRect()\n if (wrapperRect) {\n const x = coords.left - wrapperRect.left + (coords.right - coords.left) / 2\n const y = coords.top - wrapperRect.top - 40\n this._showImageToolbar({ x, y })\n }\n } else {\n this._hideImageToolbar()\n }\n }\n })\n\n this._editor.on('transaction', () => {\n this.requestUpdate()\n if (this._editor?.isActive('table')) {\n this._showTableCellToolbar()\n } else {\n this._hideTableCellToolbar()\n }\n this._checkSlashCommand()\n this._setupTableEdgeDetection()\n })\n }\n\n private _tableEdgeDetectionSetup = false\n\n private _setupTableEdgeDetection() {\n const editorContent = this.shadowRoot?.querySelector('.editor-content')\n if (!editorContent || this._tableEdgeDetectionSetup) return\n \n this._tableEdgeDetectionSetup = true\n \n editorContent.addEventListener('mousemove', (e: Event) => {\n this._handleTableEdgeMouseMove(e as MouseEvent)\n })\n\n editorContent.addEventListener('mouseleave', () => {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n })\n\n // Image click to select\n editorContent.addEventListener('click', (e: Event) => {\n const target = e.target as HTMLElement\n if (target.tagName === 'IMG') {\n const pos = this._editor?.view.posAtDOM(target, 0)\n if (pos !== undefined) {\n this._editor?.chain().focus().setNodeSelection(pos).run()\n }\n }\n })\n }\n\n private _handleTableEdgeMouseMove(e: MouseEvent) {\n if (!this._editor?.isActive('table')) {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n return\n }\n\n const target = e.target as HTMLElement\n const table = target.closest('table')\n if (!table) {\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n return\n }\n\n const tableRect = table.getBoundingClientRect()\n const editorWrapper = this.shadowRoot?.querySelector('.editor-wrapper')\n if (!editorWrapper) return\n const wrapperRect = editorWrapper.getBoundingClientRect()\n\n const relativeX = e.clientX - wrapperRect.left\n const relativeY = e.clientY - wrapperRect.top\n\n const edgeThreshold = 10\n const rowHeight = tableRect.height / table.rows.length\n\n for (let i = 0; i < table.rows.length; i++) {\n const rowTop = tableRect.top + i * rowHeight\n const rowBottom = rowTop + rowHeight\n \n if (e.clientY >= rowTop - edgeThreshold && e.clientY <= rowTop + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'row',\n index: i,\n position: { x: relativeX, y: rowTop - wrapperRect.top }\n }\n this.requestUpdate()\n return\n }\n \n if (e.clientY >= rowBottom - edgeThreshold && e.clientY <= rowBottom + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'row',\n index: i + 1,\n position: { x: relativeX, y: rowBottom - wrapperRect.top }\n }\n this.requestUpdate()\n return\n }\n }\n\n const colWidth = tableRect.width / table.rows[0]?.cells.length || 1\n for (let i = 0; i < (table.rows[0]?.cells.length || 0); i++) {\n const colLeft = tableRect.left + i * colWidth\n const colRight = colLeft + colWidth\n \n if (e.clientX >= colLeft - edgeThreshold && e.clientX <= colLeft + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'col',\n index: i,\n position: { x: colLeft - wrapperRect.left, y: relativeY }\n }\n this.requestUpdate()\n return\n }\n \n if (e.clientX >= colRight - edgeThreshold && e.clientX <= colRight + edgeThreshold) {\n this._tableEdgeHover = {\n type: 'col',\n index: i + 1,\n position: { x: colRight - wrapperRect.left, y: relativeY }\n }\n this.requestUpdate()\n return\n }\n }\n\n this._tableEdgeHover = { type: null, index: 0, position: { x: 0, y: 0 } }\n this.requestUpdate()\n }\n\n private _checkSlashCommand() {\n if (!this._editor) return\n const { selection } = this._editor.state\n const textBefore = this._editor.state.doc.textBetween(\n Math.max(0, selection.from - 10),\n selection.from,\n ' '\n )\n this._hasSlashCommand = textBefore.endsWith('/')\n }\n\n firstUpdated() {\n this._initEditor()\n }\n\n updated(changed: Map<string, unknown>) {\n if (this._editor) {\n if (changed.has('content')) {\n this._editor.commands.setContent(this.content || '<p></p>')\n }\n if (changed.has('readonly')) {\n this._editor.setEditable(!this.readonly)\n }\n return\n }\n\n if (changed.has('content')) {\n this._pendingContent = this.content\n }\n\n const el = this.shadowRoot?.querySelector<HTMLElement>('.editor-content')\n if (el && !this._editor) {\n this._initEditor()\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this._editor?.destroy()\n this._editor = null\n }\n\n getContent(): string {\n return this._editor?.getHTML() ?? ''\n }\n\n private _applyFormat(command: () => void) {\n if (this._hasSlashCommand && this._editor) {\n const { selection } = this._editor.state\n this._editor.chain().focus().deleteRange({ from: selection.from - 1, to: selection.from }).run()\n this._hasSlashCommand = false\n }\n command()\n }\n\n private _toggleBold() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBold().run())\n }\n\n private _toggleItalic() {\n this._applyFormat(() => this._editor?.chain().focus().toggleItalic().run())\n }\n\n private _toggleUnderline() {\n this._applyFormat(() => this._editor?.chain().focus().toggleUnderline().run())\n }\n\n private _toggleStrike() {\n this._applyFormat(() => this._editor?.chain().focus().toggleStrike().run())\n }\n\n private _toggleCode() {\n this._applyFormat(() => this._editor?.chain().focus().toggleCode().run())\n }\n\n private _setHeading(level: number) {\n this._applyFormat(() => this._editor?.chain().focus().toggleHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run())\n }\n\n private _setParagraph() {\n this._applyFormat(() => this._editor?.chain().focus().setParagraph().run())\n }\n\n private _toggleBulletList() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBulletList().run())\n }\n\n private _toggleOrderedList() {\n this._applyFormat(() => this._editor?.chain().focus().toggleOrderedList().run())\n }\n\n private _toggleBlockquote() {\n this._applyFormat(() => this._editor?.chain().focus().toggleBlockquote().run())\n }\n\n private _setTextAlign(align: string) {\n this._applyFormat(() => this._editor?.chain().focus().setTextAlign(align as any).run())\n }\n\n private _setLink() {\n // eslint-disable-next-line no-alert\n const url = window.prompt('请输入链接地址:')\n if (url) {\n this._applyFormat(() => this._editor?.chain().focus().setLink({ href: url }).run())\n }\n }\n\n private _unsetLink() {\n this._applyFormat(() => this._editor?.chain().focus().unsetLink().run())\n }\n\n private _insertTable(rows?: number, cols?: number) {\n this._editor?.chain().focus().insertTable({ rows: rows ?? this._tableRows, cols: cols ?? this._tableCols, withHeaderRow: true }).run()\n }\n\n private async _handleImageUpload(e: Event) {\n const input = e.target as HTMLInputElement\n const file = input.files?.[0]\n if (file) {\n try {\n const src = await this.uploadImage(file)\n this._editor?.chain().focus().setImage({ src }).run()\n }\n catch (err) {\n console.error('图片上传失败:', err)\n }\n }\n input.value = ''\n }\n\n private _triggerImageUpload() {\n const input = this.shadowRoot?.querySelector<HTMLInputElement>('.image-input')\n input?.click()\n }\n\n private _insertTableByClick(rows: number, cols: number) {\n if (this._hasSlashCommand && this._editor) {\n const { selection } = this._editor.state\n this._editor.chain().focus().deleteRange({ from: selection.from - 1, to: selection.from }).run()\n this._hasSlashCommand = false\n }\n this._tableRows = rows\n this._tableCols = cols\n this._insertTable(rows, cols)\n }\n\n private _insertHorizontalRule() {\n this._editor?.chain().focus().setHorizontalRule().run()\n }\n\n private _showTableCellToolbar() {\n if (!this._editor?.isActive('table')) return\n const { state } = this._editor\n const { selection } = state\n const coords = this._editor.view.coordsAtPos(selection.from)\n const editorWrapper = this.shadowRoot?.querySelector<HTMLElement>('.editor-wrapper')\n if (!editorWrapper) return\n const wrapperRect = editorWrapper.getBoundingClientRect()\n\n const cellRow = this._getTableCellRow()\n const cellCol = this._getTableCellCol()\n const isTopRow = cellRow === 0\n const isLeftCol = cellCol === 0\n\n // Only show toolbar on top row or left column\n if (!isTopRow && !isLeftCol) return\n\n this._tableCellToolbar = {\n x: coords.left - wrapperRect.left,\n y: coords.bottom - wrapperRect.top + 8,\n visible: true,\n cellRow,\n cellCol,\n }\n }\n\n private _getTableCellRow(): number {\n if (!this._editor) return 0\n const { selection } = this._editor.state\n const $pos = this._editor.state.doc.resolve(selection.from)\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d)\n if (node.type.name === 'tableCell') {\n return $pos.index(d - 1)\n }\n }\n return 0\n }\n\n private _getTableCellCol(): number {\n if (!this._editor) return 0\n const { selection } = this._editor.state\n const $pos = this._editor.state.doc.resolve(selection.from)\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d)\n if (node.type.name === 'tableCell') {\n return $pos.index(d)\n }\n }\n return 0\n }\n\n private _hideTableCellToolbar() {\n this._tableCellToolbar = { ...this._tableCellToolbar, visible: false }\n }\n\n private _addTableRowAbove() {\n this._editor?.chain().focus().addRowBefore().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableRowBelow() {\n this._editor?.chain().focus().addRowAfter().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableColumnLeft() {\n this._editor?.chain().focus().addColumnBefore().run()\n this._hideTableCellToolbar()\n }\n\n private _addTableColumnRight() {\n this._editor?.chain().focus().addColumnAfter().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTableRow() {\n this._editor?.chain().focus().deleteRow().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTableColumn() {\n this._editor?.chain().focus().deleteColumn().run()\n this._hideTableCellToolbar()\n }\n\n private _deleteTable() {\n this._editor?.chain().focus().deleteTable().run()\n this._hideTableCellToolbar()\n }\n\n // Image Toolbar Methods\n private _showImageToolbar(pos: { x: number, y: number }) {\n this._imageToolbar = { x: pos.x, y: pos.y, visible: true }\n this._imageMoreMenuVisible = false\n }\n\n private _hideImageToolbar() {\n this._imageToolbar = { ...this._imageToolbar, visible: false }\n this._imageMoreMenuVisible = false\n }\n\n private _toggleImageMoreMenu() {\n this._imageMoreMenuVisible = !this._imageMoreMenuVisible\n }\n\n private _deleteImage() {\n this._editor?.chain().focus().deleteNode('image').run()\n this._hideImageToolbar()\n }\n\n private _insertImageAfter() {\n this._triggerImageUpload()\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignLeft() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 auto 0 0'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignCenter() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 auto'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _setImageAlignRight() {\n const editor = this._editor\n if (editor) {\n const { selection } = editor.state\n const pos = selection.from\n editor.chain().focus().setNodeSelection(pos).run()\n const img = this.shadowRoot?.querySelector('.ProseMirror img.ProseMirror-selectednode') as HTMLElement\n if (img) {\n img.style.display = 'block'\n img.style.margin = '0 0 0 auto'\n }\n }\n this._imageMoreMenuVisible = false\n }\n\n private _updateImageToolbarPosition() {\n requestAnimationFrame(() => {\n const editor = this._editor\n if (!editor) return\n\n const { selection } = editor.state\n const { $from } = selection\n\n // Find if we're inside an image node\n const imageNode = $from.node($from.depth).type.name === 'image'\n ? $from.node($from.depth)\n : null\n\n if (imageNode) {\n const coords = editor.view.coordsAtPos($from.start())\n const wrapperRect = this.shadowRoot?.querySelector('.editor-wrapper')?.getBoundingClientRect()\n if (wrapperRect) {\n const x = coords.left - wrapperRect.left + (coords.right - coords.left) / 2\n const y = coords.top - wrapperRect.top - 40\n this._showImageToolbar({ x, y })\n }\n } else {\n this._hideImageToolbar()\n }\n })\n }\n\n private _getTextLabel(): string {\n const editor = this._editor\n if (!editor) { return '正文' }\n if (editor.isActive('heading', { level: 1 })) { return '标题 1' }\n if (editor.isActive('heading', { level: 2 })) { return '标题 2' }\n if (editor.isActive('heading', { level: 3 })) { return '标题 3' }\n return '正文'\n }\n\n private _getAlignLabel(): string {\n const editor = this._editor\n if (!editor) { return '对齐' }\n if (editor.isActive({ textAlign: 'center' })) { return '居中' }\n if (editor.isActive({ textAlign: 'right' })) { return '右对齐' }\n return '左对齐'\n }\n\n private _updateBubbleMenuPosition() {\n requestAnimationFrame(() => {\n const bubbleMenu = this.shadowRoot?.querySelector<HTMLElement>('.bubble-menu')\n const proseMirror = this.shadowRoot?.querySelector<HTMLElement>('.ProseMirror')\n const editorWrapper = this.shadowRoot?.querySelector<HTMLElement>('.editor-wrapper')\n if (!bubbleMenu || !proseMirror || !editorWrapper) { return }\n\n const editor = this._editor\n const isInTable = editor?.isActive('table') ?? false\n const { selection } = editor?.state ?? { selection: null }\n\n // 如果选中了表格节点(而不只是单元格内的文字),隐藏菜单\n if (isInTable && selection && !selection.empty && editor) {\n const { from, to } = selection\n const $from = editor.state.doc.resolve(from)\n const $to = editor.state.doc.resolve(to)\n // 检查选区起点和终点之间是否有表格节点\n let hasTableInSelection = false\n for (let d = $from.depth; d >= 0; d--) {\n if ($from.node(d).type.name === 'table') {\n hasTableInSelection = true\n break\n }\n }\n // 如果选区起点在表格外但终点在表格内,或者选区跨越了表格\n const fromAncestor = $from.node($from.depth)\n const toAncestor = $to.node($to.depth)\n if (fromAncestor.type.name === 'table' || toAncestor.type.name === 'table') {\n hasTableInSelection = true\n }\n if (hasTableInSelection) {\n bubbleMenu.style.opacity = '0'\n bubbleMenu.style.visibility = 'hidden'\n return\n }\n }\n\n // 如果有选中文字,显示菜单\n if (selection && !selection.empty) {\n // continue to show menu\n } else if (!selection || (selection.empty && !this._hasSlashCommand)) {\n bubbleMenu.style.opacity = '0'\n bubbleMenu.style.visibility = 'hidden'\n return\n }\n\n const wrapperRect = editorWrapper.getBoundingClientRect()\n const menuRect = bubbleMenu.getBoundingClientRect()\n\n const { from } = selection!\n const coords = this._editor?.view.coordsAtPos(from)\n if (!coords) { return }\n\n let left = coords.left - wrapperRect.left\n let top = coords.top - wrapperRect.top - 40\n\n if (left + menuRect.width > wrapperRect.width) {\n left = wrapperRect.width - menuRect.width - 8\n }\n if (left < 0) {\n left = 8\n }\n\n if (top < 0) {\n top = coords.bottom - wrapperRect.top + 8\n }\n\n bubbleMenu.style.left = `${left}px`\n bubbleMenu.style.top = `${top}px`\n bubbleMenu.style.opacity = '1'\n bubbleMenu.style.visibility = 'visible'\n })\n }\n\n render() {\n const editor = this._editor\n\n return html`\n <div class=\"editor-wrapper ${this._isLoading ? 'loading' : ''} ${this.preview ? 'preview' : ''}\">\n ${this._isLoading ? html`\n <div class=\"loading-placeholder\">\n <div class=\"loading-spinner\"></div>\n <span>编辑器加载中...</span>\n </div>\n ` : ''}\n <input\n type=\"file\"\n accept=\"image/*\"\n class=\"image-input\"\n @change=${this._handleImageUpload}\n />\n\n <!-- Bubble Menu (悬浮操作栏) -->\n ${!this.preview ? html`\n <div class=\"bubble-menu\">\n <!-- 文本格式 -->\n <button\n class=\"bubble-btn ${editor?.isActive('bold') ? 'is-active' : ''}\"\n @click=${this._toggleBold}\n title=\"加粗\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('italic') ? 'is-active' : ''}\"\n @click=${this._toggleItalic}\n title=\"斜体\"\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('underline') ? 'is-active' : ''}\"\n @click=${this._toggleUnderline}\n title=\"下划线\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\"/><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"/></svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('strike') ? 'is-active' : ''}\"\n @click=${this._toggleStrike}\n title=\"删除线\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 5.3 3.9h.2m8.2 3.2c.3.4.4.8.4 1.3 0 2.9-2.7 3.6-6.2 3.6-2.3 0-4.4-.3-6.2-.9M4 12h16\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 文本类型下拉 -->\n <div class=\"bubble-dropdown\">\n <button class=\"bubble-dropdown-btn\">\n ${this._getTextLabel()}\n <svg viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <button\n class=\"bubble-dropdown-item ${!editor?.isActive('heading') ? 'is-active' : ''}\"\n @click=${this._setParagraph}\n >\n 正文\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 1 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(1)}\n >\n 标题 1\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 2 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(2)}\n >\n 标题 2\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive('heading', { level: 3 }) ? 'is-active' : ''}\"\n @click=${() => this._setHeading(3)}\n >\n 标题 3\n </button>\n </div>\n </div>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 对齐下拉 -->\n <div class=\"bubble-dropdown\">\n <button class=\"bubble-dropdown-btn\">\n ${this._getAlignLabel()}\n <svg viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'left' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('left')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\"/></svg>\n 左对齐\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'center' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('center')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>\n 居中\n </button>\n <button\n class=\"bubble-dropdown-item ${editor?.isActive({ textAlign: 'right' }) ? 'is-active' : ''}\"\n @click=${() => this._setTextAlign('right')}\n >\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\"/></svg>\n 右对齐\n </button>\n </div>\n </div>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 行内代码 -->\n <button\n class=\"bubble-btn ${editor?.isActive('code') ? 'is-active' : ''}\"\n @click=${this._toggleCode}\n title=\"行内代码\"\n >\n <svg viewBox=\"0 0 24 24\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>\n </button>\n\n <!-- 链接 -->\n <button\n class=\"bubble-btn ${editor?.isActive('link') ? 'is-active' : ''}\"\n @click=${this._setLink}\n title=\"链接\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>\n </button>\n\n <!-- 图片 -->\n <button\n class=\"bubble-btn\"\n @click=${this._triggerImageUpload}\n title=\"图片\"\n >\n <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 列表 -->\n <button\n class=\"bubble-btn ${editor?.isActive('bulletList') ? 'is-active' : ''}\"\n @click=${this._toggleBulletList}\n title=\"无序列表\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\"/>\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\"/>\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\"/>\n <circle cx=\"4\" cy=\"6\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"12\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"18\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/>\n </svg>\n </button>\n <button\n class=\"bubble-btn ${editor?.isActive('orderedList') ? 'is-active' : ''}\"\n @click=${this._toggleOrderedList}\n title=\"有序列表\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/>\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/>\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/>\n <path d=\"M4 6h1v4\"/>\n <path d=\"M4 10h2\"/>\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1.5\"/>\n </svg>\n </button>\n\n <!-- 引用 -->\n <button\n class=\"bubble-btn ${editor?.isActive('blockquote') ? 'is-active' : ''}\"\n @click=${this._toggleBlockquote}\n title=\"引用\"\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\"/><path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\"/></svg>\n </button>\n\n <div class=\"bubble-divider\"></div>\n\n <!-- 表格下拉 -->\n <div\n class=\"bubble-dropdown ${this._tableDropdownOpen ? 'is-open' : ''}\"\n @mouseenter=${() => {\n this._tableDropdownOpen = true\n this._hoverRow = 0\n this._hoverCol = 0\n }}\n @mouseleave=${() => this._tableDropdownOpen = false}\n >\n <button class=\"bubble-dropdown-btn\" title=\"表格\">\n <svg viewBox=\"0 0 24 24\" style=\"width:18px;height:18px;stroke:currentColor;stroke-width:2;fill:none;\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/></svg>\n </button>\n <div class=\"bubble-dropdown-menu\">\n <div class=\"table-grid-preview\">\n ${this._renderTableGrid()}\n </div>\n <div class=\"table-size-hint\">\n <span>${this._hoverRow > 0 ? `${this._hoverRow} × ${this._hoverCol}` : `${this._tableRows} × ${this._tableCols}`}</span>\n </div>\n </div>\n </div>\n </div>\n ` : ''}\n\n <div class=\"editor-content\"></div>\n\n <!-- Table Cell Toolbar -->\n ${this._tableCellToolbar.visible && editor?.isActive('table')\n ? html`\n <div\n class=\"table-cell-toolbar\"\n style=\"left: ${this._tableCellToolbar.x}px; top: ${this._tableCellToolbar.y}px;\"\n @mousedown=${(e: Event) => e.preventDefault()}\n >\n ${this._tableCellToolbar.cellRow === 0 ? html`\n <button class=\"table-cell-toolbar-btn\" title=\"上方添加行\" @click=${this._addTableRowAbove}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"7\"/><line x1=\"10\" y1=\"5\" x2=\"14\" y2=\"5\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn\" title=\"下方添加行\" @click=${this._addTableRowBelow}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"17\"/><line x1=\"10\" y1=\"19\" x2=\"14\" y2=\"19\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除行\" @click=${this._deleteTableRow}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"1\"/><line x1=\"9\" y1=\"10\" x2=\"9\" y2=\"14\"/><line x1=\"15\" y1=\"10\" x2=\"15\" y2=\"14\"/></svg>\n </button>\n ` : ''}\n ${this._tableCellToolbar.cellCol === 0 ? html`\n ${this._tableCellToolbar.cellRow !== 0 ? html`<div style=\"width:1px;height:20px;background:#e3e3e3;margin:0 4px;\"></div>` : ''}\n <button class=\"table-cell-toolbar-btn\" title=\"左侧添加列\" @click=${this._addTableColumnLeft}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"3\" y1=\"12\" x2=\"7\" y2=\"12\"/><line x1=\"5\" y1=\"10\" x2=\"5\" y2=\"14\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn\" title=\"右侧添加列\" @click=${this._addTableColumnRight}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"21\" y1=\"12\" x2=\"17\" y2=\"12\"/><line x1=\"19\" y1=\"10\" x2=\"19\" y2=\"14\"/></svg>\n </button>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除列\" @click=${this._deleteTableColumn}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\"/><line x1=\"10\" y1=\"9\" x2=\"14\" y2=\"9\"/><line x1=\"10\" y1=\"15\" x2=\"14\" y2=\"15\"/></svg>\n </button>\n ` : ''}\n ${this._tableCellToolbar.cellRow === 0 && this._tableCellToolbar.cellCol === 0 ? html`\n <div style=\"width:1px;height:20px;background:#e3e3e3;margin:0 4px;\"></div>\n <button class=\"table-cell-toolbar-btn danger\" title=\"删除表格\" @click=${this._deleteTable}>\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n </button>\n ` : ''}\n </div>\n `\n : ''}\n\n <!-- Image Toolbar -->\n ${this._imageToolbar.visible\n ? html`\n <div\n class=\"image-toolbar\"\n style=\"left: ${this._imageToolbar.x}px; top: ${this._imageToolbar.y}px;\"\n @mousedown=${(e: Event) => e.preventDefault()}\n >\n <button class=\"image-toolbar-btn danger\" title=\"删除图片\" @click=${this._deleteImage}>\n <svg viewBox=\"0 0 24 24\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n </button>\n <button class=\"image-toolbar-btn\" title=\"添加图片\" @click=${this._insertImageAfter}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>\n </button>\n <div class=\"image-toolbar-divider\"></div>\n <div style=\"position: relative;\">\n <button class=\"image-toolbar-btn\" title=\"更多\" @click=${this._toggleImageMoreMenu}>\n <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/></svg>\n </button>\n ${this._imageMoreMenuVisible\n ? html`\n <div class=\"image-more-menu\">\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignLeft}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\"/></svg>\n 左对齐\n </button>\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignCenter}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>\n 居中\n </button>\n <button class=\"image-more-menu-item\" @click=${this._setImageAlignRight}>\n <svg viewBox=\"0 0 24 24\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\"/></svg>\n 右对齐\n </button>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n : ''}\n </div>\n `\n }\n\n private _renderTableGrid() {\n const cells = []\n for (let i = 0; i < 100; i++) {\n const row = Math.floor(i / 10) + 1\n const col = (i % 10) + 1\n const isHighlight = this._hoverRow > 0 && row <= this._hoverRow && col <= this._hoverCol\n cells.push(html`\n <div\n class=\"table-cell ${isHighlight ? 'selected' : ''}\"\n @click=${() => {\n this._insertTableByClick(row, col)\n this._tableDropdownOpen = false\n }}\n @mouseenter=${() => {\n this._hoverRow = row\n this._hoverCol = col\n }}\n @mouseleave=${() => {\n this._hoverRow = 0\n this._hoverCol = 0\n }}\n ></div>\n `)\n }\n return cells\n }\n}\n\nexport function register() {}\n"],"names":["QxsBlocksuiteEditor","LitElement","constructor","super","arguments","this","content","readonly","preview","uploadImage","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","_editor","_pendingContent","_tableRows","_tableCols","_hoverRow","_hoverCol","_tableDropdownOpen","_isLoading","_tableCellToolbar","x","y","visible","cellRow","cellCol","_tableEdgeHover","type","index","position","_imageToolbar","_imageMoreMenuVisible","_hasSlashCommand","_tableEdgeDetectionSetup","_initEditor","el","shadowRoot","querySelector","requestAnimationFrame","extensions","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","Heading","configure","levels","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","History","Image","inline","allowBase64","Link","openOnClick","HTMLAttributes","rel","TextAlign","types","Table","resizable","TableRow","TableCell","TableHeader","Placeholder","placeholder","Editor","element","editable","on","requestUpdate","_updateBubbleMenuPosition","isActive","_showTableCellToolbar","_hideTableCellToolbar","editor","selection","state","$from","node","depth","name","coords","view","coordsAtPos","start","wrapperRect","getBoundingClientRect","left","right","top","_showImageToolbar","_hideImageToolbar","_checkSlashCommand","_setupTableEdgeDetection","editorContent","addEventListener","_handleTableEdgeMouseMove","tagName","pos","posAtDOM","chain","focus","setNodeSelection","run","table","closest","tableRect","editorWrapper","relativeX","clientX","relativeY","clientY","edgeThreshold","rowHeight","height","rows","length","i","rowTop","rowBottom","colWidth","width","cells","colLeft","colRight","textBefore","doc","textBetween","Math","max","from","endsWith","firstUpdated","updated","changed","has","commands","setContent","setEditable","disconnectedCallback","destroy","getContent","getHTML","_applyFormat","command","deleteRange","to","_toggleBold","toggleBold","_toggleItalic","toggleItalic","_toggleUnderline","toggleUnderline","_toggleStrike","toggleStrike","_toggleCode","toggleCode","_setHeading","level","toggleHeading","_setParagraph","setParagraph","_toggleBulletList","toggleBulletList","_toggleOrderedList","toggleOrderedList","_toggleBlockquote","toggleBlockquote","_setTextAlign","align","setTextAlign","_setLink","url","window","prompt","setLink","href","_unsetLink","unsetLink","_insertTable","cols","insertTable","withHeaderRow","_handleImageUpload","input","files","src","setImage","err","value","_triggerImageUpload","click","_insertTableByClick","_insertHorizontalRule","setHorizontalRule","_getTableCellRow","_getTableCellCol","bottom","$pos","d","_addTableRowAbove","addRowBefore","_addTableRowBelow","addRowAfter","_addTableColumnLeft","addColumnBefore","_addTableColumnRight","addColumnAfter","_deleteTableRow","deleteRow","_deleteTableColumn","deleteColumn","_deleteTable","deleteTable","_toggleImageMoreMenu","_deleteImage","deleteNode","_insertImageAfter","_setImageAlignLeft","img","style","display","margin","_setImageAlignCenter","_setImageAlignRight","_updateImageToolbarPosition","_getTextLabel","_getAlignLabel","textAlign","bubbleMenu","proseMirror","isInTable","empty","$to","hasTableInSelection","fromAncestor","toAncestor","opacity","visibility","menuRect","render","html","_renderTableGrid","preventDefault","row","floor","col","isHighlight","push","styles","css","__decorateClass","property","String","attribute","prototype","Boolean","Object","safeCustomElement"],"mappings":"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"}