@qxs-bns/components-wc 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/es/editor/blocksuite-editor.mjs +27 -18
  2. package/es/editor/blocksuite-editor.mjs.map +1 -1
  3. package/es/index.mjs +1 -1
  4. package/es/node_modules/.pnpm/@tiptap_extension-placeholder@3.19.0_@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.mjs +2 -0
  5. package/es/node_modules/.pnpm/@tiptap_extension-placeholder@3.19.0_@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.mjs.map +1 -0
  6. package/es/node_modules/.pnpm/@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5/node_modules/@tiptap/extensions/dist/index.mjs +2 -0
  7. package/es/node_modules/.pnpm/@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5/node_modules/@tiptap/extensions/dist/index.mjs.map +1 -0
  8. package/es/subject/action.mjs +3 -3
  9. package/es/subject/action.mjs.map +1 -1
  10. package/es/subject/blank-fill.mjs +5 -5
  11. package/es/subject/blank-fill.mjs.map +1 -1
  12. package/es/subject/layout.mjs +5 -5
  13. package/es/subject/layout.mjs.map +1 -1
  14. package/es/subject/list.mjs +14 -51
  15. package/es/subject/list.mjs.map +1 -1
  16. package/es/subject/scale.mjs +5 -5
  17. package/es/subject/scale.mjs.map +1 -1
  18. package/es/subject/single.mjs +6 -6
  19. package/es/subject/single.mjs.map +1 -1
  20. package/es/subject/text-fill.mjs +4 -4
  21. package/es/subject/text-fill.mjs.map +1 -1
  22. package/es/subject/types.mjs +2 -0
  23. package/es/subject/types.mjs.map +1 -0
  24. package/lib/editor/blocksuite-editor.cjs +17 -8
  25. package/lib/editor/blocksuite-editor.cjs.map +1 -1
  26. package/lib/index.cjs +1 -1
  27. package/lib/node_modules/.pnpm/@tiptap_extension-placeholder@3.19.0_@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.cjs +2 -0
  28. package/lib/node_modules/.pnpm/@tiptap_extension-placeholder@3.19.0_@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.cjs.map +1 -0
  29. package/lib/node_modules/.pnpm/@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5/node_modules/@tiptap/extensions/dist/index.cjs +2 -0
  30. package/lib/node_modules/.pnpm/@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5/node_modules/@tiptap/extensions/dist/index.cjs.map +1 -0
  31. package/lib/subject/action.cjs +1 -1
  32. package/lib/subject/action.cjs.map +1 -1
  33. package/lib/subject/blank-fill.cjs +4 -4
  34. package/lib/subject/blank-fill.cjs.map +1 -1
  35. package/lib/subject/layout.cjs +3 -3
  36. package/lib/subject/layout.cjs.map +1 -1
  37. package/lib/subject/list.cjs +13 -50
  38. package/lib/subject/list.cjs.map +1 -1
  39. package/lib/subject/scale.cjs +4 -4
  40. package/lib/subject/scale.cjs.map +1 -1
  41. package/lib/subject/single.cjs +5 -5
  42. package/lib/subject/single.cjs.map +1 -1
  43. package/lib/subject/text-fill.cjs +3 -3
  44. package/lib/subject/text-fill.cjs.map +1 -1
  45. package/lib/subject/types.cjs +2 -0
  46. package/lib/subject/types.cjs.map +1 -0
  47. package/package.json +6 -6
@@ -1,11 +1,11 @@
1
- "use strict";var e=require("@tiptap/core"),t=require("@tiptap/extension-blockquote"),i=require("@tiptap/extension-bold"),o=require("@tiptap/extension-bullet-list"),r=require("@tiptap/extension-code"),s=require("@tiptap/extension-document"),l=require("@tiptap/extension-heading"),n=require("@tiptap/extension-history"),a=require("@tiptap/extension-horizontal-rule"),d=require("@tiptap/extension-image"),c=require("@tiptap/extension-italic"),h=require("@tiptap/extension-link"),p=require("@tiptap/extension-list-item"),b=require("@tiptap/extension-ordered-list"),u=require("@tiptap/extension-paragraph"),g=require("@tiptap/extension-strike"),x=require("@tiptap/extension-table"),m=require("@tiptap/extension-table-cell"),v=require("@tiptap/extension-table-header"),y=require("@tiptap/extension-table-row"),f=require("@tiptap/extension-text"),_=require("@tiptap/extension-text-align"),w=require("@tiptap/extension-underline"),k=require("../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.cjs"),C=require("lit"),M=require("../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.cjs"),T=require("../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.cjs"),A=require("../base/define.cjs"),$=Object.defineProperty,B=Object.getOwnPropertyDescriptor,q=(e,t,i,o)=>{for(var r,s=o>1?void 0:o?B(t,i):t,l=e.length-1;l>=0;l--)(r=e[l])&&(s=(o?r(t,i,s):r(s))||s);return o&&s&&$(t,i,s),s};exports.QxsBlocksuiteEditor=class extends C.LitElement{constructor(){super(...arguments),this.content="",this.modelValue="",this.useModelAttr="false",this.autoSyncAttr="true",this.readonlyAttr="false",this.previewAttr="false",this.isEditAttr="false",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._isInitializing=!1,this._tableEdgeDetectionSetup=!1}get useModel(){return"true"===this.useModelAttr}set useModel(e){this.useModelAttr=String(e)}get autoSync(){return"false"!==this.autoSyncAttr}set autoSync(e){this.autoSyncAttr=String(e)}get readonly(){return"false"!==this.readonlyAttr}set readonly(e){this.readonlyAttr=String(e)}get preview(){return"false"!==this.previewAttr}set preview(e){this.previewAttr=String(e)}get isEdit(){return"true"===this.isEditAttr}set isEdit(e){this.isEditAttr=String(e)}_initEditor(){if(this._editor)return;const C=this.shadowRoot?.querySelector(".editor-content");if(!C)return void requestAnimationFrame(()=>this._initEditor());for(this._isInitializing=!0;C.firstChild;)C.removeChild(C.firstChild);this._isLoading=!1;const M=this.useModel||this.hasAttribute("use-model"),T=this.getAttribute("model-value")??this.modelValue,A=this.content,$=M?(this._pendingContent??T)||"<p></p>":(this._pendingContent??A)||"<p></p>",B=[s,u,f,i,c,w,g,r,l.configure({levels:[1,2,3]}),o,b,p,t,a,n,d.configure({inline:!1,allowBase64:!0}),h.configure({openOnClick:!1,HTMLAttributes:{rel:"noopener noreferrer"}}),_.configure({types:["heading","paragraph"]}),x.Table.configure({resizable:!0}),y.TableRow,m.TableCell,v.TableHeader,k.default.configure({placeholder:"输入 / 唤出快捷命令"})];this._editor=new e.Editor({element:C,extensions:B,editable:!this.readonly,content:$}),this._pendingContent=null,requestAnimationFrame(()=>{this._isInitializing=!1,this._emitContentChange()}),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(),this._emitContentChange()}),this._editor.on("update",()=>{this._emitContentChange()})}_emitContentChange(){if(!this._editor)return;const e=this._editor.getHTML();this._isInitializing||(this.dispatchEvent(new CustomEvent("content-change",{detail:e,bubbles:!0,composed:!0})),this.autoSync&&(this.modelValue=e))}_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(),s=e.clientX-r.left,l=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,l=t+a;if(e.clientY>=t-n&&e.clientY<=t+n)return this._tableEdgeHover={type:"row",index:o,position:{x:s,y:t-r.top}},void this.requestUpdate();if(e.clientY>=l-n&&e.clientY<=l+n)return this._tableEdgeHover={type:"row",index:o+1,position:{x:s,y:l-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,s=t+d;if(e.clientX>=t-n&&e.clientX<=t+n)return this._tableEdgeHover={type:"col",index:o,position:{x:t-r.left,y:l}},void this.requestUpdate();if(e.clientX>=s-n&&e.clientX<=s+n)return this._tableEdgeHover={type:"col",index:o+1,position:{x:s-r.left,y:l}},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){if(e.has("content")||e.has("modelValue")&&this.useModel){const e=this.useModel?this.modelValue:this.content;e!==this._editor.getHTML()&&this._editor.commands.setContent(e||"<p></p>")}e.has("readonly")&&this._editor.setEditable(!this.readonly)}else e.has("content")&&(this._pendingContent=this.content),e.has("modelValue")&&this.useModel&&(this._pendingContent=this.modelValue)}disconnectedCallback(){super.disconnectedCallback(),this._editor?.destroy(),this._editor=null}getContent(){return this._editor?.getHTML()??""}forceUpdate(){if(this.requestUpdate(),this._editor){const e=this.useModel?this.modelValue:this.content;e!==this._editor.getHTML()&&this._editor.commands.setContent(e||"<p></p>")}}forceSync(){this.forceUpdate()}_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(),s=this._getTableCellRow(),l=this._getTableCellCol();(0===s||0===l)&&(this._tableCellToolbar={x:i.left-r.left,y:i.bottom-r.top+8,visible:!0,cellRow:s,cellCol:l})}_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:s}=o?.state??{selection:null};if(r&&s&&!s.empty&&o){const{from:t,to:i}=s,r=o.state.doc.resolve(t),l=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=l.node(l.depth);if("table"!==a.type.name&&"table"!==d.type.name||(n=!0),n)return e.style.opacity="0",void(e.style.visibility="hidden")}if(s&&!s.empty);else if(!s||s.empty&&!this._hasSlashCommand)return e.style.opacity="0",void(e.style.visibility="hidden");const l=i.getBoundingClientRect(),n=e.getBoundingClientRect(),{from:a}=s,d=this._editor?.view.coordsAtPos(a);if(!d)return;let c=d.left-l.left,h=d.top-l.top-40;c+n.width>l.width&&(c=l.width-n.width-8),c<0&&(c=8),h<0&&(h=d.bottom-l.top+8),e.style.left=`${c}px`,e.style.top=`${h}px`,e.style.opacity="1",e.style.visibility="visible"})}render(){const e=this._editor;return C.html`
2
- <div class="editor-wrapper ${this._isLoading?"loading":""} ${this.preview?"preview":""}">
3
- ${this._isLoading?C.html`
1
+ "use strict";var e=require("@tiptap/core"),t=require("@tiptap/extension-blockquote"),i=require("@tiptap/extension-bold"),o=require("@tiptap/extension-bullet-list"),r=require("@tiptap/extension-code"),s=require("@tiptap/extension-document"),l=require("@tiptap/extension-heading"),n=require("@tiptap/extension-history"),a=require("@tiptap/extension-horizontal-rule"),d=require("@tiptap/extension-image"),c=require("@tiptap/extension-italic"),h=require("@tiptap/extension-link"),p=require("@tiptap/extension-list-item"),b=require("@tiptap/extension-ordered-list"),u=require("@tiptap/extension-paragraph"),g=require("@tiptap/extension-strike"),x=require("@tiptap/extension-table"),m=require("@tiptap/extension-table-cell"),v=require("@tiptap/extension-table-header"),y=require("@tiptap/extension-table-row"),f=require("@tiptap/extension-text"),_=require("@tiptap/extension-text-align"),w=require("@tiptap/extension-underline"),k=require("@tiptap/extension-placeholder"),C=require("lit"),M=require("../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.cjs"),T=require("../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.cjs"),A=require("../base/define.cjs"),$=Object.defineProperty,B=Object.getOwnPropertyDescriptor,q=(e,t,i,o)=>{for(var r,s=o>1?void 0:o?B(t,i):t,l=e.length-1;l>=0;l--)(r=e[l])&&(s=(o?r(t,i,s):r(s))||s);return o&&s&&$(t,i,s),s};exports.QxsBlocksuiteEditor=class extends C.LitElement{constructor(){super(...arguments),this.content="",this.modelValue="",this.useModelAttr="false",this.autoSyncAttr="true",this.readonlyAttr="false",this.previewAttr="false",this.isEditAttr="false",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._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}get useModel(){return"true"===this.useModelAttr}set useModel(e){this.useModelAttr=String(e)}get autoSync(){return"false"!==this.autoSyncAttr}set autoSync(e){this.autoSyncAttr=String(e)}get readonly(){return"false"!==this.readonlyAttr}set readonly(e){this.readonlyAttr=String(e)}get preview(){return"false"!==this.previewAttr}set preview(e){this.previewAttr=String(e)}get isEdit(){return"true"===this.isEditAttr}set isEdit(e){this.isEditAttr=String(e)}_initEditor(){if(this._editor)return;const C=this.shadowRoot?.querySelector(".editor-content");if(!C)return void requestAnimationFrame(()=>this._initEditor());for(;C.firstChild;)C.removeChild(C.firstChild);const M=this.useModel||this.hasAttribute("use-model"),T=this.getAttribute("model-value")??this.modelValue,A=this.content,$=M?(this._pendingContent??T)||"<p></p>":(this._pendingContent??A)||"<p></p>",B=[s,u,f,i,c,w,g,r,l.configure({levels:[1,2,3]}),o,b,p,t,a,n,d.configure({inline:!1,allowBase64:!0}),h.configure({openOnClick:!1,HTMLAttributes:{rel:"noopener noreferrer"}}),_.configure({types:["heading","paragraph"]}),x.Table.configure({resizable:!0}),y.TableRow,m.TableCell,v.TableHeader,k.configure({placeholder:"输入 / 唤出快捷命令"}),e.Extension.create({name:"clearMarksOnEnter",addKeyboardShortcuts(){return{Enter:()=>(this.editor.chain().focus().unsetAllMarks().clearNodes().run(),!1)}}})];this._editor=new e.Editor({element:C,extensions:B,editable:!this.readonly,content:$}),this._pendingContent=null,this._emitContentChange(),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(),this._emitContentChange()}),this._editor.on("update",()=>{this._emitContentChange()})}_emitContentChange(){if(!this._editor)return;const e=this._editor.getHTML();this.dispatchEvent(new CustomEvent("content-change",{detail:e,bubbles:!0,composed:!0})),this.autoSync&&(this.modelValue=e)}_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(),s=e.clientX-r.left,l=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,l=t+a;if(e.clientY>=t-n&&e.clientY<=t+n)return this._tableEdgeHover={type:"row",index:o,position:{x:s,y:t-r.top}},void this.requestUpdate();if(e.clientY>=l-n&&e.clientY<=l+n)return this._tableEdgeHover={type:"row",index:o+1,position:{x:s,y:l-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,s=t+d;if(e.clientX>=t-n&&e.clientX<=t+n)return this._tableEdgeHover={type:"col",index:o,position:{x:t-r.left,y:l}},void this.requestUpdate();if(e.clientX>=s-n&&e.clientX<=s+n)return this._tableEdgeHover={type:"col",index:o+1,position:{x:s-r.left,y:l}},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){if(e.has("content")||e.has("modelValue")&&this.useModel){const e=this.useModel?this.modelValue:this.content;e!==this._editor.getHTML()&&this._editor.commands.setContent(e||"<p></p>")}e.has("readonly")&&this._editor.setEditable(!this.readonly)}else e.has("content")&&(this._pendingContent=this.content),e.has("modelValue")&&this.useModel&&(this._pendingContent=this.modelValue)}disconnectedCallback(){super.disconnectedCallback(),this._editor?.destroy(),this._editor=null}getContent(){return this._editor?.getHTML()??""}forceUpdate(){if(this.requestUpdate(),this._editor){const e=this.useModel?this.modelValue:this.content;e!==this._editor.getHTML()&&this._editor.commands.setContent(e||"<p></p>")}}forceSync(){this.forceUpdate()}_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(),s=this._getTableCellRow(),l=this._getTableCellCol();(0===s||0===l)&&(this._tableCellToolbar={x:i.left-r.left,y:i.bottom-r.top+8,visible:!0,cellRow:s,cellCol:l})}_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:s}=o?.state??{selection:null};if(r&&s&&!s.empty&&o){const{from:t,to:i}=s,r=o.state.doc.resolve(t),l=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=l.node(l.depth);if("table"!==a.type.name&&"table"!==d.type.name||(n=!0),n)return e.style.opacity="0",void(e.style.visibility="hidden")}if(s&&!s.empty);else if(!s||s.empty&&!this._hasSlashCommand)return e.style.opacity="0",void(e.style.visibility="hidden");const l=i.getBoundingClientRect(),n=e.getBoundingClientRect(),{from:a}=s,d=this._editor?.view.coordsAtPos(a);if(!d)return;let c=d.left-l.left,h=d.top-l.top-40;c+n.width>l.width&&(c=l.width-n.width-8),c<0&&(c=8),h<0&&(h=d.bottom-l.top+8),e.style.left=`${c}px`,e.style.top=`${h}px`,e.style.opacity="1",e.style.visibility="visible"})}render(){const e=this._editor;return C.html`
2
+ <div class="editor-wrapper ${e?"":"loading"} ${this.preview?"preview":""}">
3
+ ${e?"":C.html`
4
4
  <div class="loading-placeholder">
5
5
  <div class="loading-spinner"></div>
6
6
  <span>编辑器加载中...</span>
7
7
  </div>
8
- `:""}
8
+ `}
9
9
  <input
10
10
  type="file"
11
11
  accept="image/*"
@@ -306,11 +306,11 @@
306
306
  background: #fff;
307
307
  overflow: visible;
308
308
  position: relative;
309
+ min-height: 80px;
309
310
  }
310
311
 
311
312
  .editor-wrapper:focus-within {
312
313
  border-color: var(--qxs-color-primary, #3D61E3);
313
- box-shadow: 0 0 0 2px rgba(61, 97, 227, 0.1);
314
314
  }
315
315
 
316
316
  .editor-wrapper.preview {
@@ -341,12 +341,12 @@
341
341
  color: #c0c0c0;
342
342
  pointer-events: none;
343
343
  display: block;
344
- margin-top: 80px;
344
+ padding-top: 28px;
345
345
  text-align: center;
346
346
  }
347
347
 
348
348
  .editor-content .ProseMirror:empty {
349
- min-height: 200px;
349
+ min-height: 80px;
350
350
  }
351
351
 
352
352
  .ProseMirror p.is-editor-empty:first-child::before {
@@ -357,6 +357,15 @@
357
357
  height: 0;
358
358
  }
359
359
 
360
+ .ProseMirror p.is-empty:only-child::before,
361
+ .ProseMirror p.is-empty:only-child > br:first-child + *::before {
362
+ content: attr(data-placeholder);
363
+ color: #c0c0c0;
364
+ pointer-events: none;
365
+ float: left;
366
+ height: 0;
367
+ }
368
+
360
369
  .editor-wrapper.loading {
361
370
  display: flex;
362
371
  align-items: center;
@@ -933,5 +942,5 @@
933
942
  outline: 2px solid var(--qxs-color-primary, #3D61E3);
934
943
  outline-offset: 2px;
935
944
  }
936
- `,q([M.property({type:String,attribute:"content"})],exports.QxsBlocksuiteEditor.prototype,"content",2),q([M.property({type:String,attribute:"model-value"})],exports.QxsBlocksuiteEditor.prototype,"modelValue",2),q([M.property({type:String,attribute:"use-model"})],exports.QxsBlocksuiteEditor.prototype,"useModelAttr",2),q([M.property({type:String,attribute:"auto-sync"})],exports.QxsBlocksuiteEditor.prototype,"autoSyncAttr",2),q([M.property({type:String,attribute:"readonly"})],exports.QxsBlocksuiteEditor.prototype,"readonlyAttr",2),q([M.property({type:String,attribute:"preview"})],exports.QxsBlocksuiteEditor.prototype,"previewAttr",2),q([M.property({type:String,attribute:"is-edit"})],exports.QxsBlocksuiteEditor.prototype,"isEditAttr",2),q([M.property({type:Object,attribute:"upload-image"})],exports.QxsBlocksuiteEditor.prototype,"uploadImage",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_pendingContent",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hoverRow",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hoverCol",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableDropdownOpen",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_isLoading",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableCellToolbar",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableEdgeHover",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_imageToolbar",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_imageMoreMenuVisible",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hasSlashCommand",2),exports.QxsBlocksuiteEditor=q([A.safeCustomElement("qxs-blocksuite-editor")],exports.QxsBlocksuiteEditor);
945
+ `,q([M.property({type:String,attribute:"content"})],exports.QxsBlocksuiteEditor.prototype,"content",2),q([M.property({type:String,attribute:"model-value"})],exports.QxsBlocksuiteEditor.prototype,"modelValue",2),q([M.property({type:String,attribute:"use-model"})],exports.QxsBlocksuiteEditor.prototype,"useModelAttr",2),q([M.property({type:String,attribute:"auto-sync"})],exports.QxsBlocksuiteEditor.prototype,"autoSyncAttr",2),q([M.property({type:String,attribute:"readonly"})],exports.QxsBlocksuiteEditor.prototype,"readonlyAttr",2),q([M.property({type:String,attribute:"preview"})],exports.QxsBlocksuiteEditor.prototype,"previewAttr",2),q([M.property({type:String,attribute:"is-edit"})],exports.QxsBlocksuiteEditor.prototype,"isEditAttr",2),q([M.property({type:Object,attribute:"upload-image"})],exports.QxsBlocksuiteEditor.prototype,"uploadImage",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_pendingContent",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hoverRow",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hoverCol",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableDropdownOpen",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableCellToolbar",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_tableEdgeHover",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_imageToolbar",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_imageMoreMenuVisible",2),q([T.state()],exports.QxsBlocksuiteEditor.prototype,"_hasSlashCommand",2),exports.QxsBlocksuiteEditor=q([A.safeCustomElement("qxs-blocksuite-editor")],exports.QxsBlocksuiteEditor);
937
946
  //# sourceMappingURL=blocksuite-editor.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocksuite-editor.cjs","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: #fff;\n overflow: visible;\n position: relative;\n }\n\n .editor-wrapper:focus-within {\n border-color: var(--qxs-color-primary, #3D61E3);\n box-shadow: 0 0 0 2px rgba(61, 97, 227, 0.1);\n }\n\n .editor-wrapper.preview {\n border: none;\n border-radius: 0;\n background: transparent;\n }\n\n .editor-wrapper.is-edit {\n border: 1px solid #dcdfe6;\n border-radius: 3px;\n background: #fff;\n }\n\n .editor-wrapper.preview .editor-content {\n padding: 8px 12px;\n min-height: unset;\n }\n\n .editor-content {\n padding: 12px 16px;\n min-height: 80px;\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\n text-decoration: underline;\n cursor: pointer;\n }\n\n .ProseMirror img.ProseMirror-selectednode {\n outline: 2px solid var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\n color: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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 var(--qxs-color-primary, #3D61E3);\n outline-offset: 2px;\n }\n `\n\n @property({ type: String, attribute: 'content' })\n content = ''\n\n @property({ type: String, attribute: 'model-value' })\n modelValue = ''\n\n @property({ type: String, attribute: 'use-model' })\n useModelAttr = 'false'\n\n @property({ type: String, attribute: 'auto-sync' })\n autoSyncAttr = 'true'\n\n @property({ type: String, attribute: 'readonly' })\n readonlyAttr = 'false'\n\n @property({ type: String, attribute: 'preview' })\n previewAttr = 'false'\n\n @property({ type: String, attribute: 'is-edit' })\n isEditAttr = 'false'\n\n get useModel(): boolean {\n return this.useModelAttr === 'true'\n }\n\n set useModel(value: boolean) {\n this.useModelAttr = String(value)\n }\n\n get autoSync(): boolean {\n return this.autoSyncAttr !== 'false'\n }\n\n set autoSync(value: boolean) {\n this.autoSyncAttr = String(value)\n }\n\n get readonly(): boolean {\n return this.readonlyAttr !== 'false'\n }\n\n set readonly(value: boolean) {\n this.readonlyAttr = String(value)\n }\n\n get preview(): boolean {\n return this.previewAttr !== 'false'\n }\n\n set preview(value: boolean) {\n this.previewAttr = String(value)\n }\n\n get isEdit(): boolean {\n return this.isEditAttr === 'true'\n }\n\n set isEdit(value: boolean) {\n this.isEditAttr = String(value)\n }\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 private _isInitializing = 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 console.log('[BlocksuiteEditor] _initEditor - Before clear, childNodes:', el.childNodes.length)\n console.log('[BlocksuiteEditor] _initEditor - Before clear, innerHTML:', el.innerHTML.substring(0, 200))\n\n // 设置初始化标志,防止触发循环更新\n this._isInitializing = true\n\n // 清空容器,确保 Tiptap 创建时容器是空的\n // 使用 removeChild 清空所有子节点,比 innerHTML 更彻底\n while (el.firstChild) {\n el.removeChild(el.firstChild)\n }\n\n console.log('[BlocksuiteEditor] _initEditor - After clear, childNodes:', el.childNodes.length)\n console.log('[BlocksuiteEditor] _initEditor - After clear, innerHTML:', el.innerHTML)\n\n this._isLoading = false\n\n const useModel = this.useModel || this.hasAttribute('use-model')\n const modelValue = this.getAttribute('model-value') ?? this.modelValue\n const contentValue = this.content\n\n const initialContent = useModel\n ? (this._pendingContent ?? modelValue) || '<p></p>'\n : (this._pendingContent ?? contentValue) || '<p></p>'\n\n console.log('[BlocksuiteEditor] _initEditor - initialContent:', initialContent.substring(0, 100))\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 editable: !this.readonly,\n content: initialContent,\n })\n\n console.log('[BlocksuiteEditor] After Editor created, childNodes:', el.childNodes.length)\n console.log('[BlocksuiteEditor] After Editor created, innerHTML:', el.innerHTML.substring(0, 200))\n\n this._pendingContent = null\n\n // 延迟重置初始化标志,确保编辑器完全初始化\n requestAnimationFrame(() => {\n this._isInitializing = false\n // 初始化完成后手动触发一次内容同步\n this._emitContentChange()\n })\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 this._emitContentChange()\n })\n\n this._editor.on('update', () => {\n this._emitContentChange()\n })\n }\n\n private _tableEdgeDetectionSetup = false\n\n private _emitContentChange() {\n if (!this._editor) return\n const html = this._editor.getHTML()\n\n // 初始化期间不触发事件,防止循环更新\n if (this._isInitializing) return\n\n this.dispatchEvent(new CustomEvent('content-change', {\n detail: html,\n bubbles: true,\n composed: true,\n }))\n if (this.autoSync) {\n this.modelValue = html\n }\n }\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') || (changed.has('modelValue') && this.useModel)) {\n const newContent = this.useModel ? this.modelValue : this.content\n if (newContent !== this._editor.getHTML()) {\n this._editor.commands.setContent(newContent || '<p></p>')\n }\n }\n if (changed.has('readonly')) {\n this._editor.setEditable(!this.readonly)\n }\n return\n }\n\n // 编辑器未初始化时,只保存待处理内容,不重复初始化\n if (changed.has('content')) {\n this._pendingContent = this.content\n }\n\n if (changed.has('modelValue') && this.useModel) {\n this._pendingContent = this.modelValue\n }\n\n // 只有在 firstUpdated 时才会初始化编辑器\n // 这里不再重复调用 _initEditor()\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 forceUpdate(): void {\n this.requestUpdate()\n if (this._editor) {\n const newContent = this.useModel ? this.modelValue : this.content\n if (newContent !== this._editor.getHTML()) {\n this._editor.commands.setContent(newContent || '<p></p>')\n }\n }\n }\n\n forceSync(): void {\n this.forceUpdate()\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","modelValue","useModelAttr","autoSyncAttr","readonlyAttr","previewAttr","isEditAttr","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","_isInitializing","_tableEdgeDetectionSetup","useModel","value","String","autoSync","readonly","preview","isEdit","_initEditor","el","shadowRoot","querySelector","requestAnimationFrame","firstChild","removeChild","hasAttribute","getAttribute","contentValue","initialContent","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","_emitContentChange","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","html","getHTML","dispatchEvent","CustomEvent","detail","bubbles","composed","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","newContent","commands","setContent","setEditable","disconnectedCallback","destroy","getContent","forceUpdate","forceSync","_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","_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","_renderTableGrid","preventDefault","row","floor","col","isHighlight","push","styles","css","__decorateClass","property","attribute","prototype","Object","safeCustomElement"],"mappings":"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"}
1
+ {"version":3,"file":"blocksuite-editor.cjs","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 { Extension } from '@tiptap/core'\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: #fff;\n overflow: visible;\n position: relative;\n min-height: 80px;\n }\n\n .editor-wrapper:focus-within {\n border-color: var(--qxs-color-primary, #3D61E3);\n }\n\n .editor-wrapper.preview {\n border: none;\n border-radius: 0;\n background: transparent;\n }\n\n .editor-wrapper.is-edit {\n border: 1px solid #dcdfe6;\n border-radius: 3px;\n background: #fff;\n }\n\n .editor-wrapper.preview .editor-content {\n padding: 8px 12px;\n min-height: unset;\n }\n\n .editor-content {\n padding: 12px 16px;\n min-height: 80px;\n cursor: text;\n }\n\n .editor-content:empty::before {\n content: '输入 / 唤出快捷命令';\n color: #c0c0c0;\n pointer-events: none;\n display: block;\n padding-top: 28px;\n text-align: center;\n }\n\n .editor-content .ProseMirror:empty {\n min-height: 80px;\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 .ProseMirror p.is-empty:only-child::before,\n .ProseMirror p.is-empty:only-child > br: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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\n text-decoration: underline;\n cursor: pointer;\n }\n\n .ProseMirror img.ProseMirror-selectednode {\n outline: 2px solid var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\n color: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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: var(--qxs-color-primary, #3D61E3);\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 var(--qxs-color-primary, #3D61E3);\n outline-offset: 2px;\n }\n `\n\n @property({ type: String, attribute: 'content' })\n content = ''\n\n @property({ type: String, attribute: 'model-value' })\n modelValue = ''\n\n @property({ type: String, attribute: 'use-model' })\n useModelAttr = 'false'\n\n @property({ type: String, attribute: 'auto-sync' })\n autoSyncAttr = 'true'\n\n @property({ type: String, attribute: 'readonly' })\n readonlyAttr = 'false'\n\n @property({ type: String, attribute: 'preview' })\n previewAttr = 'false'\n\n @property({ type: String, attribute: 'is-edit' })\n isEditAttr = 'false'\n\n get useModel(): boolean {\n return this.useModelAttr === 'true'\n }\n\n set useModel(value: boolean) {\n this.useModelAttr = String(value)\n }\n\n get autoSync(): boolean {\n return this.autoSyncAttr !== 'false'\n }\n\n set autoSync(value: boolean) {\n this.autoSyncAttr = String(value)\n }\n\n get readonly(): boolean {\n return this.readonlyAttr !== 'false'\n }\n\n set readonly(value: boolean) {\n this.readonlyAttr = String(value)\n }\n\n get preview(): boolean {\n return this.previewAttr !== 'false'\n }\n\n set preview(value: boolean) {\n this.previewAttr = String(value)\n }\n\n get isEdit(): boolean {\n return this.isEditAttr === 'true'\n }\n\n set isEdit(value: boolean) {\n this.isEditAttr = String(value)\n }\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 _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 while (el.firstChild) {\n el.removeChild(el.firstChild)\n }\n\n const useModel = this.useModel || this.hasAttribute('use-model')\n const modelValue = this.getAttribute('model-value') ?? this.modelValue\n const contentValue = this.content\n\n const initialContent = useModel\n ? (this._pendingContent ?? modelValue) || '<p></p>'\n : (this._pendingContent ?? contentValue) || '<p></p>'\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 Extension.create({\n name: 'clearMarksOnEnter',\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n this.editor.chain().focus().unsetAllMarks().clearNodes().run()\n return false\n },\n }\n },\n }),\n ]\n\n this._editor = new Editor({\n element: el,\n extensions,\n editable: !this.readonly,\n content: initialContent,\n })\n\n this._pendingContent = null\n this._emitContentChange()\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 this._emitContentChange()\n })\n\n this._editor.on('update', () => {\n this._emitContentChange()\n })\n }\n\n private _tableEdgeDetectionSetup = false\n\n private _emitContentChange() {\n if (!this._editor) return\n const html = this._editor.getHTML()\n\n this.dispatchEvent(new CustomEvent('content-change', {\n detail: html,\n bubbles: true,\n composed: true,\n }))\n if (this.autoSync) {\n this.modelValue = html\n }\n }\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') || (changed.has('modelValue') && this.useModel)) {\n const newContent = this.useModel ? this.modelValue : this.content\n if (newContent !== this._editor.getHTML()) {\n this._editor.commands.setContent(newContent || '<p></p>')\n }\n }\n if (changed.has('readonly')) {\n this._editor.setEditable(!this.readonly)\n }\n return\n }\n\n // 编辑器未初始化时,只保存待处理内容,不重复初始化\n if (changed.has('content')) {\n this._pendingContent = this.content\n }\n\n if (changed.has('modelValue') && this.useModel) {\n this._pendingContent = this.modelValue\n }\n\n // 只有在 firstUpdated 时才会初始化编辑器\n // 这里不再重复调用 _initEditor()\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 forceUpdate(): void {\n this.requestUpdate()\n if (this._editor) {\n const newContent = this.useModel ? this.modelValue : this.content\n if (newContent !== this._editor.getHTML()) {\n this._editor.commands.setContent(newContent || '<p></p>')\n }\n }\n }\n\n forceSync(): void {\n this.forceUpdate()\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 ${!editor ? 'loading' : ''} ${this.preview ? 'preview' : ''}\">\n ${!editor ? 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","modelValue","useModelAttr","autoSyncAttr","readonlyAttr","previewAttr","isEditAttr","uploadImage","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","_editor","_pendingContent","_tableRows","_tableCols","_hoverRow","_hoverCol","_tableDropdownOpen","_tableCellToolbar","x","y","visible","cellRow","cellCol","_tableEdgeHover","type","index","position","_imageToolbar","_imageMoreMenuVisible","_hasSlashCommand","_tableEdgeDetectionSetup","useModel","value","String","autoSync","readonly","preview","isEdit","_initEditor","el","shadowRoot","querySelector","requestAnimationFrame","firstChild","removeChild","hasAttribute","getAttribute","contentValue","initialContent","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","Extension","create","name","addKeyboardShortcuts","Enter","editor","chain","focus","unsetAllMarks","clearNodes","run","Editor","element","editable","_emitContentChange","on","requestUpdate","_updateBubbleMenuPosition","isActive","_showTableCellToolbar","_hideTableCellToolbar","selection","state","$from","node","depth","coords","view","coordsAtPos","start","wrapperRect","getBoundingClientRect","left","right","top","_showImageToolbar","_hideImageToolbar","_checkSlashCommand","_setupTableEdgeDetection","html","getHTML","dispatchEvent","CustomEvent","detail","bubbles","composed","editorContent","addEventListener","_handleTableEdgeMouseMove","tagName","pos","posAtDOM","setNodeSelection","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","newContent","commands","setContent","setEditable","disconnectedCallback","destroy","getContent","forceUpdate","forceSync","_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","_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","_renderTableGrid","preventDefault","row","floor","col","isHighlight","push","styles","css","__decorateClass","property","attribute","prototype","Object","safeCustomElement"],"mappings":"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"}
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("./subject/action.cjs"),t=require("./subject/blank-fill.cjs"),r=require("./subject/layout.cjs"),u=require("./subject/list.cjs"),c=require("./subject/single.cjs"),n=require("./subject/text-fill.cjs"),s=require("./subject/scale.cjs"),i=require("./subject/page-end.cjs"),o=require("./subject/rich-text.cjs"),b=require("./subject/type.cjs"),j=require("./editor/index.cjs"),x=require("./editor/blocksuite-editor.cjs");Object.defineProperty(exports,"QxsSubjectAction",{enumerable:!0,get:function(){return e.QxsSubjectAction}}),Object.defineProperty(exports,"QxsBlankFill",{enumerable:!0,get:function(){return t.QxsBlankFill}}),Object.defineProperty(exports,"QxsSubjectLayout",{enumerable:!0,get:function(){return r.QxsSubjectLayout}}),Object.defineProperty(exports,"QxsSubjectList",{enumerable:!0,get:function(){return u.QxsSubjectList}}),Object.defineProperty(exports,"QxsSubjectSingle",{enumerable:!0,get:function(){return c.QxsSubjectSingle}}),exports.SubjectError=c.SubjectError,Object.defineProperty(exports,"QxsTextFill",{enumerable:!0,get:function(){return n.QxsTextFill}}),Object.defineProperty(exports,"QxsScale",{enumerable:!0,get:function(){return s.QxsScale}}),Object.defineProperty(exports,"QxsPageEnd",{enumerable:!0,get:function(){return i.QxsPageEnd}}),Object.defineProperty(exports,"SubjectRichText",{enumerable:!0,get:function(){return o.SubjectRichText}}),Object.defineProperty(exports,"QxsSubjectType",{enumerable:!0,get:function(){return b.QxsSubjectType}}),exports.register=j.register,Object.defineProperty(exports,"QxsBlocksuiteEditor",{enumerable:!0,get:function(){return x.QxsBlocksuiteEditor}});
1
+ "use strict";var e=require("./subject/action.cjs"),t=require("./subject/blank-fill.cjs"),r=require("./subject/layout.cjs"),u=require("./subject/list.cjs"),c=require("./subject/single.cjs"),n=require("./subject/text-fill.cjs"),s=require("./subject/scale.cjs"),i=require("./subject/page-end.cjs"),b=require("./subject/rich-text.cjs"),j=require("./subject/type.cjs");Object.defineProperty(exports,"QxsSubjectAction",{enumerable:!0,get:function(){return e.QxsSubjectAction}}),Object.defineProperty(exports,"QxsBlankFill",{enumerable:!0,get:function(){return t.QxsBlankFill}}),Object.defineProperty(exports,"QxsSubjectLayout",{enumerable:!0,get:function(){return r.QxsSubjectLayout}}),Object.defineProperty(exports,"QxsSubjectList",{enumerable:!0,get:function(){return u.QxsSubjectList}}),Object.defineProperty(exports,"QxsSubjectSingle",{enumerable:!0,get:function(){return c.QxsSubjectSingle}}),Object.defineProperty(exports,"QxsTextFill",{enumerable:!0,get:function(){return n.QxsTextFill}}),Object.defineProperty(exports,"QxsScale",{enumerable:!0,get:function(){return s.QxsScale}}),Object.defineProperty(exports,"QxsPageEnd",{enumerable:!0,get:function(){return i.QxsPageEnd}}),Object.defineProperty(exports,"SubjectRichText",{enumerable:!0,get:function(){return b.SubjectRichText}}),Object.defineProperty(exports,"QxsSubjectType",{enumerable:!0,get:function(){return j.QxsSubjectType}});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../../../@tiptap_extensions@3.19.0_@tiptap_core@3.19.0_@tiptap_pm@3.20.5__@tiptap_pm@3.20.5/node_modules/@tiptap/extensions/dist/index.cjs"),t=e.Placeholder;exports.Placeholder=e.Placeholder,exports.default=t;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../../../../../../node_modules/.pnpm/@tiptap+extension-placeholder@3.19.0_@tiptap+extensions@3.19.0_@tiptap+core@3.19.0_@tiptap+pm@3.20.5__@tiptap+pm@3.20.5_/node_modules/@tiptap/extension-placeholder/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { Placeholder } from \"@tiptap/extensions\";\nimport { Placeholder as Placeholder2 } from \"@tiptap/extensions\";\nvar index_default = Placeholder;\nexport {\n Placeholder2 as Placeholder,\n index_default as default\n};\n//# sourceMappingURL=index.js.map"],"names":["index_default","Placeholder"],"mappings":"sOAKOA,EAAQC,EAAAA","x_google_ignoreList":[0]}