@eigenpal/docx-js-editor 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClipboardManager-D6dkOFg6.d.ts +436 -0
- package/dist/ClipboardManager-EZ0C6Onq.d.cts +436 -0
- package/dist/DocumentAgent-B0EC8lPC.d.cts +412 -0
- package/dist/DocumentAgent-BcCDg7i2.d.ts +412 -0
- package/dist/{FindReplaceDialog-MMDEJORP.js → FindReplaceDialog-AWQXKEUQ.js} +2 -2
- package/dist/{FindReplaceDialog-MMDEJORP.js.map → FindReplaceDialog-AWQXKEUQ.js.map} +1 -1
- package/dist/{FindReplaceDialog-K4GRE4JB.cjs → FindReplaceDialog-I4SZDSVP.cjs} +2 -2
- package/dist/{FindReplaceDialog-K4GRE4JB.cjs.map → FindReplaceDialog-I4SZDSVP.cjs.map} +1 -1
- package/dist/{FootnotePropertiesDialog-V3YOIJCV.cjs → FootnotePropertiesDialog-73VT2ZVZ.cjs} +2 -2
- package/dist/{FootnotePropertiesDialog-V3YOIJCV.cjs.map → FootnotePropertiesDialog-73VT2ZVZ.cjs.map} +1 -1
- package/dist/{FootnotePropertiesDialog-HG4267LR.js → FootnotePropertiesDialog-ZM3EF3EF.js} +2 -2
- package/dist/{FootnotePropertiesDialog-HG4267LR.js.map → FootnotePropertiesDialog-ZM3EF3EF.js.map} +1 -1
- package/dist/{HyperlinkDialog-SCSX4RP7.js → HyperlinkDialog-BA25XUT5.js} +2 -2
- package/dist/{HyperlinkDialog-SCSX4RP7.js.map → HyperlinkDialog-BA25XUT5.js.map} +1 -1
- package/dist/{HyperlinkDialog-YPKURBZK.cjs → HyperlinkDialog-V63LPOT2.cjs} +2 -2
- package/dist/{HyperlinkDialog-YPKURBZK.cjs.map → HyperlinkDialog-V63LPOT2.cjs.map} +1 -1
- package/dist/{ImagePositionDialog-CJYJ35PI.js → ImagePositionDialog-AIAMKPFK.js} +2 -2
- package/dist/{ImagePositionDialog-CJYJ35PI.js.map → ImagePositionDialog-AIAMKPFK.js.map} +1 -1
- package/dist/{ImagePositionDialog-IMVI7EXA.cjs → ImagePositionDialog-KMK7ROV2.cjs} +2 -2
- package/dist/{ImagePositionDialog-IMVI7EXA.cjs.map → ImagePositionDialog-KMK7ROV2.cjs.map} +1 -1
- package/dist/{ImagePropertiesDialog-P7WN2ALR.js → ImagePropertiesDialog-ERFCUVCW.js} +2 -2
- package/dist/{ImagePropertiesDialog-P7WN2ALR.js.map → ImagePropertiesDialog-ERFCUVCW.js.map} +1 -1
- package/dist/{ImagePropertiesDialog-YS4KJRN7.cjs → ImagePropertiesDialog-USMMRK6X.cjs} +2 -2
- package/dist/{ImagePropertiesDialog-YS4KJRN7.cjs.map → ImagePropertiesDialog-USMMRK6X.cjs.map} +1 -1
- package/dist/{TablePropertiesDialog-CUQXUBQN.cjs → TablePropertiesDialog-72CIUAZT.cjs} +2 -2
- package/dist/{TablePropertiesDialog-CUQXUBQN.cjs.map → TablePropertiesDialog-72CIUAZT.cjs.map} +1 -1
- package/dist/{TablePropertiesDialog-ZHAYVHPZ.js → TablePropertiesDialog-EMUEVYB3.js} +2 -2
- package/dist/{TablePropertiesDialog-ZHAYVHPZ.js.map → TablePropertiesDialog-EMUEVYB3.js.map} +1 -1
- package/dist/agentApi-BFVyKagE.d.cts +2227 -0
- package/dist/agentApi-BFVyKagE.d.ts +2227 -0
- package/dist/chunk-2CHPKB5A.cjs +112 -0
- package/dist/chunk-2CHPKB5A.cjs.map +1 -0
- package/dist/chunk-2QOEHCBX.js +2 -0
- package/dist/chunk-2QOEHCBX.js.map +1 -0
- package/dist/chunk-4QT5LPBA.cjs +24 -0
- package/dist/chunk-4QT5LPBA.cjs.map +1 -0
- package/dist/chunk-5DYSI4O4.cjs +60 -0
- package/dist/chunk-5DYSI4O4.cjs.map +1 -0
- package/dist/chunk-5FJXHXFV.cjs +2 -0
- package/dist/chunk-5FJXHXFV.cjs.map +1 -0
- package/dist/chunk-6FEWNF6B.js +4 -0
- package/dist/chunk-6FEWNF6B.js.map +1 -0
- package/dist/chunk-6LF5HZCV.js +10 -0
- package/dist/chunk-6LF5HZCV.js.map +1 -0
- package/dist/chunk-7JSPKVOW.js +2 -0
- package/dist/chunk-7JSPKVOW.js.map +1 -0
- package/dist/chunk-C33XDRDJ.cjs +28 -0
- package/dist/chunk-C33XDRDJ.cjs.map +1 -0
- package/dist/chunk-CV5WFE7K.js +24 -0
- package/dist/chunk-CV5WFE7K.js.map +1 -0
- package/dist/chunk-CXJRNISO.js +2 -0
- package/dist/chunk-CXJRNISO.js.map +1 -0
- package/dist/chunk-DP6Q75ZD.js +28 -0
- package/dist/chunk-DP6Q75ZD.js.map +1 -0
- package/dist/chunk-FDANI5P4.cjs +2 -0
- package/dist/chunk-FDANI5P4.cjs.map +1 -0
- package/dist/chunk-FGVGZLBL.js +2 -0
- package/dist/chunk-FGVGZLBL.js.map +1 -0
- package/dist/chunk-GJ4GKSDU.cjs +2 -0
- package/dist/chunk-GJ4GKSDU.cjs.map +1 -0
- package/dist/chunk-GWBTKVFD.cjs +2 -0
- package/dist/chunk-GWBTKVFD.cjs.map +1 -0
- package/dist/chunk-JOYPFQW2.js +2 -0
- package/dist/chunk-JOYPFQW2.js.map +1 -0
- package/dist/chunk-L54YNLSE.js +2 -0
- package/dist/chunk-L54YNLSE.js.map +1 -0
- package/dist/chunk-LPGMLJMO.js +259 -0
- package/dist/chunk-LPGMLJMO.js.map +1 -0
- package/dist/chunk-OHG7ROFC.js +11 -0
- package/dist/chunk-OHG7ROFC.js.map +1 -0
- package/dist/chunk-PANKMCFX.cjs +4 -0
- package/dist/chunk-PANKMCFX.cjs.map +1 -0
- package/dist/chunk-QDV75OJ4.js +112 -0
- package/dist/chunk-QDV75OJ4.js.map +1 -0
- package/dist/chunk-QEBO3EQP.cjs +2 -0
- package/dist/{chunk-V3MCDVZE.cjs.map → chunk-QEBO3EQP.cjs.map} +1 -1
- package/dist/chunk-QVIZ775M.cjs +259 -0
- package/dist/chunk-QVIZ775M.cjs.map +1 -0
- package/dist/chunk-RMUMR42R.cjs +10 -0
- package/dist/chunk-RMUMR42R.cjs.map +1 -0
- package/dist/chunk-T2HQYRA7.cjs +2 -0
- package/dist/chunk-T2HQYRA7.cjs.map +1 -0
- package/dist/chunk-ULXNEG66.js +60 -0
- package/dist/chunk-ULXNEG66.js.map +1 -0
- package/dist/chunk-WD2HTKRR.cjs +2 -0
- package/dist/chunk-WD2HTKRR.cjs.map +1 -0
- package/dist/chunk-XZNOV52K.cjs +11 -0
- package/dist/chunk-XZNOV52K.cjs.map +1 -0
- package/dist/chunk-Y6VCTLCJ.js +2 -0
- package/dist/{chunk-AL62KQYJ.js.map → chunk-Y6VCTLCJ.js.map} +1 -1
- package/dist/{TableToolbar-RHX9L4h9.d.ts → clipboard-CqE-UZ2d.d.cts} +125 -2
- package/dist/{TableToolbar-RHX9L4h9.d.cts → clipboard-beGtyabO.d.ts} +125 -2
- package/dist/colorResolver-B5YbO_a4.d.ts +618 -0
- package/dist/colorResolver-Cu46bSKr.d.cts +618 -0
- package/dist/core-plugins-reexport.cjs +1 -1
- package/dist/core-plugins-reexport.cjs.map +1 -1
- package/dist/core-plugins-reexport.d.cts +31 -1
- package/dist/core-plugins-reexport.d.ts +31 -1
- package/dist/core-plugins-reexport.js +1 -1
- package/dist/core-plugins-reexport.js.map +1 -1
- package/dist/core-reexport.cjs +1 -1
- package/dist/core-reexport.cjs.map +1 -1
- package/dist/core-reexport.d.cts +309 -4
- package/dist/core-reexport.d.ts +309 -4
- package/dist/core-reexport.js +1 -1
- package/dist/core-reexport.js.map +1 -1
- package/dist/executor-K5RXUTTR.js +2 -0
- package/dist/executor-K5RXUTTR.js.map +1 -0
- package/dist/executor-XIPIU3H4.cjs +2 -0
- package/dist/executor-XIPIU3H4.cjs.map +1 -0
- package/dist/fontLoader-CFKpg0Ri.d.ts +176 -0
- package/dist/fontLoader-HZYfILUm.d.cts +176 -0
- package/dist/headless-reexport.cjs +4 -1
- package/dist/headless-reexport.cjs.map +1 -1
- package/dist/headless-reexport.d.cts +195 -1
- package/dist/headless-reexport.d.ts +195 -1
- package/dist/headless-reexport.js +4 -1
- package/dist/headless-reexport.js.map +1 -1
- package/dist/index.cjs +9 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +2 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +261 -30
- package/dist/index.d.ts +261 -30
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp-reexport.cjs +16 -1
- package/dist/mcp-reexport.cjs.map +1 -1
- package/dist/mcp-reexport.d.cts +156 -1
- package/dist/mcp-reexport.d.ts +156 -1
- package/dist/mcp-reexport.js +16 -1
- package/dist/mcp-reexport.js.map +1 -1
- package/dist/processTemplate-G37IM66O.js +2 -0
- package/dist/processTemplate-G37IM66O.js.map +1 -0
- package/dist/processTemplate-RFBGVH7T.cjs +2 -0
- package/dist/processTemplate-RFBGVH7T.cjs.map +1 -0
- package/dist/react-BjOCdeTs.d.ts +1027 -0
- package/dist/react-UzAn4o7l.d.cts +1027 -0
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.css +2 -0
- package/dist/react.css.map +1 -0
- package/dist/react.d.cts +10 -860
- package/dist/react.d.ts +10 -860
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/registry-CV6nYWqP.d.ts +165 -0
- package/dist/registry-DjacfR6Q.d.cts +165 -0
- package/dist/selectionRects-6DU7HN7E.js +2 -0
- package/dist/selectionRects-6DU7HN7E.js.map +1 -0
- package/dist/selectionRects-YZSC24ZP.cjs +2 -0
- package/dist/selectionRects-YZSC24ZP.cjs.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/types-Bnp8rvJn.d.cts +310 -0
- package/dist/types-DwZ3xysp.d.ts +310 -0
- package/dist/ui.cjs +1 -1
- package/dist/ui.d.cts +3 -5
- package/dist/ui.d.ts +3 -5
- package/dist/ui.js +1 -1
- package/dist/variableDetector-BaDeXz7D.d.ts +173 -0
- package/dist/variableDetector-CMhJtM96.d.cts +173 -0
- package/package.json +10 -3
- package/dist/chunk-7FEY3YWC.cjs +0 -3
- package/dist/chunk-7FEY3YWC.cjs.map +0 -1
- package/dist/chunk-AL62KQYJ.js +0 -2
- package/dist/chunk-MXGYESPA.cjs +0 -178
- package/dist/chunk-MXGYESPA.cjs.map +0 -1
- package/dist/chunk-NMYD4OJZ.js +0 -3
- package/dist/chunk-NMYD4OJZ.js.map +0 -1
- package/dist/chunk-OD33FUTO.js +0 -178
- package/dist/chunk-OD33FUTO.js.map +0 -1
- package/dist/chunk-V3MCDVZE.cjs +0 -2
- package/dist/chunk-VIEW4NAF.js +0 -112
- package/dist/chunk-VIEW4NAF.js.map +0 -1
- package/dist/chunk-ZX4CSEL3.cjs +0 -112
- package/dist/chunk-ZX4CSEL3.cjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkQEBO3EQP_cjs=require('./chunk-QEBO3EQP.cjs');function E(){return {type:"break",breakType:"page"}}function X(){return {type:"break",breakType:"column"}}function j(t){return {type:"break",breakType:"textWrapping",clear:t}}function Z(){return {type:"run",content:[E()]}}function R(){return {type:"paragraph",content:[],formatting:{pageBreakBefore:true}}}function I(t){return t.content.filter(n=>n.type==="run")}function q(t,n){let{paragraphIndex:e}=n,o=[...t.package.document.content||[]],r=R();return o.splice(e+1,0,r),{...t,package:{...t.package,document:{...t.package.document,content:o}}}}function k(){return {type:"paragraph",content:[],formatting:{borders:{bottom:{style:"single",color:{rgb:"000000"},size:12,space:1}},spaceBefore:120,spaceAfter:120}}}function G(t,n){let{paragraphIndex:e}=n,o=[...t.package.document.content||[]],r=k();return o.splice(e+1,0,r),{...t,package:{...t.package,document:{...t.package.document,content:o}}}}function d(t){return t.type==="break"&&t.breakType==="page"}function Y(t){return t.type==="break"&&t.breakType==="column"}function Q(t){return t.type==="break"&&t.breakType==="textWrapping"}function ee(t){return t.type==="break"}function g(t){return t.formatting?.pageBreakBefore===true}function te(t){let n=0;for(let e of t.package.document.content||[])if(e.type==="paragraph"){let o=e;g(o)&&n++;let r=I(o);for(let a of r)for(let s of a.content)d(s)&&n++;}return n}function ne(t){let n=[],e=t.package.document.content||[];for(let o=0;o<e.length;o++){let r=e[o];if(r.type==="paragraph"){let a=r;g(a)&&n.push({paragraphIndex:o});let s=I(a);for(let l=0;l<s.length;l++){let c=s[l];for(let p of c.content)d(p)&&n.push({paragraphIndex:o,runIndex:l});}}}return n}function oe(t,n){let{paragraphIndex:e,runIndex:o}=n,r=[...t.package.document.content||[]],a=r[e];if(a.type!=="paragraph")return t;let s=a;if(g(s)&&o===void 0)return r[e]={...s,formatting:{...s.formatting,pageBreakBefore:false}},{...t,package:{...t.package,document:{...t.package.document,content:r}}};if(o!==void 0){let l=[],c=0;for(let p of s.content)if(p.type==="run"){if(c===o){let D=p.content.filter(K=>!d(K));D.length>0&&l.push({...p,content:D});}else l.push(p);c++;}else l.push(p);return r[e]={...s,content:l},{...t,package:{...t.package,document:{...t.package.document,content:r}}}}return t}var u=class{constructor(n){chunkQEBO3EQP_cjs.d(this,"listeners",new Set);chunkQEBO3EQP_cjs.d(this,"snapshot");chunkQEBO3EQP_cjs.d(this,"subscribe",n=>(this.listeners.add(n),()=>{this.listeners.delete(n);}));chunkQEBO3EQP_cjs.d(this,"getSnapshot",()=>this.snapshot);this.snapshot=n;}setSnapshot(n){this.snapshot=n,this.notify();}notify(){for(let n of this.listeners)n();}};var A="docx-editor-autosave",re=3e4,ae=1440*60*1e3,ie=2e3,P=1;function L(){try{let t="__docx_editor_test__";return localStorage.setItem(t,"test"),localStorage.removeItem(t),!0}catch{return false}}function _(t){return JSON.stringify({...t,originalBuffer:null})}function se(t){try{let n=JSON.parse(t);return !n||typeof n!="object"||!n.document||!n.savedAt?null:(n.version!==P&&console.warn("Auto-save data version mismatch, may need migration"),n)}catch{return null}}function le(t,n){let e=new Date(t).getTime();return Date.now()-e>n}var h=class extends u{constructor(e={}){super({status:"idle",lastSaveTime:null,hasRecoveryData:false,isEnabled:true});chunkQEBO3EQP_cjs.d(this,"storageKey");chunkQEBO3EQP_cjs.d(this,"interval");chunkQEBO3EQP_cjs.d(this,"maxAge");chunkQEBO3EQP_cjs.d(this,"saveOnChange");chunkQEBO3EQP_cjs.d(this,"debounceDelay");chunkQEBO3EQP_cjs.d(this,"onSaveCallback");chunkQEBO3EQP_cjs.d(this,"onErrorCallback");chunkQEBO3EQP_cjs.d(this,"onRecoveryAvailableCallback");chunkQEBO3EQP_cjs.d(this,"storageAvailable");chunkQEBO3EQP_cjs.d(this,"currentDocument",null);chunkQEBO3EQP_cjs.d(this,"lastSavedJson",null);chunkQEBO3EQP_cjs.d(this,"intervalTimer",null);chunkQEBO3EQP_cjs.d(this,"debounceTimer",null);chunkQEBO3EQP_cjs.d(this,"status","idle");chunkQEBO3EQP_cjs.d(this,"lastSaveTime",null);chunkQEBO3EQP_cjs.d(this,"_hasRecoveryData",false);chunkQEBO3EQP_cjs.d(this,"_isEnabled");this.storageKey=e.storageKey??A,this.interval=e.interval??re,this.maxAge=e.maxAge??ae,this.saveOnChange=e.saveOnChange??true,this.debounceDelay=e.debounceDelay??ie,this.onSaveCallback=e.onSave,this.onErrorCallback=e.onError,this.onRecoveryAvailableCallback=e.onRecoveryAvailable,this._isEnabled=true,this.storageAvailable=L(),this.checkRecoveryData();}onDocumentChanged(e){this.currentDocument=e,this._isEnabled&&this.saveOnChange&&e&&this.storageAvailable&&this.debounceSave();}async save(){if(!this.storageAvailable)return this.onErrorCallback?.(new Error("localStorage is not available")),false;let e=this.currentDocument;if(!e)return false;this.updateStatus("saving");try{let o=_(e);if(o===this.lastSavedJson)return this.updateStatus("saved"),!0;this.persistToStorage(o),this.lastSavedJson=o;let r=new Date;return this.lastSaveTime=r,this.updateStatus("saved"),this.onSaveCallback?.(r),!0}catch(o){return console.error("Auto-save failed:",o),this.updateStatus("error"),this.onErrorCallback?.(o),false}}clear(){if(this.storageAvailable)try{localStorage.removeItem(this.storageKey),this._hasRecoveryData=!1,this.lastSavedJson=null,this.emitSnapshot();}catch(e){console.error("Failed to clear auto-save:",e);}}getRecoveryData(){if(!this.storageAvailable)return null;try{let e=localStorage.getItem(this.storageKey);if(!e)return null;let o=se(e);return o?le(o.savedAt,this.maxAge)?(this.clear(),null):o:null}catch{return null}}acceptRecovery(){let e=this.getRecoveryData();return e?(this._hasRecoveryData=false,this.emitSnapshot(),e.document):null}dismissRecovery(){this.clear(),this._hasRecoveryData=false,this.emitSnapshot();}enable(){this._isEnabled=true,this.startInterval(),this.emitSnapshot();}disable(){this._isEnabled=false,this.stopTimers(),this.emitSnapshot();}startInterval(){this.stopTimers(),!(!this._isEnabled||!this.storageAvailable)&&(this.intervalTimer=setInterval(()=>{this.save();},this.interval));}destroy(){if(this.stopTimers(),this._isEnabled&&this.currentDocument&&this.storageAvailable)try{this.persistToStorage(_(this.currentDocument));}catch(e){console.error("Failed to save on destroy:",e);}}checkRecoveryData(){if(!this.storageAvailable)return;let e=this.getRecoveryData();e&&(this._hasRecoveryData=true,this.emitSnapshot(),this.onRecoveryAvailableCallback?.(e));}persistToStorage(e){let o={document:JSON.parse(e),savedAt:new Date().toISOString(),version:P};localStorage.setItem(this.storageKey,JSON.stringify(o));}debounceSave(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.save();},this.debounceDelay);}stopTimers(){this.intervalTimer&&(clearInterval(this.intervalTimer),this.intervalTimer=null),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null);}updateStatus(e){this.status=e,this.emitSnapshot();}emitSnapshot(){this.setSnapshot({status:this.status,lastSaveTime:this.lastSaveTime,hasRecoveryData:this._hasRecoveryData,isEnabled:this._isEnabled});}};function B(t){if(!t)return "Never";let e=new Date().getTime()-t.getTime(),o=Math.floor(e/1e3),r=Math.floor(o/60),a=Math.floor(r/60);return o<10?"Just now":o<60?`${o} seconds ago`:r<60?`${r} minute${r===1?"":"s"} ago`:a<24?`${a} hour${a===1?"":"s"} ago`:t.toLocaleDateString()}function F(t){return {idle:"Ready",saving:"Saving...",saved:"Saved",error:"Save failed"}[t]}function z(t=A){try{let n=localStorage.getItem(t);return n?new Blob([n]).size:0}catch{return 0}}function w(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function N(){return L()}var m={TABLE_INDEX:"data-table-index",ROW_INDEX:"data-row",COLUMN_INDEX:"data-col",TABLE_CELL:"data-table-cell"};function O(t,n){if(!(t instanceof Element))return null;let e=t;for(;e&&e!==n;){if(e.tagName==="TD"||e.tagName==="TH"){let o=e.getAttribute(m.ROW_INDEX),r=e.getAttribute(m.COLUMN_INDEX);if(o!==null&&r!==null){let a=e;for(;a&&a!==n;){if(a.tagName==="TABLE"){let s=a.getAttribute(m.TABLE_INDEX);if(s!==null)return {tableIndex:parseInt(s,10),rowIndex:parseInt(o,10),columnIndex:parseInt(r,10)};break}a=a.parentElement;}}break}e=e.parentElement;}return null}function M(t,n){if(!t.package?.document?.content)return null;let e=0;for(let o of t.package.document.content)if(o.type==="table"){if(e===n)return o;e++;}return null}function H(t,n,e){if(!t.package?.document?.content)return t;let o=0,r=t.package.document.content.map(a=>{if(a.type==="table"){if(o===n)return o++,e;o++;}return a});return {...t,package:{...t.package,document:{...t.package.document,content:r}}}}function V(t,n){if(!t.package?.document?.content)return t;let e=0,o=t.package.document.content.filter(r=>{if(r.type==="table"){let a=e===n;return e++,!a}return true});return {...t,package:{...t.package,document:{...t.package.document,content:o}}}}var f=class extends u{constructor(){super({selectedCell:null});}selectCell(n){this.setSnapshot({selectedCell:n});}clearSelection(){this.setSnapshot({selectedCell:null});}isCellSelected(n,e,o){let{selectedCell:r}=this.getSnapshot();return r?r.tableIndex===n&&r.rowIndex===e&&r.columnIndex===o:false}getSelectedCell(){return this.getSnapshot().selectedCell}};function W(t){if(!t||t==="transparent"||t==="inherit")return null;if(t.startsWith("#"))return t.slice(1).toUpperCase();let n=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(n){let e=parseInt(n[1]).toString(16).padStart(2,"0"),o=parseInt(n[2]).toString(16).padStart(2,"0"),r=parseInt(n[3]).toString(16).padStart(2,"0");return (e+o+r).toUpperCase()}return null}function x(t){let n=window.getComputedStyle(t),e={};(n.fontWeight==="bold"||parseInt(n.fontWeight)>=700)&&(e.bold=true),n.fontStyle==="italic"&&(e.italic=true);let o=n.textDecoration||n.textDecorationLine;o&&o.includes("underline")&&(e.underline={style:"single"}),o&&o.includes("line-through")&&(e.strike=true);let r=parseFloat(n.fontSize);!isNaN(r)&&r>0&&(e.fontSize=Math.round(r/1.333*2));let a=n.fontFamily.replace(/["']/g,"").split(",")[0].trim();a&&(e.fontFamily={ascii:a});let s=n.color;if(s&&s!=="rgb(0, 0, 0)"){let c=W(s);c&&(e.color={rgb:c});}let l=n.backgroundColor;if(l&&l!=="transparent"&&l!=="rgba(0, 0, 0, 0)"){let c=T(l);c&&(e.shading={fill:{rgb:c}});}return Object.keys(e).length>0?e:void 0}function ue(t,n){let e=document.createRange();e.selectNodeContents(t);let o=n.compareBoundaryPoints(Range.START_TO_START,e)>=0&&n.compareBoundaryPoints(Range.START_TO_END,e)<=0,r=n.compareBoundaryPoints(Range.END_TO_START,e)>=0&&n.compareBoundaryPoints(Range.END_TO_END,e)<=0;if(o&&r)return n.toString();if(o){let a=document.createRange();return a.setStart(n.startContainer,n.startOffset),a.selectNodeContents(t),a.setEnd(e.endContainer,e.endOffset),a.toString()}else if(r){let a=document.createRange();return a.selectNodeContents(t),a.setEnd(n.endContainer,n.endOffset),a.setStart(e.startContainer,e.startOffset),a.toString()}else if(n.intersectsNode(t))return t.textContent||"";return ""}function U(t){let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE){let e=n;if(e.hasAttribute("data-paragraph-index"))return e}n=n.parentNode;}return null}function C(){let t=window.getSelection();if(!t||t.isCollapsed)return [];let n=[],e=t.getRangeAt(0),o=e.commonAncestorContainer,r=o.nodeType===Node.ELEMENT_NODE?o:o.parentElement;if(!r)return n;if(r.querySelectorAll(".docx-run").forEach(s=>{if(e.intersectsNode(s)){let l=ue(s,e);if(l){let c=x(s);n.push({type:"run",formatting:c,content:[{type:"text",text:l}]});}}}),n.length===0){let s=t.toString();s&&n.push({type:"run",content:[{type:"text",text:s}]});}return n}function $(){let t=window.getSelection();if(!t||t.isCollapsed)return null;let n=C();if(n.length===0)return null;let e=t.toString(),o=t.getRangeAt(0),r=U(o.startContainer),a=U(o.endContainer),s=r?parseInt(r.getAttribute("data-paragraph-index")||"0",10):0,l=a?parseInt(a.getAttribute("data-paragraph-index")||"0",10):0;return {text:e,runs:n,startParagraphIndex:s,startRunIndex:0,startOffset:o.startOffset,endParagraphIndex:l,endRunIndex:0,endOffset:o.endOffset,isMultiParagraph:s!==l}}var T=W;var S=class extends u{constructor(){super({notifications:[]});chunkQEBO3EQP_cjs.d(this,"notifications",[]);chunkQEBO3EQP_cjs.d(this,"idCounter",0);chunkQEBO3EQP_cjs.d(this,"timers",new Set);}showError(e,o){return this.addNotification(e,"error",o)}showWarning(e,o){return this.addNotification(e,"warning",o)}showInfo(e,o){return this.addNotification(e,"info",o)}dismiss(e){this.notifications=this.notifications.map(r=>r.id===e?{...r,dismissed:true}:r),this.emitSnapshot();let o=setTimeout(()=>{this.timers.delete(o),this.notifications=this.notifications.filter(r=>r.id!==e),this.emitSnapshot();},300);this.timers.add(o);}clearAll(){this.notifications=[];for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.emitSnapshot();}destroy(){for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.notifications=[];}addNotification(e,o,r){let a=`error-${++this.idCounter}-${Date.now()}`,s={id:a,message:e,severity:o,details:r,timestamp:Date.now()};if(this.notifications=[...this.notifications,s],this.emitSnapshot(),o!=="error"){let l=setTimeout(()=>{this.timers.delete(l),this.dismiss(a);},5e3);this.timers.add(l);}return a}emitSnapshot(){this.setSnapshot({notifications:this.notifications});}};function J(t,n){let e=`plugin-styles-${t}`,o=document.getElementById(e);o&&o.remove();let r=document.createElement("style");return r.id=e,r.textContent=n,document.head.appendChild(r),()=>{let a=document.getElementById(e);a&&a.remove();}}var v=class extends u{constructor(){super({states:new Map,version:0});chunkQEBO3EQP_cjs.d(this,"plugins",[]);chunkQEBO3EQP_cjs.d(this,"pluginStates",new Map);chunkQEBO3EQP_cjs.d(this,"version",0);}initialize(e,o){this.destroyPlugins(),this.plugins=e;for(let r of e)r.initialize&&!this.pluginStates.has(r.id)&&this.pluginStates.set(r.id,r.initialize(o));this.emitSnapshot();}updateStates(e){let o=false;for(let r of this.plugins)if(r.onStateChange){let a=r.onStateChange(e);a!==void 0&&(this.pluginStates.set(r.id,a),o=true);}return o&&(this.version++,this.emitSnapshot()),o}getPluginState(e){return this.pluginStates.get(e)}setPluginState(e,o){this.pluginStates.set(e,o),this.version++,this.emitSnapshot();}destroy(){this.destroyPlugins(),this.emitSnapshot();}destroyPlugins(){for(let e of this.plugins)e.destroy&&e.destroy();this.pluginStates.clear(),this.plugins=[];}emitSnapshot(){this.setSnapshot({states:new Map(this.pluginStates),version:this.version});}};var b=class extends u{constructor(){super({hasLayout:false,selectionRects:[],caretPosition:null,selectedImageInfo:null,isFocused:false,isDragging:false,isResizingColumn:false,isImageInteracting:false,version:0});chunkQEBO3EQP_cjs.d(this,"_hasLayout",false);chunkQEBO3EQP_cjs.d(this,"_selectionRects",[]);chunkQEBO3EQP_cjs.d(this,"_caretPosition",null);chunkQEBO3EQP_cjs.d(this,"_isDragging",false);chunkQEBO3EQP_cjs.d(this,"_dragAnchor",null);chunkQEBO3EQP_cjs.d(this,"_columnResize",{isResizing:false,startX:0,columnIndex:0,tablePmStart:0,originalWidths:{left:0,right:0}});chunkQEBO3EQP_cjs.d(this,"_selectedImageInfo",null);chunkQEBO3EQP_cjs.d(this,"_isImageInteracting",false);chunkQEBO3EQP_cjs.d(this,"_isFocused",false);chunkQEBO3EQP_cjs.d(this,"_version",0);}setLayoutReady(e){this._hasLayout=e,this.emitSnapshot();}updateSelection(e,o){this._selectionRects=e,this._caretPosition=o,this.emitSnapshot();}startDrag(e){this._isDragging=true,this._dragAnchor=e,this.emitSnapshot();}endDrag(){this._isDragging=false,this._dragAnchor=null,this.emitSnapshot();}getDragAnchor(){return this._dragAnchor}startColumnResize(e,o,r,a){this._columnResize={isResizing:true,startX:r,columnIndex:o,tablePmStart:e,originalWidths:a},this.emitSnapshot();}endColumnResize(){this._columnResize={...this._columnResize,isResizing:false},this.emitSnapshot();}getColumnResize(){return this._columnResize}setSelectedImage(e){this._selectedImageInfo=e,this.emitSnapshot();}clearSelectedImage(){this._selectedImageInfo=null,this._isImageInteracting=false,this.emitSnapshot();}setImageInteracting(e){this._isImageInteracting=e,this.emitSnapshot();}setFocused(e){this._isFocused=e,this.emitSnapshot();}emitSnapshot(){this._version++,this.setSnapshot({hasLayout:this._hasLayout,selectionRects:this._selectionRects,caretPosition:this._caretPosition,selectedImageInfo:this._selectedImageInfo,isFocused:this._isFocused,isDragging:this._isDragging,isResizingColumn:this._columnResize.isResizing,isImageInteracting:this._isImageInteracting,version:this._version});}};var y=class extends u{constructor(e={}){let o=e.initialZoom??1;super({loadingState:"idle",parseError:null,isReady:false,zoom:o,fontsLoaded:false,version:0});chunkQEBO3EQP_cjs.d(this,"_loadingState","idle");chunkQEBO3EQP_cjs.d(this,"_parseError",null);chunkQEBO3EQP_cjs.d(this,"_zoom");chunkQEBO3EQP_cjs.d(this,"_fontsLoaded",false);chunkQEBO3EQP_cjs.d(this,"_document",null);chunkQEBO3EQP_cjs.d(this,"_version",0);chunkQEBO3EQP_cjs.d(this,"onChangeCallback");chunkQEBO3EQP_cjs.d(this,"onErrorCallback");this._zoom=o,this.onChangeCallback=e.onChange,this.onErrorCallback=e.onError;}setParsingStarted(){this._loadingState="parsing",this._parseError=null,this.emitSnapshot();}setDocumentLoaded(e){this._document=e,this._loadingState="loading-fonts",this._parseError=null,this.emitSnapshot();}setFontsLoaded(){this._fontsLoaded=true,this._loadingState="ready",this.emitSnapshot();}setLoadError(e){this._loadingState="error",this._parseError=e.message,this.onErrorCallback?.(e),this.emitSnapshot();}getDocument(){return this._document}updateDocument(e){this._document=e,this.onChangeCallback?.(e),this.emitSnapshot();}setZoom(e){this._zoom=Math.max(.25,Math.min(4,e)),this.emitSnapshot();}getZoom(){return this._zoom}emitSnapshot(){this._version++,this.setSnapshot({loadingState:this._loadingState,parseError:this._parseError,isReady:this._loadingState==="ready",zoom:this._zoom,fontsLoaded:this._fontsLoaded,version:this._version});}};var nn="0.0.2";exports.A=H;exports.B=V;exports.C=f;exports.D=x;exports.E=C;exports.F=$;exports.G=T;exports.H=S;exports.I=J;exports.J=v;exports.K=b;exports.L=y;exports.M=nn;exports.a=E;exports.b=X;exports.c=j;exports.d=Z;exports.e=R;exports.f=q;exports.g=k;exports.h=G;exports.i=d;exports.j=Y;exports.k=Q;exports.l=ee;exports.m=g;exports.n=te;exports.o=ne;exports.p=oe;exports.q=u;exports.r=h;exports.s=B;exports.t=F;exports.u=z;exports.v=w;exports.w=N;exports.x=m;exports.y=O;exports.z=M;//# sourceMappingURL=chunk-FDANI5P4.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-FDANI5P4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/utils/insertOperations.ts","../../core/src/managers/Subscribable.ts","../../core/src/managers/AutoSaveManager.ts","../../core/src/managers/TableSelectionManager.ts","../../core/src/managers/ClipboardManager.ts","../../core/src/managers/ErrorManager.ts","../../core/src/managers/PluginLifecycleManager.ts","../../core/src/managers/LayoutCoordinator.ts","../../core/src/managers/EditorCoordinator.ts","../../core/src/core.ts"],"names":["createPageBreak","createColumnBreak","createLineBreak","clear","createPageBreakRun","createPageBreakParagraph","getParagraphRuns","paragraph","item","insertPageBreak","doc","position","paragraphIndex","content","pageBreakParagraph","createHorizontalRule","insertHorizontalRule","hrParagraph","isPageBreak","isColumnBreak","isLineBreak","isBreakContent","hasPageBreakBefore","countPageBreaks","count","block","runs","run","findPageBreaks","positions","runIndex","runContent","removePageBreak","newParagraphContent","currentRunIndex","newRunContent","c","Subscribable","initialSnapshot","__publicField","listener","snapshot","DEFAULT_STORAGE_KEY","DEFAULT_INTERVAL","DEFAULT_MAX_AGE","DEFAULT_DEBOUNCE_DELAY","SAVE_VERSION","isLocalStorageAvailable","testKey","serializeForStorage","document","parseSavedData","json","data","isStale","savedAt","maxAge","savedTime","AutoSaveManager","options","serialized","saveTime","error","savedJson","savedData","dataToSave","status","formatLastSaveTime","date","diffMs","diffSec","diffMin","diffHour","getAutoSaveStatusLabel","getAutoSaveStorageSize","storageKey","formatStorageSize","bytes","isAutoSaveSupported","TABLE_DATA_ATTRIBUTES","findTableFromClick","target","container","current","rowAttr","colAttr","tableElement","tableIndexAttr","getTableFromDocument","tableIndex","currentTableIndex","updateTableInDocument","newTable","newContent","deleteTableFromDocument","shouldDelete","TableSelectionManager","coords","rowIndex","columnIndex","selectedCell","cssColorToHex","color","rgbMatch","r","g","b","extractFormattingFromElement","element","style","formatting","textDecoration","fontSize","fontFamily","hex","bgColor","rgbToHex","getSelectedTextFromRun","runEl","range","runRange","startInRun","endInRun","tempRange","findParagraphElement","node","getSelectionRuns","selection","containerElement","text","selectedText","createSelectionFromDOM","startPara","endPara","startParagraphIndex","endParagraphIndex","ErrorManager","message","details","id","n","timer","severity","notification","injectStyles","pluginId","css","styleId","existing","el","PluginLifecycleManager","plugins","editorView","plugin","anyChanged","newState","state","LayoutCoordinator","hasLayout","selectionRects","caretPosition","anchor","tablePmStart","startX","originalWidths","imageInfo","interacting","focused","EditorCoordinator","zoom","VERSION"],"mappings":"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","file":"chunk-FDANI5P4.cjs","sourcesContent":["/**\n * Insert Operations Utility\n *\n * Utility functions for inserting content into the document.\n * Provides functions for inserting page breaks, horizontal rules, and other elements.\n */\n\nimport type {\n BreakContent,\n Run,\n Paragraph,\n Document,\n ParagraphContent,\n RunContent,\n} from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Insert position in the document\n */\nexport interface InsertPosition {\n /** Paragraph index in the document body */\n paragraphIndex: number;\n /** Run index within the paragraph (optional) */\n runIndex?: number;\n /** Character offset within the run (optional) */\n offset?: number;\n}\n\n// ============================================================================\n// PAGE BREAK\n// ============================================================================\n\n/**\n * Create a page break content element\n */\nexport function createPageBreak(): BreakContent {\n return {\n type: 'break',\n breakType: 'page',\n };\n}\n\n/**\n * Create a column break content element\n */\nexport function createColumnBreak(): BreakContent {\n return {\n type: 'break',\n breakType: 'column',\n };\n}\n\n/**\n * Create a text wrapping break (line break)\n */\nexport function createLineBreak(clear?: 'none' | 'left' | 'right' | 'all'): BreakContent {\n return {\n type: 'break',\n breakType: 'textWrapping',\n clear,\n };\n}\n\n/**\n * Create a run containing a page break\n */\nexport function createPageBreakRun(): Run {\n return {\n type: 'run',\n content: [createPageBreak()],\n };\n}\n\n/**\n * Create an empty paragraph with a page break before it\n */\nexport function createPageBreakParagraph(): Paragraph {\n return {\n type: 'paragraph',\n content: [],\n formatting: {\n pageBreakBefore: true,\n },\n };\n}\n\n/**\n * Get runs from paragraph content\n */\nfunction getParagraphRuns(paragraph: Paragraph): Run[] {\n return paragraph.content.filter((item): item is Run => item.type === 'run');\n}\n\n/**\n * Insert a page break at a position in the document\n * This inserts a new paragraph with pageBreakBefore: true\n */\nexport function insertPageBreak(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex } = position;\n const content = [...(doc.package.document.content || [])];\n\n // Create a new paragraph with page break before\n const pageBreakParagraph = createPageBreakParagraph();\n\n // Insert after the specified paragraph\n content.splice(paragraphIndex + 1, 0, pageBreakParagraph);\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n}\n\n// ============================================================================\n// HORIZONTAL RULE\n// ============================================================================\n\n/**\n * Create a horizontal rule paragraph\n * Uses a paragraph with bottom border to simulate horizontal rule\n */\nexport function createHorizontalRule(): Paragraph {\n return {\n type: 'paragraph',\n content: [],\n formatting: {\n borders: {\n bottom: {\n style: 'single',\n color: { rgb: '000000' },\n size: 12, // 1.5pt\n space: 1,\n },\n },\n spaceBefore: 120, // 6pt\n spaceAfter: 120, // 6pt\n },\n };\n}\n\n/**\n * Insert a horizontal rule at a position in the document\n */\nexport function insertHorizontalRule(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex } = position;\n const content = [...(doc.package.document.content || [])];\n\n // Create a horizontal rule paragraph\n const hrParagraph = createHorizontalRule();\n\n // Insert after the specified paragraph\n content.splice(paragraphIndex + 1, 0, hrParagraph);\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if content is a page break\n */\nexport function isPageBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'page';\n}\n\n/**\n * Check if content is a column break\n */\nexport function isColumnBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'column';\n}\n\n/**\n * Check if content is a line break\n */\nexport function isLineBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'textWrapping';\n}\n\n/**\n * Check if content is any type of break\n */\nexport function isBreakContent(content: RunContent): content is BreakContent {\n return content.type === 'break';\n}\n\n/**\n * Check if a paragraph has pageBreakBefore\n */\nexport function hasPageBreakBefore(paragraph: Paragraph): boolean {\n return paragraph.formatting?.pageBreakBefore === true;\n}\n\n/**\n * Count page breaks in a document\n */\nexport function countPageBreaks(doc: Document): number {\n let count = 0;\n\n for (const block of doc.package.document.content || []) {\n if (block.type === 'paragraph') {\n const paragraph = block as Paragraph;\n\n // Check for pageBreakBefore\n if (hasPageBreakBefore(paragraph)) {\n count++;\n }\n\n // Check for page breaks in runs\n const runs = getParagraphRuns(paragraph);\n for (const run of runs) {\n for (const content of run.content) {\n if (isPageBreak(content)) {\n count++;\n }\n }\n }\n }\n }\n\n return count;\n}\n\n/**\n * Find all page break positions in a document\n */\nexport function findPageBreaks(doc: Document): InsertPosition[] {\n const positions: InsertPosition[] = [];\n\n const content = doc.package.document.content || [];\n for (let paragraphIndex = 0; paragraphIndex < content.length; paragraphIndex++) {\n const block = content[paragraphIndex];\n\n if (block.type === 'paragraph') {\n const paragraph = block as Paragraph;\n\n // Check for pageBreakBefore\n if (hasPageBreakBefore(paragraph)) {\n positions.push({ paragraphIndex });\n }\n\n // Check for page breaks in runs\n const runs = getParagraphRuns(paragraph);\n for (let runIndex = 0; runIndex < runs.length; runIndex++) {\n const run = runs[runIndex];\n for (const runContent of run.content) {\n if (isPageBreak(runContent)) {\n positions.push({ paragraphIndex, runIndex });\n }\n }\n }\n }\n }\n\n return positions;\n}\n\n/**\n * Remove a page break at a specific position\n */\nexport function removePageBreak(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex, runIndex } = position;\n const content = [...(doc.package.document.content || [])];\n const block = content[paragraphIndex];\n\n if (block.type !== 'paragraph') {\n return doc;\n }\n\n const paragraph = block as Paragraph;\n\n // If pageBreakBefore, remove the formatting\n if (hasPageBreakBefore(paragraph) && runIndex === undefined) {\n content[paragraphIndex] = {\n ...paragraph,\n formatting: {\n ...paragraph.formatting,\n pageBreakBefore: false,\n },\n };\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n }\n\n // If page break in run, remove it\n if (runIndex !== undefined) {\n const newParagraphContent: ParagraphContent[] = [];\n let currentRunIndex = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n if (currentRunIndex === runIndex) {\n const newRunContent = item.content.filter((c: RunContent) => !isPageBreak(c));\n\n if (newRunContent.length > 0) {\n newParagraphContent.push({ ...item, content: newRunContent });\n }\n } else {\n newParagraphContent.push(item);\n }\n currentRunIndex++;\n } else {\n newParagraphContent.push(item);\n }\n }\n\n content[paragraphIndex] = { ...paragraph, content: newParagraphContent };\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n }\n\n return doc;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n};\n","/**\n * Subscribable Base Class\n *\n * Framework-agnostic base for manager classes that need to notify\n * UI frameworks of state changes.\n *\n * Compatible with:\n * - React: useSyncExternalStore(manager.subscribe, manager.getSnapshot)\n * - Vue: watchEffect(() => { manager.subscribe(triggerRef) })\n */\n\nexport abstract class Subscribable<TSnapshot> {\n private listeners = new Set<() => void>();\n private snapshot: TSnapshot;\n\n constructor(initialSnapshot: TSnapshot) {\n this.snapshot = initialSnapshot;\n }\n\n /**\n * Subscribe to state changes. Returns an unsubscribe function.\n * Bound method — safe to pass as `useSyncExternalStore(manager.subscribe, ...)`.\n */\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n /**\n * Get the current snapshot. Returns a stable reference unless state has changed.\n * Bound method — safe to pass as `useSyncExternalStore(..., manager.getSnapshot)`.\n */\n getSnapshot = (): TSnapshot => {\n return this.snapshot;\n };\n\n /**\n * Update the snapshot and notify all subscribers.\n * Subclasses should call this whenever their state changes.\n */\n protected setSnapshot(snapshot: TSnapshot): void {\n this.snapshot = snapshot;\n this.notify();\n }\n\n private notify(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","/**\n * AutoSaveManager\n *\n * Framework-agnostic class for auto-saving documents to localStorage.\n * Extracted from the React `useAutoSave` hook.\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(manager.subscribe, manager.getSnapshot);\n * ```\n */\n\nimport { Subscribable } from './Subscribable';\nimport type {\n AutoSaveSnapshot,\n AutoSaveStatus,\n AutoSaveManagerOptions,\n SavedDocumentData,\n} from './types';\nimport type { Document } from '../types/document';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_STORAGE_KEY = 'docx-editor-autosave';\nconst DEFAULT_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours\nconst DEFAULT_DEBOUNCE_DELAY = 2000; // 2 seconds\nconst SAVE_VERSION = 1;\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__docx_editor_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction serializeForStorage(document: Document): string {\n return JSON.stringify({ ...document, originalBuffer: null });\n}\n\nfunction parseSavedData(json: string): SavedDocumentData | null {\n try {\n const data = JSON.parse(json);\n if (!data || typeof data !== 'object') return null;\n if (!data.document || !data.savedAt) return null;\n if (data.version !== SAVE_VERSION) {\n console.warn('Auto-save data version mismatch, may need migration');\n }\n return data as SavedDocumentData;\n } catch {\n return null;\n }\n}\n\nfunction isStale(savedAt: string, maxAge: number): boolean {\n const savedTime = new Date(savedAt).getTime();\n return Date.now() - savedTime > maxAge;\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class AutoSaveManager extends Subscribable<AutoSaveSnapshot> {\n private storageKey: string;\n private interval: number;\n private maxAge: number;\n private saveOnChange: boolean;\n private debounceDelay: number;\n private onSaveCallback?: (timestamp: Date) => void;\n private onErrorCallback?: (error: Error) => void;\n private onRecoveryAvailableCallback?: (saved: SavedDocumentData) => void;\n\n private storageAvailable: boolean;\n private currentDocument: Document | null = null;\n private lastSavedJson: string | null = null;\n private intervalTimer: ReturnType<typeof setInterval> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private status: AutoSaveStatus = 'idle';\n private lastSaveTime: Date | null = null;\n private _hasRecoveryData = false;\n private _isEnabled: boolean;\n\n constructor(options: AutoSaveManagerOptions = {}) {\n super({\n status: 'idle',\n lastSaveTime: null,\n hasRecoveryData: false,\n isEnabled: true,\n });\n\n this.storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n this.interval = options.interval ?? DEFAULT_INTERVAL;\n this.maxAge = options.maxAge ?? DEFAULT_MAX_AGE;\n this.saveOnChange = options.saveOnChange ?? true;\n this.debounceDelay = options.debounceDelay ?? DEFAULT_DEBOUNCE_DELAY;\n this.onSaveCallback = options.onSave;\n this.onErrorCallback = options.onError;\n this.onRecoveryAvailableCallback = options.onRecoveryAvailable;\n this._isEnabled = true;\n this.storageAvailable = isLocalStorageAvailable();\n\n // Check for recovery data\n this.checkRecoveryData();\n }\n\n // --------------------------------------------------------------------------\n // PUBLIC API\n // --------------------------------------------------------------------------\n\n /** Update the current document. Triggers debounced save if enabled. */\n onDocumentChanged(document: Document | null): void {\n this.currentDocument = document;\n\n if (this._isEnabled && this.saveOnChange && document && this.storageAvailable) {\n this.debounceSave();\n }\n }\n\n /** Manually trigger a save. */\n async save(): Promise<boolean> {\n if (!this.storageAvailable) {\n this.onErrorCallback?.(new Error('localStorage is not available'));\n return false;\n }\n\n const doc = this.currentDocument;\n if (!doc) return false;\n\n this.updateStatus('saving');\n\n try {\n const serialized = serializeForStorage(doc);\n\n // Skip if unchanged\n if (serialized === this.lastSavedJson) {\n this.updateStatus('saved');\n return true;\n }\n\n this.persistToStorage(serialized);\n this.lastSavedJson = serialized;\n\n const saveTime = new Date();\n this.lastSaveTime = saveTime;\n this.updateStatus('saved');\n this.onSaveCallback?.(saveTime);\n return true;\n } catch (error) {\n console.error('Auto-save failed:', error);\n this.updateStatus('error');\n this.onErrorCallback?.(error as Error);\n return false;\n }\n }\n\n /** Clear auto-saved data from storage. */\n clear(): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.removeItem(this.storageKey);\n this._hasRecoveryData = false;\n this.lastSavedJson = null;\n this.emitSnapshot();\n } catch (error) {\n console.error('Failed to clear auto-save:', error);\n }\n }\n\n /** Get recovery data from storage. */\n getRecoveryData(): SavedDocumentData | null {\n if (!this.storageAvailable) return null;\n try {\n const savedJson = localStorage.getItem(this.storageKey);\n if (!savedJson) return null;\n\n const savedData = parseSavedData(savedJson);\n if (!savedData) return null;\n\n if (isStale(savedData.savedAt, this.maxAge)) {\n this.clear();\n return null;\n }\n return savedData;\n } catch {\n return null;\n }\n }\n\n /** Accept recovery and return the document. */\n acceptRecovery(): Document | null {\n const data = this.getRecoveryData();\n if (!data) return null;\n this._hasRecoveryData = false;\n this.emitSnapshot();\n return data.document;\n }\n\n /** Dismiss recovery and clear saved data. */\n dismissRecovery(): void {\n this.clear();\n this._hasRecoveryData = false;\n this.emitSnapshot();\n }\n\n /** Enable auto-save and start the interval timer. */\n enable(): void {\n this._isEnabled = true;\n this.startInterval();\n this.emitSnapshot();\n }\n\n /** Disable auto-save and stop all timers. */\n disable(): void {\n this._isEnabled = false;\n this.stopTimers();\n this.emitSnapshot();\n }\n\n /** Start the interval timer. Call after enabling or on init. */\n startInterval(): void {\n this.stopTimers();\n if (!this._isEnabled || !this.storageAvailable) return;\n\n this.intervalTimer = setInterval(() => {\n this.save();\n }, this.interval);\n }\n\n /** Save synchronously on destroy (best-effort). */\n destroy(): void {\n this.stopTimers();\n\n if (this._isEnabled && this.currentDocument && this.storageAvailable) {\n try {\n this.persistToStorage(serializeForStorage(this.currentDocument));\n } catch (error) {\n console.error('Failed to save on destroy:', error);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private checkRecoveryData(): void {\n if (!this.storageAvailable) return;\n const data = this.getRecoveryData();\n if (data) {\n this._hasRecoveryData = true;\n this.emitSnapshot();\n this.onRecoveryAvailableCallback?.(data);\n }\n }\n\n private persistToStorage(serialized: string): void {\n const dataToSave: SavedDocumentData = {\n document: JSON.parse(serialized),\n savedAt: new Date().toISOString(),\n version: SAVE_VERSION,\n };\n localStorage.setItem(this.storageKey, JSON.stringify(dataToSave));\n }\n\n private debounceSave(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n this.save();\n }, this.debounceDelay);\n }\n\n private stopTimers(): void {\n if (this.intervalTimer) {\n clearInterval(this.intervalTimer);\n this.intervalTimer = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private updateStatus(status: AutoSaveStatus): void {\n this.status = status;\n this.emitSnapshot();\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({\n status: this.status,\n lastSaveTime: this.lastSaveTime,\n hasRecoveryData: this._hasRecoveryData,\n isEnabled: this._isEnabled,\n });\n }\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS (re-exported as-is from the old hook)\n// ============================================================================\n\n/** Format last save time for display */\nexport function formatLastSaveTime(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n\n if (diffSec < 10) return 'Just now';\n if (diffSec < 60) return `${diffSec} seconds ago`;\n if (diffMin < 60) return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour === 1 ? '' : 's'} ago`;\n\n return date.toLocaleDateString();\n}\n\n/** Get auto-save status label */\nexport function getAutoSaveStatusLabel(status: AutoSaveStatus): string {\n const labels: Record<AutoSaveStatus, string> = {\n idle: 'Ready',\n saving: 'Saving...',\n saved: 'Saved',\n error: 'Save failed',\n };\n return labels[status];\n}\n\n/** Get storage size used by auto-save */\nexport function getAutoSaveStorageSize(storageKey: string = DEFAULT_STORAGE_KEY): number {\n try {\n const data = localStorage.getItem(storageKey);\n if (!data) return 0;\n return new Blob([data]).size;\n } catch {\n return 0;\n }\n}\n\n/** Format storage size for display */\nexport function formatStorageSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Check if auto-save is supported */\nexport function isAutoSaveSupported(): boolean {\n return isLocalStorageAvailable();\n}\n","/**\n * TableSelectionManager\n *\n * Framework-agnostic class for managing table cell selection state.\n * Extracted from the React `useTableSelection` hook.\n *\n * Handles:\n * - Cell selection via data-attribute queries on the DOM\n * - Table document operations (add/delete rows/columns, merge/split)\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { CellCoordinates, TableSelectionSnapshot } from './types';\nimport type { Document, Table } from '../types/document';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Data attributes for table elements in the rendered DOM */\nexport const TABLE_DATA_ATTRIBUTES = {\n TABLE_INDEX: 'data-table-index',\n ROW_INDEX: 'data-row',\n COLUMN_INDEX: 'data-col',\n TABLE_CELL: 'data-table-cell',\n} as const;\n\n// ============================================================================\n// HELPER FUNCTIONS (framework-agnostic DOM queries)\n// ============================================================================\n\n/**\n * Find table cell coordinates from a click target by walking up the DOM\n * and reading data attributes.\n */\nexport function findTableFromClick(\n target: EventTarget | null,\n container?: HTMLElement | null\n): CellCoordinates | null {\n if (!(target instanceof Element)) return null;\n\n let current: Element | null = target;\n while (current && current !== container) {\n if (current.tagName === 'TD' || current.tagName === 'TH') {\n const rowAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.ROW_INDEX);\n const colAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.COLUMN_INDEX);\n\n if (rowAttr !== null && colAttr !== null) {\n let tableElement: Element | null = current;\n while (tableElement && tableElement !== container) {\n if (tableElement.tagName === 'TABLE') {\n const tableIndexAttr = tableElement.getAttribute(TABLE_DATA_ATTRIBUTES.TABLE_INDEX);\n if (tableIndexAttr !== null) {\n return {\n tableIndex: parseInt(tableIndexAttr, 10),\n rowIndex: parseInt(rowAttr, 10),\n columnIndex: parseInt(colAttr, 10),\n };\n }\n break;\n }\n tableElement = tableElement.parentElement;\n }\n }\n break;\n }\n current = current.parentElement;\n }\n\n return null;\n}\n\n/** Get a table from the document by index. */\nexport function getTableFromDocument(doc: Document, tableIndex: number): Table | null {\n if (!doc.package?.document?.content) return null;\n\n let currentTableIndex = 0;\n for (const block of doc.package.document.content) {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n return block;\n }\n currentTableIndex++;\n }\n }\n return null;\n}\n\n/** Update a table in the document immutably. */\nexport function updateTableInDocument(\n doc: Document,\n tableIndex: number,\n newTable: Table\n): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.map((block) => {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n currentTableIndex++;\n return newTable;\n }\n currentTableIndex++;\n }\n return block;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n/** Delete a table from the document immutably. */\nexport function deleteTableFromDocument(doc: Document, tableIndex: number): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.filter((block) => {\n if (block.type === 'table') {\n const shouldDelete = currentTableIndex === tableIndex;\n currentTableIndex++;\n return !shouldDelete;\n }\n return true;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class TableSelectionManager extends Subscribable<TableSelectionSnapshot> {\n constructor() {\n super({ selectedCell: null });\n }\n\n /** Select a specific cell. */\n selectCell(coords: CellCoordinates): void {\n this.setSnapshot({ selectedCell: coords });\n }\n\n /** Clear the current selection. */\n clearSelection(): void {\n this.setSnapshot({ selectedCell: null });\n }\n\n /** Check if a specific cell is selected. */\n isCellSelected(tableIndex: number, rowIndex: number, columnIndex: number): boolean {\n const { selectedCell } = this.getSnapshot();\n if (!selectedCell) return false;\n return (\n selectedCell.tableIndex === tableIndex &&\n selectedCell.rowIndex === rowIndex &&\n selectedCell.columnIndex === columnIndex\n );\n }\n\n /** Get the currently selected cell coordinates, or null. */\n getSelectedCell(): CellCoordinates | null {\n return this.getSnapshot().selectedCell;\n }\n}\n","/**\n * ClipboardManager\n *\n * Framework-agnostic class for clipboard operations in the editor.\n * Extracted from the React `useClipboard` hook.\n *\n * Handles:\n * - DOM selection traversal and run extraction\n * - Formatting extraction from computed styles\n * - Clipboard read/write operations\n */\n\nimport type { Run } from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Selection data for clipboard operations */\nexport interface ClipboardSelection {\n text: string;\n runs: Run[];\n startParagraphIndex: number;\n startRunIndex: number;\n startOffset: number;\n endParagraphIndex: number;\n endRunIndex: number;\n endOffset: number;\n isMultiParagraph: boolean;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Convert a CSS color string (rgb/rgba/hex) to a 6-char uppercase hex string.\n *\n * NOTE: This differs from `colorResolver.rgbToHex(r, g, b)` which takes\n * numeric components. This function parses CSS color strings.\n */\nexport function cssColorToHex(color: string): string | null {\n if (!color || color === 'transparent' || color === 'inherit') return null;\n\n if (color.startsWith('#')) {\n return color.slice(1).toUpperCase();\n }\n\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');\n const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');\n const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');\n return (r + g + b).toUpperCase();\n }\n\n return null;\n}\n\n/** Extract formatting from an HTML element's computed styles. */\nexport function extractFormattingFromElement(element: HTMLElement): Run['formatting'] {\n const style = window.getComputedStyle(element);\n const formatting: Run['formatting'] = {};\n\n // Bold\n if (style.fontWeight === 'bold' || parseInt(style.fontWeight) >= 700) {\n formatting.bold = true;\n }\n\n // Italic\n if (style.fontStyle === 'italic') {\n formatting.italic = true;\n }\n\n // Underline\n const textDecoration = style.textDecoration || style.textDecorationLine;\n if (textDecoration && textDecoration.includes('underline')) {\n formatting.underline = { style: 'single' };\n }\n\n // Strikethrough\n if (textDecoration && textDecoration.includes('line-through')) {\n formatting.strike = true;\n }\n\n // Font size (convert px to half-points)\n const fontSize = parseFloat(style.fontSize);\n if (!isNaN(fontSize) && fontSize > 0) {\n formatting.fontSize = Math.round((fontSize / 1.333) * 2);\n }\n\n // Font family\n const fontFamily = style.fontFamily.replace(/[\"']/g, '').split(',')[0].trim();\n if (fontFamily) {\n formatting.fontFamily = { ascii: fontFamily };\n }\n\n // Color\n const color = style.color;\n if (color && color !== 'rgb(0, 0, 0)') {\n const hex = cssColorToHex(color);\n if (hex) {\n formatting.color = { rgb: hex };\n }\n }\n\n // Background color\n const bgColor = style.backgroundColor;\n if (bgColor && bgColor !== 'transparent' && bgColor !== 'rgba(0, 0, 0, 0)') {\n const hex = rgbToHex(bgColor);\n if (hex) {\n formatting.shading = { fill: { rgb: hex } };\n }\n }\n\n return Object.keys(formatting).length > 0 ? formatting : undefined;\n}\n\n/** Get selected text from a run element, considering partial selection. */\nfunction getSelectedTextFromRun(runEl: Node, range: Range): string {\n const runRange = document.createRange();\n runRange.selectNodeContents(runEl);\n\n const startInRun =\n range.compareBoundaryPoints(Range.START_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, runRange) <= 0;\n const endInRun =\n range.compareBoundaryPoints(Range.END_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, runRange) <= 0;\n\n if (startInRun && endInRun) {\n return range.toString();\n } else if (startInRun) {\n const tempRange = document.createRange();\n tempRange.setStart(range.startContainer, range.startOffset);\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(runRange.endContainer, runRange.endOffset);\n return tempRange.toString();\n } else if (endInRun) {\n const tempRange = document.createRange();\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(range.endContainer, range.endOffset);\n tempRange.setStart(runRange.startContainer, runRange.startOffset);\n return tempRange.toString();\n } else if (range.intersectsNode(runEl)) {\n return runEl.textContent || '';\n }\n\n return '';\n}\n\n/** Find the paragraph element containing a node. */\nfunction findParagraphElement(node: Node): HTMLElement | null {\n let current: Node | null = node;\n while (current) {\n if (current.nodeType === Node.ELEMENT_NODE) {\n const element = current as HTMLElement;\n if (element.hasAttribute('data-paragraph-index')) {\n return element;\n }\n }\n current = current.parentNode;\n }\n return null;\n}\n\n/** Get selected runs from the current DOM selection. */\nexport function getSelectionRuns(): Run[] {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return [];\n\n const runs: Run[] = [];\n const range = selection.getRangeAt(0);\n\n const container = range.commonAncestorContainer;\n const containerElement =\n container.nodeType === Node.ELEMENT_NODE ? (container as HTMLElement) : container.parentElement;\n\n if (!containerElement) return runs;\n\n const runElements = containerElement.querySelectorAll('.docx-run');\n\n runElements.forEach((runEl) => {\n if (range.intersectsNode(runEl)) {\n const text = getSelectedTextFromRun(runEl, range);\n if (text) {\n const formatting = extractFormattingFromElement(runEl as HTMLElement);\n runs.push({\n type: 'run',\n formatting,\n content: [{ type: 'text', text }],\n });\n }\n }\n });\n\n if (runs.length === 0) {\n const selectedText = selection.toString();\n if (selectedText) {\n runs.push({\n type: 'run',\n content: [{ type: 'text', text: selectedText }],\n });\n }\n }\n\n return runs;\n}\n\n/** Create a ClipboardSelection from the current DOM selection. */\nexport function createSelectionFromDOM(): ClipboardSelection | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return null;\n\n const runs = getSelectionRuns();\n if (runs.length === 0) return null;\n\n const text = selection.toString();\n const range = selection.getRangeAt(0);\n const startPara = findParagraphElement(range.startContainer);\n const endPara = findParagraphElement(range.endContainer);\n\n const startParagraphIndex = startPara\n ? parseInt(startPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n const endParagraphIndex = endPara\n ? parseInt(endPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n\n return {\n text,\n runs,\n startParagraphIndex,\n startRunIndex: 0,\n startOffset: range.startOffset,\n endParagraphIndex,\n endRunIndex: 0,\n endOffset: range.endOffset,\n isMultiParagraph: startParagraphIndex !== endParagraphIndex,\n };\n}\n\n// Backwards-compatible alias\nexport const rgbToHex = cssColorToHex;\n","/**\n * ErrorManager\n *\n * Framework-agnostic pub/sub error notification system.\n * Replaces React's `componentDidCatch` + context pattern for error notifications.\n *\n * Usage with React:\n * ```ts\n * const { notifications } = useSyncExternalStore(manager.subscribe, manager.getSnapshot);\n * ```\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { ErrorManagerSnapshot, ErrorNotification, ErrorSeverity } from './types';\n\nexport class ErrorManager extends Subscribable<ErrorManagerSnapshot> {\n private notifications: ErrorNotification[] = [];\n private idCounter = 0;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n\n constructor() {\n super({ notifications: [] });\n }\n\n /** Show an error notification (persistent, not auto-dismissed). */\n showError(message: string, details?: string): string {\n return this.addNotification(message, 'error', details);\n }\n\n /** Show a warning notification (auto-dismissed after 5s). */\n showWarning(message: string, details?: string): string {\n return this.addNotification(message, 'warning', details);\n }\n\n /** Show an info notification (auto-dismissed after 5s). */\n showInfo(message: string, details?: string): string {\n return this.addNotification(message, 'info', details);\n }\n\n /** Dismiss a notification by ID. */\n dismiss(id: string): void {\n this.notifications = this.notifications.map((n) =>\n n.id === id ? { ...n, dismissed: true } : n\n );\n this.emitSnapshot();\n\n // Remove from list after animation delay\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n this.notifications = this.notifications.filter((n) => n.id !== id);\n this.emitSnapshot();\n }, 300);\n this.timers.add(timer);\n }\n\n /** Clear all notifications and cancel pending timers. */\n clearAll(): void {\n this.notifications = [];\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n this.emitSnapshot();\n }\n\n /** Destroy the manager and clean up all timers. */\n destroy(): void {\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n this.notifications = [];\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private addNotification(message: string, severity: ErrorSeverity, details?: string): string {\n const id = `error-${++this.idCounter}-${Date.now()}`;\n const notification: ErrorNotification = {\n id,\n message,\n severity,\n details,\n timestamp: Date.now(),\n };\n\n this.notifications = [...this.notifications, notification];\n this.emitSnapshot();\n\n // Auto-dismiss after 5 seconds for info/warning\n if (severity !== 'error') {\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n this.dismiss(id);\n }, 5000);\n this.timers.add(timer);\n }\n\n return id;\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({ notifications: this.notifications });\n }\n}\n","/**\n * PluginLifecycleManager\n *\n * Framework-agnostic class for managing editor plugin lifecycle.\n * Extracted from React's `PluginHost.tsx`.\n *\n * Handles:\n * - Plugin initialization and state tracking\n * - Plugin state updates via `updateStates()`\n * - Plugin destroy/cleanup\n *\n * Does NOT handle (framework hosts are responsible for):\n * - CSS injection (use the exported `injectStyles` utility)\n * - DOM event listeners / dispatch wrapping\n */\n\nimport type { EditorView } from 'prosemirror-view';\n\nimport { Subscribable } from './Subscribable';\nimport type { PluginLifecycleConfig, PluginLifecycleSnapshot } from './types';\n\n// ============================================================================\n// CSS INJECTION UTILITY\n// ============================================================================\n\n/** Inject CSS styles into the document head. Returns a cleanup function. */\nexport function injectStyles(pluginId: string, css: string): () => void {\n const styleId = `plugin-styles-${pluginId}`;\n\n const existing = document.getElementById(styleId);\n if (existing) {\n existing.remove();\n }\n\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = css;\n document.head.appendChild(style);\n\n return () => {\n const el = document.getElementById(styleId);\n if (el) {\n el.remove();\n }\n };\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class PluginLifecycleManager extends Subscribable<PluginLifecycleSnapshot> {\n private plugins: PluginLifecycleConfig[] = [];\n private pluginStates = new Map<string, unknown>();\n private version = 0;\n\n constructor() {\n super({ states: new Map(), version: 0 });\n }\n\n /**\n * Initialize plugins with an editor view.\n * Calls `plugin.initialize(editorView)` for each plugin.\n *\n * Note: CSS injection and DOM event listeners are the responsibility\n * of the framework-specific host (e.g. React PluginHost).\n */\n initialize(plugins: PluginLifecycleConfig[], editorView: EditorView): void {\n // Clean up previous\n this.destroyPlugins();\n\n this.plugins = plugins;\n\n // Initialize plugin states\n for (const plugin of plugins) {\n if (plugin.initialize && !this.pluginStates.has(plugin.id)) {\n this.pluginStates.set(plugin.id, plugin.initialize(editorView));\n }\n }\n\n this.emitSnapshot();\n }\n\n /**\n * Update all plugin states by calling `onStateChange` on each plugin.\n * Returns true if any plugin state changed.\n */\n updateStates(editorView: EditorView): boolean {\n let anyChanged = false;\n for (const plugin of this.plugins) {\n if (plugin.onStateChange) {\n const newState = plugin.onStateChange(editorView);\n if (newState !== undefined) {\n this.pluginStates.set(plugin.id, newState);\n anyChanged = true;\n }\n }\n }\n\n if (anyChanged) {\n this.version++;\n this.emitSnapshot();\n }\n\n return anyChanged;\n }\n\n /** Get plugin state by ID. */\n getPluginState<T>(pluginId: string): T | undefined {\n return this.pluginStates.get(pluginId) as T | undefined;\n }\n\n /** Set plugin state by ID. */\n setPluginState<T>(pluginId: string, state: T): void {\n this.pluginStates.set(pluginId, state);\n this.version++;\n this.emitSnapshot();\n }\n\n /** Destroy all plugins and clean up. */\n destroy(): void {\n this.destroyPlugins();\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private destroyPlugins(): void {\n // Call plugin destroy\n for (const plugin of this.plugins) {\n if (plugin.destroy) {\n plugin.destroy();\n }\n }\n\n this.pluginStates.clear();\n this.plugins = [];\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({\n states: new Map(this.pluginStates),\n version: this.version,\n });\n }\n}\n","/**\n * LayoutCoordinator\n *\n * Framework-agnostic class coordinating the PM state → layout engine →\n * layout painter → selection overlay pipeline.\n *\n * Extracted from PagedEditor.tsx. Manages:\n * - Layout pipeline state (blocks, measures, layout)\n * - Selection state (selectionRects, caretPosition)\n * - Drag selection state\n * - Column resize state\n * - Image interaction state\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(coordinator.subscribe, coordinator.getSnapshot);\n * ```\n *\n * NOTE: This class defines the state shape and subscription pattern.\n * Full integration with PagedEditor is done incrementally.\n */\n\nimport { Subscribable } from './Subscribable';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Selection rectangle for rendering selection overlays */\nexport interface SelectionRect {\n x: number;\n y: number;\n width: number;\n height: number;\n pageIndex: number;\n}\n\n/** Caret position for rendering the blinking cursor */\nexport interface CaretPosition {\n x: number;\n y: number;\n height: number;\n pageIndex: number;\n}\n\n/** Info about the currently selected/hovered image */\nexport interface ImageSelectionInfo {\n pmPos: number;\n pageIndex: number;\n rect: { x: number; y: number; width: number; height: number };\n widthEmu: number;\n heightEmu: number;\n isInline: boolean;\n}\n\n/** Column resize tracking state */\nexport interface ColumnResizeState {\n isResizing: boolean;\n startX: number;\n columnIndex: number;\n tablePmStart: number;\n originalWidths: { left: number; right: number };\n}\n\n/** The full snapshot exposed to UI frameworks */\nexport interface LayoutCoordinatorSnapshot {\n /** Computed page layout, null until first computation */\n hasLayout: boolean;\n /** Selection rectangles for range selection overlay */\n selectionRects: SelectionRect[];\n /** Caret position for cursor overlay */\n caretPosition: CaretPosition | null;\n /** Currently selected/hovered image */\n selectedImageInfo: ImageSelectionInfo | null;\n /** Whether the editor is focused */\n isFocused: boolean;\n /** Whether a text drag is in progress */\n isDragging: boolean;\n /** Whether a column resize is in progress */\n isResizingColumn: boolean;\n /** Whether an image interaction is in progress */\n isImageInteracting: boolean;\n /** Version counter — incremented on every state change */\n version: number;\n}\n\n// ============================================================================\n// COORDINATOR\n// ============================================================================\n\nexport class LayoutCoordinator extends Subscribable<LayoutCoordinatorSnapshot> {\n // Layout pipeline state\n private _hasLayout = false;\n\n // Selection state\n private _selectionRects: SelectionRect[] = [];\n private _caretPosition: CaretPosition | null = null;\n\n // Drag state\n private _isDragging = false;\n private _dragAnchor: number | null = null;\n\n // Column resize state\n private _columnResize: ColumnResizeState = {\n isResizing: false,\n startX: 0,\n columnIndex: 0,\n tablePmStart: 0,\n originalWidths: { left: 0, right: 0 },\n };\n\n // Image interaction state\n private _selectedImageInfo: ImageSelectionInfo | null = null;\n private _isImageInteracting = false;\n\n // Focus state\n private _isFocused = false;\n\n // Version counter for fine-grained change tracking\n private _version = 0;\n\n constructor() {\n super({\n hasLayout: false,\n selectionRects: [],\n caretPosition: null,\n selectedImageInfo: null,\n isFocused: false,\n isDragging: false,\n isResizingColumn: false,\n isImageInteracting: false,\n version: 0,\n });\n }\n\n // --------------------------------------------------------------------------\n // LAYOUT PIPELINE\n // --------------------------------------------------------------------------\n\n /** Notify that layout has been computed. */\n setLayoutReady(hasLayout: boolean): void {\n this._hasLayout = hasLayout;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // SELECTION STATE\n // --------------------------------------------------------------------------\n\n /** Update selection rectangles and caret position. */\n updateSelection(selectionRects: SelectionRect[], caretPosition: CaretPosition | null): void {\n this._selectionRects = selectionRects;\n this._caretPosition = caretPosition;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // DRAG SELECTION\n // --------------------------------------------------------------------------\n\n /** Start a drag selection from the given PM anchor position. */\n startDrag(anchor: number): void {\n this._isDragging = true;\n this._dragAnchor = anchor;\n this.emitSnapshot();\n }\n\n /** End drag selection. */\n endDrag(): void {\n this._isDragging = false;\n this._dragAnchor = null;\n this.emitSnapshot();\n }\n\n /** Get the drag anchor position. */\n getDragAnchor(): number | null {\n return this._dragAnchor;\n }\n\n // --------------------------------------------------------------------------\n // COLUMN RESIZE\n // --------------------------------------------------------------------------\n\n /** Start resizing a table column. */\n startColumnResize(\n tablePmStart: number,\n columnIndex: number,\n startX: number,\n originalWidths: { left: number; right: number }\n ): void {\n this._columnResize = {\n isResizing: true,\n startX,\n columnIndex,\n tablePmStart,\n originalWidths,\n };\n this.emitSnapshot();\n }\n\n /** End column resize. */\n endColumnResize(): void {\n this._columnResize = {\n ...this._columnResize,\n isResizing: false,\n };\n this.emitSnapshot();\n }\n\n /** Get current column resize state. */\n getColumnResize(): ColumnResizeState {\n return this._columnResize;\n }\n\n // --------------------------------------------------------------------------\n // IMAGE INTERACTION\n // --------------------------------------------------------------------------\n\n /** Set the currently selected image. */\n setSelectedImage(imageInfo: ImageSelectionInfo | null): void {\n this._selectedImageInfo = imageInfo;\n this.emitSnapshot();\n }\n\n /** Clear the image selection. */\n clearSelectedImage(): void {\n this._selectedImageInfo = null;\n this._isImageInteracting = false;\n this.emitSnapshot();\n }\n\n /** Set whether an image interaction (resize/move) is in progress. */\n setImageInteracting(interacting: boolean): void {\n this._isImageInteracting = interacting;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // FOCUS\n // --------------------------------------------------------------------------\n\n /** Update focus state. */\n setFocused(focused: boolean): void {\n this._isFocused = focused;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private emitSnapshot(): void {\n this._version++;\n this.setSnapshot({\n hasLayout: this._hasLayout,\n selectionRects: this._selectionRects,\n caretPosition: this._caretPosition,\n selectedImageInfo: this._selectedImageInfo,\n isFocused: this._isFocused,\n isDragging: this._isDragging,\n isResizingColumn: this._columnResize.isResizing,\n isImageInteracting: this._isImageInteracting,\n version: this._version,\n });\n }\n}\n","/**\n * EditorCoordinator\n *\n * Framework-agnostic class managing the document editor lifecycle:\n * - Document parsing and loading\n * - Font loading coordination\n * - Zoom level management\n * - Extension manager initialization\n * - Agent command execution\n *\n * Extracted from DocxEditor.tsx.\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(coordinator.subscribe, coordinator.getSnapshot);\n * ```\n *\n * NOTE: This class defines the state shape and coordination logic.\n * Full integration with DocxEditor is done incrementally.\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { Document } from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Editor loading state */\nexport type EditorLoadingState = 'idle' | 'parsing' | 'loading-fonts' | 'ready' | 'error';\n\n/** Configuration for EditorCoordinator */\nexport interface EditorCoordinatorOptions {\n /** Initial zoom level (default: 1.0) */\n initialZoom?: number;\n /** Callback when the document changes */\n onChange?: (document: Document) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n}\n\n/** The full snapshot exposed to UI frameworks */\nexport interface EditorCoordinatorSnapshot {\n /** Current loading state */\n loadingState: EditorLoadingState;\n /** Error message if loadingState is 'error' */\n parseError: string | null;\n /** Whether the editor is ready for interaction */\n isReady: boolean;\n /** Current zoom level (1.0 = 100%) */\n zoom: number;\n /** Whether fonts have been loaded */\n fontsLoaded: boolean;\n /** Version counter */\n version: number;\n}\n\n// ============================================================================\n// COORDINATOR\n// ============================================================================\n\nexport class EditorCoordinator extends Subscribable<EditorCoordinatorSnapshot> {\n private _loadingState: EditorLoadingState = 'idle';\n private _parseError: string | null = null;\n private _zoom: number;\n private _fontsLoaded = false;\n private _document: Document | null = null;\n private _version = 0;\n\n private onChangeCallback?: (document: Document) => void;\n private onErrorCallback?: (error: Error) => void;\n\n constructor(options: EditorCoordinatorOptions = {}) {\n const zoom = options.initialZoom ?? 1.0;\n super({\n loadingState: 'idle',\n parseError: null,\n isReady: false,\n zoom,\n fontsLoaded: false,\n version: 0,\n });\n\n this._zoom = zoom;\n this.onChangeCallback = options.onChange;\n this.onErrorCallback = options.onError;\n }\n\n // --------------------------------------------------------------------------\n // DOCUMENT LIFECYCLE\n // --------------------------------------------------------------------------\n\n /** Signal that document parsing has started. */\n setParsingStarted(): void {\n this._loadingState = 'parsing';\n this._parseError = null;\n this.emitSnapshot();\n }\n\n /** Signal that document parsing completed successfully. */\n setDocumentLoaded(document: Document): void {\n this._document = document;\n this._loadingState = 'loading-fonts';\n this._parseError = null;\n this.emitSnapshot();\n }\n\n /** Signal that font loading completed. */\n setFontsLoaded(): void {\n this._fontsLoaded = true;\n this._loadingState = 'ready';\n this.emitSnapshot();\n }\n\n /** Signal that an error occurred during loading. */\n setLoadError(error: Error): void {\n this._loadingState = 'error';\n this._parseError = error.message;\n this.onErrorCallback?.(error);\n this.emitSnapshot();\n }\n\n /** Get the current document. */\n getDocument(): Document | null {\n return this._document;\n }\n\n /** Update the document (after edits). */\n updateDocument(document: Document): void {\n this._document = document;\n this.onChangeCallback?.(document);\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // ZOOM\n // --------------------------------------------------------------------------\n\n /** Set the zoom level (1.0 = 100%). */\n setZoom(zoom: number): void {\n this._zoom = Math.max(0.25, Math.min(4.0, zoom));\n this.emitSnapshot();\n }\n\n /** Get the current zoom level. */\n getZoom(): number {\n return this._zoom;\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private emitSnapshot(): void {\n this._version++;\n this.setSnapshot({\n loadingState: this._loadingState,\n parseError: this._parseError,\n isReady: this._loadingState === 'ready',\n zoom: this._zoom,\n fontsLoaded: this._fontsLoaded,\n version: this._version,\n });\n }\n}\n","/**\n * @eigenpal/docx-js-editor/core\n *\n * Core entry point — types, parser, serializer, and utilities.\n * No React or ProseMirror dependencies.\n *\n * @example\n * ```ts\n * import { parseDocx, serializeDocx, resolveColor } from '@eigenpal/docx-js-editor/core';\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from './docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from './docx/serializer/documentSerializer';\nexport { repackDocx, createDocx } from './docx/rezip';\n\n// ============================================================================\n// TEMPLATE PROCESSING\n// ============================================================================\n\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n getTemplateTags,\n validateTemplate,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n} from './utils/processTemplate';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from './utils/createDocument';\n\n// ============================================================================\n// AGENT API\n// ============================================================================\n\nexport { DocumentAgent } from './agent/DocumentAgent';\nexport { executeCommand, executeCommands } from './agent/executor';\nexport { getAgentContext, getDocumentSummary, type AgentContextOptions } from './agent/context';\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n} from './agent/selectionContext';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from './utils/units';\n\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from './utils/colorResolver';\n\nexport {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n type InsertPosition,\n} from './utils/insertOperations';\n\nexport { type DocxInput, toArrayBuffer } from './utils/docxInput';\n\n// ============================================================================\n// FONT LOADER\n// ============================================================================\n\nexport {\n loadFont,\n loadFonts,\n loadFontFromBuffer,\n isFontLoaded,\n isLoading as isFontsLoading,\n getLoadedFonts,\n onFontsLoaded,\n canRenderFont,\n preloadCommonFonts,\n} from './utils/fontLoader';\n\n// ============================================================================\n// VARIABLE DETECTION\n// ============================================================================\n\nexport {\n detectVariables,\n detectVariablesDetailed,\n detectVariablesInBody,\n detectVariablesInParagraph,\n extractVariablesFromText,\n hasTemplateVariables,\n isValidVariableName,\n sanitizeVariableName,\n formatVariable,\n parseVariable,\n replaceVariables,\n removeVariables,\n documentHasVariables,\n type VariableDetectionResult,\n type VariableOccurrence,\n} from './utils/variableDetector';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Shape,\n TextBox,\n Hyperlink,\n BookmarkStart,\n BookmarkEnd,\n Field,\n Theme,\n ThemeColorScheme,\n ThemeFont,\n ThemeFontScheme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n HeaderFooter,\n HeaderReference,\n FooterReference,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from './types/document';\n\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n} from './types/agentApi';\n\n// ============================================================================\n// EDITOR PLUGIN API (Framework-Agnostic)\n// ============================================================================\n\nexport type {\n EditorPluginCore,\n PluginPanelProps,\n PanelConfig,\n RenderedDomContext,\n PositionCoordinates,\n} from './plugin-api/types';\n\n// ============================================================================\n// CORE PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n docxtemplaterPlugin,\n type CorePlugin,\n type McpToolDefinition,\n type McpToolHandler,\n type McpToolResult,\n type McpSession,\n} from './core-plugins';\n\n// ============================================================================\n// MANAGER CLASSES (Framework-Agnostic Business Logic)\n// ============================================================================\n\nexport {\n // Base class\n Subscribable,\n // Manager classes\n AutoSaveManager,\n TableSelectionManager,\n ErrorManager,\n PluginLifecycleManager,\n // AutoSave utilities\n formatLastSaveTime,\n getAutoSaveStatusLabel,\n getAutoSaveStorageSize,\n formatStorageSize,\n isAutoSaveSupported,\n // TableSelection utilities\n TABLE_DATA_ATTRIBUTES,\n findTableFromClick,\n getTableFromDocument,\n updateTableInDocument,\n deleteTableFromDocument,\n // Clipboard utilities\n getSelectionRuns,\n createSelectionFromDOM,\n extractFormattingFromElement,\n rgbToHex,\n // PluginLifecycle utilities\n injectStyles,\n // Coordinators\n LayoutCoordinator,\n EditorCoordinator,\n} from './managers';\n\nexport type {\n // EditorHandle interface\n EditorHandle,\n // AutoSave types\n AutoSaveStatus,\n AutoSaveManagerOptions,\n SavedDocumentData,\n AutoSaveSnapshot,\n // TableSelection types\n CellCoordinates,\n TableSelectionSnapshot,\n // Error types\n ErrorSeverity,\n ErrorNotification,\n ErrorManagerSnapshot,\n // Plugin types\n PluginLifecycleConfig,\n PluginLifecycleSnapshot,\n // Clipboard types\n ClipboardSelection,\n // LayoutCoordinator types\n SelectionRect,\n CaretPosition,\n ImageSelectionInfo,\n ColumnResizeState,\n LayoutCoordinatorSnapshot,\n // EditorCoordinator types\n EditorLoadingState,\n EditorCoordinatorOptions,\n EditorCoordinatorSnapshot,\n} from './managers';\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {d as d$1}from'./chunk-Y6VCTLCJ.js';function E(){return {type:"break",breakType:"page"}}function X(){return {type:"break",breakType:"column"}}function j(t){return {type:"break",breakType:"textWrapping",clear:t}}function Z(){return {type:"run",content:[E()]}}function R(){return {type:"paragraph",content:[],formatting:{pageBreakBefore:true}}}function I(t){return t.content.filter(n=>n.type==="run")}function q(t,n){let{paragraphIndex:e}=n,o=[...t.package.document.content||[]],r=R();return o.splice(e+1,0,r),{...t,package:{...t.package,document:{...t.package.document,content:o}}}}function k(){return {type:"paragraph",content:[],formatting:{borders:{bottom:{style:"single",color:{rgb:"000000"},size:12,space:1}},spaceBefore:120,spaceAfter:120}}}function G(t,n){let{paragraphIndex:e}=n,o=[...t.package.document.content||[]],r=k();return o.splice(e+1,0,r),{...t,package:{...t.package,document:{...t.package.document,content:o}}}}function d(t){return t.type==="break"&&t.breakType==="page"}function Y(t){return t.type==="break"&&t.breakType==="column"}function Q(t){return t.type==="break"&&t.breakType==="textWrapping"}function ee(t){return t.type==="break"}function g(t){return t.formatting?.pageBreakBefore===true}function te(t){let n=0;for(let e of t.package.document.content||[])if(e.type==="paragraph"){let o=e;g(o)&&n++;let r=I(o);for(let a of r)for(let s of a.content)d(s)&&n++;}return n}function ne(t){let n=[],e=t.package.document.content||[];for(let o=0;o<e.length;o++){let r=e[o];if(r.type==="paragraph"){let a=r;g(a)&&n.push({paragraphIndex:o});let s=I(a);for(let l=0;l<s.length;l++){let c=s[l];for(let p of c.content)d(p)&&n.push({paragraphIndex:o,runIndex:l});}}}return n}function oe(t,n){let{paragraphIndex:e,runIndex:o}=n,r=[...t.package.document.content||[]],a=r[e];if(a.type!=="paragraph")return t;let s=a;if(g(s)&&o===void 0)return r[e]={...s,formatting:{...s.formatting,pageBreakBefore:false}},{...t,package:{...t.package,document:{...t.package.document,content:r}}};if(o!==void 0){let l=[],c=0;for(let p of s.content)if(p.type==="run"){if(c===o){let D=p.content.filter(K=>!d(K));D.length>0&&l.push({...p,content:D});}else l.push(p);c++;}else l.push(p);return r[e]={...s,content:l},{...t,package:{...t.package,document:{...t.package.document,content:r}}}}return t}var u=class{constructor(n){d$1(this,"listeners",new Set);d$1(this,"snapshot");d$1(this,"subscribe",n=>(this.listeners.add(n),()=>{this.listeners.delete(n);}));d$1(this,"getSnapshot",()=>this.snapshot);this.snapshot=n;}setSnapshot(n){this.snapshot=n,this.notify();}notify(){for(let n of this.listeners)n();}};var A="docx-editor-autosave",re=3e4,ae=1440*60*1e3,ie=2e3,P=1;function L(){try{let t="__docx_editor_test__";return localStorage.setItem(t,"test"),localStorage.removeItem(t),!0}catch{return false}}function _(t){return JSON.stringify({...t,originalBuffer:null})}function se(t){try{let n=JSON.parse(t);return !n||typeof n!="object"||!n.document||!n.savedAt?null:(n.version!==P&&console.warn("Auto-save data version mismatch, may need migration"),n)}catch{return null}}function le(t,n){let e=new Date(t).getTime();return Date.now()-e>n}var h=class extends u{constructor(e={}){super({status:"idle",lastSaveTime:null,hasRecoveryData:false,isEnabled:true});d$1(this,"storageKey");d$1(this,"interval");d$1(this,"maxAge");d$1(this,"saveOnChange");d$1(this,"debounceDelay");d$1(this,"onSaveCallback");d$1(this,"onErrorCallback");d$1(this,"onRecoveryAvailableCallback");d$1(this,"storageAvailable");d$1(this,"currentDocument",null);d$1(this,"lastSavedJson",null);d$1(this,"intervalTimer",null);d$1(this,"debounceTimer",null);d$1(this,"status","idle");d$1(this,"lastSaveTime",null);d$1(this,"_hasRecoveryData",false);d$1(this,"_isEnabled");this.storageKey=e.storageKey??A,this.interval=e.interval??re,this.maxAge=e.maxAge??ae,this.saveOnChange=e.saveOnChange??true,this.debounceDelay=e.debounceDelay??ie,this.onSaveCallback=e.onSave,this.onErrorCallback=e.onError,this.onRecoveryAvailableCallback=e.onRecoveryAvailable,this._isEnabled=true,this.storageAvailable=L(),this.checkRecoveryData();}onDocumentChanged(e){this.currentDocument=e,this._isEnabled&&this.saveOnChange&&e&&this.storageAvailable&&this.debounceSave();}async save(){if(!this.storageAvailable)return this.onErrorCallback?.(new Error("localStorage is not available")),false;let e=this.currentDocument;if(!e)return false;this.updateStatus("saving");try{let o=_(e);if(o===this.lastSavedJson)return this.updateStatus("saved"),!0;this.persistToStorage(o),this.lastSavedJson=o;let r=new Date;return this.lastSaveTime=r,this.updateStatus("saved"),this.onSaveCallback?.(r),!0}catch(o){return console.error("Auto-save failed:",o),this.updateStatus("error"),this.onErrorCallback?.(o),false}}clear(){if(this.storageAvailable)try{localStorage.removeItem(this.storageKey),this._hasRecoveryData=!1,this.lastSavedJson=null,this.emitSnapshot();}catch(e){console.error("Failed to clear auto-save:",e);}}getRecoveryData(){if(!this.storageAvailable)return null;try{let e=localStorage.getItem(this.storageKey);if(!e)return null;let o=se(e);return o?le(o.savedAt,this.maxAge)?(this.clear(),null):o:null}catch{return null}}acceptRecovery(){let e=this.getRecoveryData();return e?(this._hasRecoveryData=false,this.emitSnapshot(),e.document):null}dismissRecovery(){this.clear(),this._hasRecoveryData=false,this.emitSnapshot();}enable(){this._isEnabled=true,this.startInterval(),this.emitSnapshot();}disable(){this._isEnabled=false,this.stopTimers(),this.emitSnapshot();}startInterval(){this.stopTimers(),!(!this._isEnabled||!this.storageAvailable)&&(this.intervalTimer=setInterval(()=>{this.save();},this.interval));}destroy(){if(this.stopTimers(),this._isEnabled&&this.currentDocument&&this.storageAvailable)try{this.persistToStorage(_(this.currentDocument));}catch(e){console.error("Failed to save on destroy:",e);}}checkRecoveryData(){if(!this.storageAvailable)return;let e=this.getRecoveryData();e&&(this._hasRecoveryData=true,this.emitSnapshot(),this.onRecoveryAvailableCallback?.(e));}persistToStorage(e){let o={document:JSON.parse(e),savedAt:new Date().toISOString(),version:P};localStorage.setItem(this.storageKey,JSON.stringify(o));}debounceSave(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.save();},this.debounceDelay);}stopTimers(){this.intervalTimer&&(clearInterval(this.intervalTimer),this.intervalTimer=null),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null);}updateStatus(e){this.status=e,this.emitSnapshot();}emitSnapshot(){this.setSnapshot({status:this.status,lastSaveTime:this.lastSaveTime,hasRecoveryData:this._hasRecoveryData,isEnabled:this._isEnabled});}};function B(t){if(!t)return "Never";let e=new Date().getTime()-t.getTime(),o=Math.floor(e/1e3),r=Math.floor(o/60),a=Math.floor(r/60);return o<10?"Just now":o<60?`${o} seconds ago`:r<60?`${r} minute${r===1?"":"s"} ago`:a<24?`${a} hour${a===1?"":"s"} ago`:t.toLocaleDateString()}function F(t){return {idle:"Ready",saving:"Saving...",saved:"Saved",error:"Save failed"}[t]}function z(t=A){try{let n=localStorage.getItem(t);return n?new Blob([n]).size:0}catch{return 0}}function w(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function N(){return L()}var m={TABLE_INDEX:"data-table-index",ROW_INDEX:"data-row",COLUMN_INDEX:"data-col",TABLE_CELL:"data-table-cell"};function O(t,n){if(!(t instanceof Element))return null;let e=t;for(;e&&e!==n;){if(e.tagName==="TD"||e.tagName==="TH"){let o=e.getAttribute(m.ROW_INDEX),r=e.getAttribute(m.COLUMN_INDEX);if(o!==null&&r!==null){let a=e;for(;a&&a!==n;){if(a.tagName==="TABLE"){let s=a.getAttribute(m.TABLE_INDEX);if(s!==null)return {tableIndex:parseInt(s,10),rowIndex:parseInt(o,10),columnIndex:parseInt(r,10)};break}a=a.parentElement;}}break}e=e.parentElement;}return null}function M(t,n){if(!t.package?.document?.content)return null;let e=0;for(let o of t.package.document.content)if(o.type==="table"){if(e===n)return o;e++;}return null}function H(t,n,e){if(!t.package?.document?.content)return t;let o=0,r=t.package.document.content.map(a=>{if(a.type==="table"){if(o===n)return o++,e;o++;}return a});return {...t,package:{...t.package,document:{...t.package.document,content:r}}}}function V(t,n){if(!t.package?.document?.content)return t;let e=0,o=t.package.document.content.filter(r=>{if(r.type==="table"){let a=e===n;return e++,!a}return true});return {...t,package:{...t.package,document:{...t.package.document,content:o}}}}var f=class extends u{constructor(){super({selectedCell:null});}selectCell(n){this.setSnapshot({selectedCell:n});}clearSelection(){this.setSnapshot({selectedCell:null});}isCellSelected(n,e,o){let{selectedCell:r}=this.getSnapshot();return r?r.tableIndex===n&&r.rowIndex===e&&r.columnIndex===o:false}getSelectedCell(){return this.getSnapshot().selectedCell}};function W(t){if(!t||t==="transparent"||t==="inherit")return null;if(t.startsWith("#"))return t.slice(1).toUpperCase();let n=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(n){let e=parseInt(n[1]).toString(16).padStart(2,"0"),o=parseInt(n[2]).toString(16).padStart(2,"0"),r=parseInt(n[3]).toString(16).padStart(2,"0");return (e+o+r).toUpperCase()}return null}function x(t){let n=window.getComputedStyle(t),e={};(n.fontWeight==="bold"||parseInt(n.fontWeight)>=700)&&(e.bold=true),n.fontStyle==="italic"&&(e.italic=true);let o=n.textDecoration||n.textDecorationLine;o&&o.includes("underline")&&(e.underline={style:"single"}),o&&o.includes("line-through")&&(e.strike=true);let r=parseFloat(n.fontSize);!isNaN(r)&&r>0&&(e.fontSize=Math.round(r/1.333*2));let a=n.fontFamily.replace(/["']/g,"").split(",")[0].trim();a&&(e.fontFamily={ascii:a});let s=n.color;if(s&&s!=="rgb(0, 0, 0)"){let c=W(s);c&&(e.color={rgb:c});}let l=n.backgroundColor;if(l&&l!=="transparent"&&l!=="rgba(0, 0, 0, 0)"){let c=T(l);c&&(e.shading={fill:{rgb:c}});}return Object.keys(e).length>0?e:void 0}function ue(t,n){let e=document.createRange();e.selectNodeContents(t);let o=n.compareBoundaryPoints(Range.START_TO_START,e)>=0&&n.compareBoundaryPoints(Range.START_TO_END,e)<=0,r=n.compareBoundaryPoints(Range.END_TO_START,e)>=0&&n.compareBoundaryPoints(Range.END_TO_END,e)<=0;if(o&&r)return n.toString();if(o){let a=document.createRange();return a.setStart(n.startContainer,n.startOffset),a.selectNodeContents(t),a.setEnd(e.endContainer,e.endOffset),a.toString()}else if(r){let a=document.createRange();return a.selectNodeContents(t),a.setEnd(n.endContainer,n.endOffset),a.setStart(e.startContainer,e.startOffset),a.toString()}else if(n.intersectsNode(t))return t.textContent||"";return ""}function U(t){let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE){let e=n;if(e.hasAttribute("data-paragraph-index"))return e}n=n.parentNode;}return null}function C(){let t=window.getSelection();if(!t||t.isCollapsed)return [];let n=[],e=t.getRangeAt(0),o=e.commonAncestorContainer,r=o.nodeType===Node.ELEMENT_NODE?o:o.parentElement;if(!r)return n;if(r.querySelectorAll(".docx-run").forEach(s=>{if(e.intersectsNode(s)){let l=ue(s,e);if(l){let c=x(s);n.push({type:"run",formatting:c,content:[{type:"text",text:l}]});}}}),n.length===0){let s=t.toString();s&&n.push({type:"run",content:[{type:"text",text:s}]});}return n}function $(){let t=window.getSelection();if(!t||t.isCollapsed)return null;let n=C();if(n.length===0)return null;let e=t.toString(),o=t.getRangeAt(0),r=U(o.startContainer),a=U(o.endContainer),s=r?parseInt(r.getAttribute("data-paragraph-index")||"0",10):0,l=a?parseInt(a.getAttribute("data-paragraph-index")||"0",10):0;return {text:e,runs:n,startParagraphIndex:s,startRunIndex:0,startOffset:o.startOffset,endParagraphIndex:l,endRunIndex:0,endOffset:o.endOffset,isMultiParagraph:s!==l}}var T=W;var S=class extends u{constructor(){super({notifications:[]});d$1(this,"notifications",[]);d$1(this,"idCounter",0);d$1(this,"timers",new Set);}showError(e,o){return this.addNotification(e,"error",o)}showWarning(e,o){return this.addNotification(e,"warning",o)}showInfo(e,o){return this.addNotification(e,"info",o)}dismiss(e){this.notifications=this.notifications.map(r=>r.id===e?{...r,dismissed:true}:r),this.emitSnapshot();let o=setTimeout(()=>{this.timers.delete(o),this.notifications=this.notifications.filter(r=>r.id!==e),this.emitSnapshot();},300);this.timers.add(o);}clearAll(){this.notifications=[];for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.emitSnapshot();}destroy(){for(let e of this.timers)clearTimeout(e);this.timers.clear(),this.notifications=[];}addNotification(e,o,r){let a=`error-${++this.idCounter}-${Date.now()}`,s={id:a,message:e,severity:o,details:r,timestamp:Date.now()};if(this.notifications=[...this.notifications,s],this.emitSnapshot(),o!=="error"){let l=setTimeout(()=>{this.timers.delete(l),this.dismiss(a);},5e3);this.timers.add(l);}return a}emitSnapshot(){this.setSnapshot({notifications:this.notifications});}};function J(t,n){let e=`plugin-styles-${t}`,o=document.getElementById(e);o&&o.remove();let r=document.createElement("style");return r.id=e,r.textContent=n,document.head.appendChild(r),()=>{let a=document.getElementById(e);a&&a.remove();}}var v=class extends u{constructor(){super({states:new Map,version:0});d$1(this,"plugins",[]);d$1(this,"pluginStates",new Map);d$1(this,"version",0);}initialize(e,o){this.destroyPlugins(),this.plugins=e;for(let r of e)r.initialize&&!this.pluginStates.has(r.id)&&this.pluginStates.set(r.id,r.initialize(o));this.emitSnapshot();}updateStates(e){let o=false;for(let r of this.plugins)if(r.onStateChange){let a=r.onStateChange(e);a!==void 0&&(this.pluginStates.set(r.id,a),o=true);}return o&&(this.version++,this.emitSnapshot()),o}getPluginState(e){return this.pluginStates.get(e)}setPluginState(e,o){this.pluginStates.set(e,o),this.version++,this.emitSnapshot();}destroy(){this.destroyPlugins(),this.emitSnapshot();}destroyPlugins(){for(let e of this.plugins)e.destroy&&e.destroy();this.pluginStates.clear(),this.plugins=[];}emitSnapshot(){this.setSnapshot({states:new Map(this.pluginStates),version:this.version});}};var b=class extends u{constructor(){super({hasLayout:false,selectionRects:[],caretPosition:null,selectedImageInfo:null,isFocused:false,isDragging:false,isResizingColumn:false,isImageInteracting:false,version:0});d$1(this,"_hasLayout",false);d$1(this,"_selectionRects",[]);d$1(this,"_caretPosition",null);d$1(this,"_isDragging",false);d$1(this,"_dragAnchor",null);d$1(this,"_columnResize",{isResizing:false,startX:0,columnIndex:0,tablePmStart:0,originalWidths:{left:0,right:0}});d$1(this,"_selectedImageInfo",null);d$1(this,"_isImageInteracting",false);d$1(this,"_isFocused",false);d$1(this,"_version",0);}setLayoutReady(e){this._hasLayout=e,this.emitSnapshot();}updateSelection(e,o){this._selectionRects=e,this._caretPosition=o,this.emitSnapshot();}startDrag(e){this._isDragging=true,this._dragAnchor=e,this.emitSnapshot();}endDrag(){this._isDragging=false,this._dragAnchor=null,this.emitSnapshot();}getDragAnchor(){return this._dragAnchor}startColumnResize(e,o,r,a){this._columnResize={isResizing:true,startX:r,columnIndex:o,tablePmStart:e,originalWidths:a},this.emitSnapshot();}endColumnResize(){this._columnResize={...this._columnResize,isResizing:false},this.emitSnapshot();}getColumnResize(){return this._columnResize}setSelectedImage(e){this._selectedImageInfo=e,this.emitSnapshot();}clearSelectedImage(){this._selectedImageInfo=null,this._isImageInteracting=false,this.emitSnapshot();}setImageInteracting(e){this._isImageInteracting=e,this.emitSnapshot();}setFocused(e){this._isFocused=e,this.emitSnapshot();}emitSnapshot(){this._version++,this.setSnapshot({hasLayout:this._hasLayout,selectionRects:this._selectionRects,caretPosition:this._caretPosition,selectedImageInfo:this._selectedImageInfo,isFocused:this._isFocused,isDragging:this._isDragging,isResizingColumn:this._columnResize.isResizing,isImageInteracting:this._isImageInteracting,version:this._version});}};var y=class extends u{constructor(e={}){let o=e.initialZoom??1;super({loadingState:"idle",parseError:null,isReady:false,zoom:o,fontsLoaded:false,version:0});d$1(this,"_loadingState","idle");d$1(this,"_parseError",null);d$1(this,"_zoom");d$1(this,"_fontsLoaded",false);d$1(this,"_document",null);d$1(this,"_version",0);d$1(this,"onChangeCallback");d$1(this,"onErrorCallback");this._zoom=o,this.onChangeCallback=e.onChange,this.onErrorCallback=e.onError;}setParsingStarted(){this._loadingState="parsing",this._parseError=null,this.emitSnapshot();}setDocumentLoaded(e){this._document=e,this._loadingState="loading-fonts",this._parseError=null,this.emitSnapshot();}setFontsLoaded(){this._fontsLoaded=true,this._loadingState="ready",this.emitSnapshot();}setLoadError(e){this._loadingState="error",this._parseError=e.message,this.onErrorCallback?.(e),this.emitSnapshot();}getDocument(){return this._document}updateDocument(e){this._document=e,this.onChangeCallback?.(e),this.emitSnapshot();}setZoom(e){this._zoom=Math.max(.25,Math.min(4,e)),this.emitSnapshot();}getZoom(){return this._zoom}emitSnapshot(){this._version++,this.setSnapshot({loadingState:this._loadingState,parseError:this._parseError,isReady:this._loadingState==="ready",zoom:this._zoom,fontsLoaded:this._fontsLoaded,version:this._version});}};var nn="0.0.2";export{H as A,V as B,f as C,x as D,C as E,$ as F,T as G,S as H,J as I,v as J,b as K,y as L,nn as M,E as a,X as b,j as c,Z as d,R as e,q as f,k as g,G as h,d as i,Y as j,Q as k,ee as l,g as m,te as n,ne as o,oe as p,u as q,h as r,B as s,F as t,z as u,w as v,N as w,m as x,O as y,M as z};//# sourceMappingURL=chunk-FGVGZLBL.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-FGVGZLBL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/utils/insertOperations.ts","../../core/src/managers/Subscribable.ts","../../core/src/managers/AutoSaveManager.ts","../../core/src/managers/TableSelectionManager.ts","../../core/src/managers/ClipboardManager.ts","../../core/src/managers/ErrorManager.ts","../../core/src/managers/PluginLifecycleManager.ts","../../core/src/managers/LayoutCoordinator.ts","../../core/src/managers/EditorCoordinator.ts","../../core/src/core.ts"],"names":["createPageBreak","createColumnBreak","createLineBreak","clear","createPageBreakRun","createPageBreakParagraph","getParagraphRuns","paragraph","item","insertPageBreak","doc","position","paragraphIndex","content","pageBreakParagraph","createHorizontalRule","insertHorizontalRule","hrParagraph","isPageBreak","isColumnBreak","isLineBreak","isBreakContent","hasPageBreakBefore","countPageBreaks","count","block","runs","run","findPageBreaks","positions","runIndex","runContent","removePageBreak","newParagraphContent","currentRunIndex","newRunContent","c","Subscribable","initialSnapshot","__publicField","listener","snapshot","DEFAULT_STORAGE_KEY","DEFAULT_INTERVAL","DEFAULT_MAX_AGE","DEFAULT_DEBOUNCE_DELAY","SAVE_VERSION","isLocalStorageAvailable","testKey","serializeForStorage","document","parseSavedData","json","data","isStale","savedAt","maxAge","savedTime","AutoSaveManager","options","serialized","saveTime","error","savedJson","savedData","dataToSave","status","formatLastSaveTime","date","diffMs","diffSec","diffMin","diffHour","getAutoSaveStatusLabel","getAutoSaveStorageSize","storageKey","formatStorageSize","bytes","isAutoSaveSupported","TABLE_DATA_ATTRIBUTES","findTableFromClick","target","container","current","rowAttr","colAttr","tableElement","tableIndexAttr","getTableFromDocument","tableIndex","currentTableIndex","updateTableInDocument","newTable","newContent","deleteTableFromDocument","shouldDelete","TableSelectionManager","coords","rowIndex","columnIndex","selectedCell","cssColorToHex","color","rgbMatch","r","g","b","extractFormattingFromElement","element","style","formatting","textDecoration","fontSize","fontFamily","hex","bgColor","rgbToHex","getSelectedTextFromRun","runEl","range","runRange","startInRun","endInRun","tempRange","findParagraphElement","node","getSelectionRuns","selection","containerElement","text","selectedText","createSelectionFromDOM","startPara","endPara","startParagraphIndex","endParagraphIndex","ErrorManager","message","details","id","n","timer","severity","notification","injectStyles","pluginId","css","styleId","existing","el","PluginLifecycleManager","plugins","editorView","plugin","anyChanged","newState","state","LayoutCoordinator","hasLayout","selectionRects","caretPosition","anchor","tablePmStart","startX","originalWidths","imageInfo","interacting","focused","EditorCoordinator","zoom","VERSION"],"mappings":"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","file":"chunk-FGVGZLBL.js","sourcesContent":["/**\n * Insert Operations Utility\n *\n * Utility functions for inserting content into the document.\n * Provides functions for inserting page breaks, horizontal rules, and other elements.\n */\n\nimport type {\n BreakContent,\n Run,\n Paragraph,\n Document,\n ParagraphContent,\n RunContent,\n} from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Insert position in the document\n */\nexport interface InsertPosition {\n /** Paragraph index in the document body */\n paragraphIndex: number;\n /** Run index within the paragraph (optional) */\n runIndex?: number;\n /** Character offset within the run (optional) */\n offset?: number;\n}\n\n// ============================================================================\n// PAGE BREAK\n// ============================================================================\n\n/**\n * Create a page break content element\n */\nexport function createPageBreak(): BreakContent {\n return {\n type: 'break',\n breakType: 'page',\n };\n}\n\n/**\n * Create a column break content element\n */\nexport function createColumnBreak(): BreakContent {\n return {\n type: 'break',\n breakType: 'column',\n };\n}\n\n/**\n * Create a text wrapping break (line break)\n */\nexport function createLineBreak(clear?: 'none' | 'left' | 'right' | 'all'): BreakContent {\n return {\n type: 'break',\n breakType: 'textWrapping',\n clear,\n };\n}\n\n/**\n * Create a run containing a page break\n */\nexport function createPageBreakRun(): Run {\n return {\n type: 'run',\n content: [createPageBreak()],\n };\n}\n\n/**\n * Create an empty paragraph with a page break before it\n */\nexport function createPageBreakParagraph(): Paragraph {\n return {\n type: 'paragraph',\n content: [],\n formatting: {\n pageBreakBefore: true,\n },\n };\n}\n\n/**\n * Get runs from paragraph content\n */\nfunction getParagraphRuns(paragraph: Paragraph): Run[] {\n return paragraph.content.filter((item): item is Run => item.type === 'run');\n}\n\n/**\n * Insert a page break at a position in the document\n * This inserts a new paragraph with pageBreakBefore: true\n */\nexport function insertPageBreak(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex } = position;\n const content = [...(doc.package.document.content || [])];\n\n // Create a new paragraph with page break before\n const pageBreakParagraph = createPageBreakParagraph();\n\n // Insert after the specified paragraph\n content.splice(paragraphIndex + 1, 0, pageBreakParagraph);\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n}\n\n// ============================================================================\n// HORIZONTAL RULE\n// ============================================================================\n\n/**\n * Create a horizontal rule paragraph\n * Uses a paragraph with bottom border to simulate horizontal rule\n */\nexport function createHorizontalRule(): Paragraph {\n return {\n type: 'paragraph',\n content: [],\n formatting: {\n borders: {\n bottom: {\n style: 'single',\n color: { rgb: '000000' },\n size: 12, // 1.5pt\n space: 1,\n },\n },\n spaceBefore: 120, // 6pt\n spaceAfter: 120, // 6pt\n },\n };\n}\n\n/**\n * Insert a horizontal rule at a position in the document\n */\nexport function insertHorizontalRule(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex } = position;\n const content = [...(doc.package.document.content || [])];\n\n // Create a horizontal rule paragraph\n const hrParagraph = createHorizontalRule();\n\n // Insert after the specified paragraph\n content.splice(paragraphIndex + 1, 0, hrParagraph);\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if content is a page break\n */\nexport function isPageBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'page';\n}\n\n/**\n * Check if content is a column break\n */\nexport function isColumnBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'column';\n}\n\n/**\n * Check if content is a line break\n */\nexport function isLineBreak(content: RunContent): boolean {\n return content.type === 'break' && (content as BreakContent).breakType === 'textWrapping';\n}\n\n/**\n * Check if content is any type of break\n */\nexport function isBreakContent(content: RunContent): content is BreakContent {\n return content.type === 'break';\n}\n\n/**\n * Check if a paragraph has pageBreakBefore\n */\nexport function hasPageBreakBefore(paragraph: Paragraph): boolean {\n return paragraph.formatting?.pageBreakBefore === true;\n}\n\n/**\n * Count page breaks in a document\n */\nexport function countPageBreaks(doc: Document): number {\n let count = 0;\n\n for (const block of doc.package.document.content || []) {\n if (block.type === 'paragraph') {\n const paragraph = block as Paragraph;\n\n // Check for pageBreakBefore\n if (hasPageBreakBefore(paragraph)) {\n count++;\n }\n\n // Check for page breaks in runs\n const runs = getParagraphRuns(paragraph);\n for (const run of runs) {\n for (const content of run.content) {\n if (isPageBreak(content)) {\n count++;\n }\n }\n }\n }\n }\n\n return count;\n}\n\n/**\n * Find all page break positions in a document\n */\nexport function findPageBreaks(doc: Document): InsertPosition[] {\n const positions: InsertPosition[] = [];\n\n const content = doc.package.document.content || [];\n for (let paragraphIndex = 0; paragraphIndex < content.length; paragraphIndex++) {\n const block = content[paragraphIndex];\n\n if (block.type === 'paragraph') {\n const paragraph = block as Paragraph;\n\n // Check for pageBreakBefore\n if (hasPageBreakBefore(paragraph)) {\n positions.push({ paragraphIndex });\n }\n\n // Check for page breaks in runs\n const runs = getParagraphRuns(paragraph);\n for (let runIndex = 0; runIndex < runs.length; runIndex++) {\n const run = runs[runIndex];\n for (const runContent of run.content) {\n if (isPageBreak(runContent)) {\n positions.push({ paragraphIndex, runIndex });\n }\n }\n }\n }\n }\n\n return positions;\n}\n\n/**\n * Remove a page break at a specific position\n */\nexport function removePageBreak(doc: Document, position: InsertPosition): Document {\n const { paragraphIndex, runIndex } = position;\n const content = [...(doc.package.document.content || [])];\n const block = content[paragraphIndex];\n\n if (block.type !== 'paragraph') {\n return doc;\n }\n\n const paragraph = block as Paragraph;\n\n // If pageBreakBefore, remove the formatting\n if (hasPageBreakBefore(paragraph) && runIndex === undefined) {\n content[paragraphIndex] = {\n ...paragraph,\n formatting: {\n ...paragraph.formatting,\n pageBreakBefore: false,\n },\n };\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n }\n\n // If page break in run, remove it\n if (runIndex !== undefined) {\n const newParagraphContent: ParagraphContent[] = [];\n let currentRunIndex = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n if (currentRunIndex === runIndex) {\n const newRunContent = item.content.filter((c: RunContent) => !isPageBreak(c));\n\n if (newRunContent.length > 0) {\n newParagraphContent.push({ ...item, content: newRunContent });\n }\n } else {\n newParagraphContent.push(item);\n }\n currentRunIndex++;\n } else {\n newParagraphContent.push(item);\n }\n }\n\n content[paragraphIndex] = { ...paragraph, content: newParagraphContent };\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content,\n },\n },\n };\n }\n\n return doc;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n};\n","/**\n * Subscribable Base Class\n *\n * Framework-agnostic base for manager classes that need to notify\n * UI frameworks of state changes.\n *\n * Compatible with:\n * - React: useSyncExternalStore(manager.subscribe, manager.getSnapshot)\n * - Vue: watchEffect(() => { manager.subscribe(triggerRef) })\n */\n\nexport abstract class Subscribable<TSnapshot> {\n private listeners = new Set<() => void>();\n private snapshot: TSnapshot;\n\n constructor(initialSnapshot: TSnapshot) {\n this.snapshot = initialSnapshot;\n }\n\n /**\n * Subscribe to state changes. Returns an unsubscribe function.\n * Bound method — safe to pass as `useSyncExternalStore(manager.subscribe, ...)`.\n */\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n /**\n * Get the current snapshot. Returns a stable reference unless state has changed.\n * Bound method — safe to pass as `useSyncExternalStore(..., manager.getSnapshot)`.\n */\n getSnapshot = (): TSnapshot => {\n return this.snapshot;\n };\n\n /**\n * Update the snapshot and notify all subscribers.\n * Subclasses should call this whenever their state changes.\n */\n protected setSnapshot(snapshot: TSnapshot): void {\n this.snapshot = snapshot;\n this.notify();\n }\n\n private notify(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","/**\n * AutoSaveManager\n *\n * Framework-agnostic class for auto-saving documents to localStorage.\n * Extracted from the React `useAutoSave` hook.\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(manager.subscribe, manager.getSnapshot);\n * ```\n */\n\nimport { Subscribable } from './Subscribable';\nimport type {\n AutoSaveSnapshot,\n AutoSaveStatus,\n AutoSaveManagerOptions,\n SavedDocumentData,\n} from './types';\nimport type { Document } from '../types/document';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_STORAGE_KEY = 'docx-editor-autosave';\nconst DEFAULT_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours\nconst DEFAULT_DEBOUNCE_DELAY = 2000; // 2 seconds\nconst SAVE_VERSION = 1;\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__docx_editor_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction serializeForStorage(document: Document): string {\n return JSON.stringify({ ...document, originalBuffer: null });\n}\n\nfunction parseSavedData(json: string): SavedDocumentData | null {\n try {\n const data = JSON.parse(json);\n if (!data || typeof data !== 'object') return null;\n if (!data.document || !data.savedAt) return null;\n if (data.version !== SAVE_VERSION) {\n console.warn('Auto-save data version mismatch, may need migration');\n }\n return data as SavedDocumentData;\n } catch {\n return null;\n }\n}\n\nfunction isStale(savedAt: string, maxAge: number): boolean {\n const savedTime = new Date(savedAt).getTime();\n return Date.now() - savedTime > maxAge;\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class AutoSaveManager extends Subscribable<AutoSaveSnapshot> {\n private storageKey: string;\n private interval: number;\n private maxAge: number;\n private saveOnChange: boolean;\n private debounceDelay: number;\n private onSaveCallback?: (timestamp: Date) => void;\n private onErrorCallback?: (error: Error) => void;\n private onRecoveryAvailableCallback?: (saved: SavedDocumentData) => void;\n\n private storageAvailable: boolean;\n private currentDocument: Document | null = null;\n private lastSavedJson: string | null = null;\n private intervalTimer: ReturnType<typeof setInterval> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private status: AutoSaveStatus = 'idle';\n private lastSaveTime: Date | null = null;\n private _hasRecoveryData = false;\n private _isEnabled: boolean;\n\n constructor(options: AutoSaveManagerOptions = {}) {\n super({\n status: 'idle',\n lastSaveTime: null,\n hasRecoveryData: false,\n isEnabled: true,\n });\n\n this.storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n this.interval = options.interval ?? DEFAULT_INTERVAL;\n this.maxAge = options.maxAge ?? DEFAULT_MAX_AGE;\n this.saveOnChange = options.saveOnChange ?? true;\n this.debounceDelay = options.debounceDelay ?? DEFAULT_DEBOUNCE_DELAY;\n this.onSaveCallback = options.onSave;\n this.onErrorCallback = options.onError;\n this.onRecoveryAvailableCallback = options.onRecoveryAvailable;\n this._isEnabled = true;\n this.storageAvailable = isLocalStorageAvailable();\n\n // Check for recovery data\n this.checkRecoveryData();\n }\n\n // --------------------------------------------------------------------------\n // PUBLIC API\n // --------------------------------------------------------------------------\n\n /** Update the current document. Triggers debounced save if enabled. */\n onDocumentChanged(document: Document | null): void {\n this.currentDocument = document;\n\n if (this._isEnabled && this.saveOnChange && document && this.storageAvailable) {\n this.debounceSave();\n }\n }\n\n /** Manually trigger a save. */\n async save(): Promise<boolean> {\n if (!this.storageAvailable) {\n this.onErrorCallback?.(new Error('localStorage is not available'));\n return false;\n }\n\n const doc = this.currentDocument;\n if (!doc) return false;\n\n this.updateStatus('saving');\n\n try {\n const serialized = serializeForStorage(doc);\n\n // Skip if unchanged\n if (serialized === this.lastSavedJson) {\n this.updateStatus('saved');\n return true;\n }\n\n this.persistToStorage(serialized);\n this.lastSavedJson = serialized;\n\n const saveTime = new Date();\n this.lastSaveTime = saveTime;\n this.updateStatus('saved');\n this.onSaveCallback?.(saveTime);\n return true;\n } catch (error) {\n console.error('Auto-save failed:', error);\n this.updateStatus('error');\n this.onErrorCallback?.(error as Error);\n return false;\n }\n }\n\n /** Clear auto-saved data from storage. */\n clear(): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.removeItem(this.storageKey);\n this._hasRecoveryData = false;\n this.lastSavedJson = null;\n this.emitSnapshot();\n } catch (error) {\n console.error('Failed to clear auto-save:', error);\n }\n }\n\n /** Get recovery data from storage. */\n getRecoveryData(): SavedDocumentData | null {\n if (!this.storageAvailable) return null;\n try {\n const savedJson = localStorage.getItem(this.storageKey);\n if (!savedJson) return null;\n\n const savedData = parseSavedData(savedJson);\n if (!savedData) return null;\n\n if (isStale(savedData.savedAt, this.maxAge)) {\n this.clear();\n return null;\n }\n return savedData;\n } catch {\n return null;\n }\n }\n\n /** Accept recovery and return the document. */\n acceptRecovery(): Document | null {\n const data = this.getRecoveryData();\n if (!data) return null;\n this._hasRecoveryData = false;\n this.emitSnapshot();\n return data.document;\n }\n\n /** Dismiss recovery and clear saved data. */\n dismissRecovery(): void {\n this.clear();\n this._hasRecoveryData = false;\n this.emitSnapshot();\n }\n\n /** Enable auto-save and start the interval timer. */\n enable(): void {\n this._isEnabled = true;\n this.startInterval();\n this.emitSnapshot();\n }\n\n /** Disable auto-save and stop all timers. */\n disable(): void {\n this._isEnabled = false;\n this.stopTimers();\n this.emitSnapshot();\n }\n\n /** Start the interval timer. Call after enabling or on init. */\n startInterval(): void {\n this.stopTimers();\n if (!this._isEnabled || !this.storageAvailable) return;\n\n this.intervalTimer = setInterval(() => {\n this.save();\n }, this.interval);\n }\n\n /** Save synchronously on destroy (best-effort). */\n destroy(): void {\n this.stopTimers();\n\n if (this._isEnabled && this.currentDocument && this.storageAvailable) {\n try {\n this.persistToStorage(serializeForStorage(this.currentDocument));\n } catch (error) {\n console.error('Failed to save on destroy:', error);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private checkRecoveryData(): void {\n if (!this.storageAvailable) return;\n const data = this.getRecoveryData();\n if (data) {\n this._hasRecoveryData = true;\n this.emitSnapshot();\n this.onRecoveryAvailableCallback?.(data);\n }\n }\n\n private persistToStorage(serialized: string): void {\n const dataToSave: SavedDocumentData = {\n document: JSON.parse(serialized),\n savedAt: new Date().toISOString(),\n version: SAVE_VERSION,\n };\n localStorage.setItem(this.storageKey, JSON.stringify(dataToSave));\n }\n\n private debounceSave(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n this.save();\n }, this.debounceDelay);\n }\n\n private stopTimers(): void {\n if (this.intervalTimer) {\n clearInterval(this.intervalTimer);\n this.intervalTimer = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private updateStatus(status: AutoSaveStatus): void {\n this.status = status;\n this.emitSnapshot();\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({\n status: this.status,\n lastSaveTime: this.lastSaveTime,\n hasRecoveryData: this._hasRecoveryData,\n isEnabled: this._isEnabled,\n });\n }\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS (re-exported as-is from the old hook)\n// ============================================================================\n\n/** Format last save time for display */\nexport function formatLastSaveTime(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n\n if (diffSec < 10) return 'Just now';\n if (diffSec < 60) return `${diffSec} seconds ago`;\n if (diffMin < 60) return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour === 1 ? '' : 's'} ago`;\n\n return date.toLocaleDateString();\n}\n\n/** Get auto-save status label */\nexport function getAutoSaveStatusLabel(status: AutoSaveStatus): string {\n const labels: Record<AutoSaveStatus, string> = {\n idle: 'Ready',\n saving: 'Saving...',\n saved: 'Saved',\n error: 'Save failed',\n };\n return labels[status];\n}\n\n/** Get storage size used by auto-save */\nexport function getAutoSaveStorageSize(storageKey: string = DEFAULT_STORAGE_KEY): number {\n try {\n const data = localStorage.getItem(storageKey);\n if (!data) return 0;\n return new Blob([data]).size;\n } catch {\n return 0;\n }\n}\n\n/** Format storage size for display */\nexport function formatStorageSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Check if auto-save is supported */\nexport function isAutoSaveSupported(): boolean {\n return isLocalStorageAvailable();\n}\n","/**\n * TableSelectionManager\n *\n * Framework-agnostic class for managing table cell selection state.\n * Extracted from the React `useTableSelection` hook.\n *\n * Handles:\n * - Cell selection via data-attribute queries on the DOM\n * - Table document operations (add/delete rows/columns, merge/split)\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { CellCoordinates, TableSelectionSnapshot } from './types';\nimport type { Document, Table } from '../types/document';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Data attributes for table elements in the rendered DOM */\nexport const TABLE_DATA_ATTRIBUTES = {\n TABLE_INDEX: 'data-table-index',\n ROW_INDEX: 'data-row',\n COLUMN_INDEX: 'data-col',\n TABLE_CELL: 'data-table-cell',\n} as const;\n\n// ============================================================================\n// HELPER FUNCTIONS (framework-agnostic DOM queries)\n// ============================================================================\n\n/**\n * Find table cell coordinates from a click target by walking up the DOM\n * and reading data attributes.\n */\nexport function findTableFromClick(\n target: EventTarget | null,\n container?: HTMLElement | null\n): CellCoordinates | null {\n if (!(target instanceof Element)) return null;\n\n let current: Element | null = target;\n while (current && current !== container) {\n if (current.tagName === 'TD' || current.tagName === 'TH') {\n const rowAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.ROW_INDEX);\n const colAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.COLUMN_INDEX);\n\n if (rowAttr !== null && colAttr !== null) {\n let tableElement: Element | null = current;\n while (tableElement && tableElement !== container) {\n if (tableElement.tagName === 'TABLE') {\n const tableIndexAttr = tableElement.getAttribute(TABLE_DATA_ATTRIBUTES.TABLE_INDEX);\n if (tableIndexAttr !== null) {\n return {\n tableIndex: parseInt(tableIndexAttr, 10),\n rowIndex: parseInt(rowAttr, 10),\n columnIndex: parseInt(colAttr, 10),\n };\n }\n break;\n }\n tableElement = tableElement.parentElement;\n }\n }\n break;\n }\n current = current.parentElement;\n }\n\n return null;\n}\n\n/** Get a table from the document by index. */\nexport function getTableFromDocument(doc: Document, tableIndex: number): Table | null {\n if (!doc.package?.document?.content) return null;\n\n let currentTableIndex = 0;\n for (const block of doc.package.document.content) {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n return block;\n }\n currentTableIndex++;\n }\n }\n return null;\n}\n\n/** Update a table in the document immutably. */\nexport function updateTableInDocument(\n doc: Document,\n tableIndex: number,\n newTable: Table\n): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.map((block) => {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n currentTableIndex++;\n return newTable;\n }\n currentTableIndex++;\n }\n return block;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n/** Delete a table from the document immutably. */\nexport function deleteTableFromDocument(doc: Document, tableIndex: number): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.filter((block) => {\n if (block.type === 'table') {\n const shouldDelete = currentTableIndex === tableIndex;\n currentTableIndex++;\n return !shouldDelete;\n }\n return true;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class TableSelectionManager extends Subscribable<TableSelectionSnapshot> {\n constructor() {\n super({ selectedCell: null });\n }\n\n /** Select a specific cell. */\n selectCell(coords: CellCoordinates): void {\n this.setSnapshot({ selectedCell: coords });\n }\n\n /** Clear the current selection. */\n clearSelection(): void {\n this.setSnapshot({ selectedCell: null });\n }\n\n /** Check if a specific cell is selected. */\n isCellSelected(tableIndex: number, rowIndex: number, columnIndex: number): boolean {\n const { selectedCell } = this.getSnapshot();\n if (!selectedCell) return false;\n return (\n selectedCell.tableIndex === tableIndex &&\n selectedCell.rowIndex === rowIndex &&\n selectedCell.columnIndex === columnIndex\n );\n }\n\n /** Get the currently selected cell coordinates, or null. */\n getSelectedCell(): CellCoordinates | null {\n return this.getSnapshot().selectedCell;\n }\n}\n","/**\n * ClipboardManager\n *\n * Framework-agnostic class for clipboard operations in the editor.\n * Extracted from the React `useClipboard` hook.\n *\n * Handles:\n * - DOM selection traversal and run extraction\n * - Formatting extraction from computed styles\n * - Clipboard read/write operations\n */\n\nimport type { Run } from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Selection data for clipboard operations */\nexport interface ClipboardSelection {\n text: string;\n runs: Run[];\n startParagraphIndex: number;\n startRunIndex: number;\n startOffset: number;\n endParagraphIndex: number;\n endRunIndex: number;\n endOffset: number;\n isMultiParagraph: boolean;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Convert a CSS color string (rgb/rgba/hex) to a 6-char uppercase hex string.\n *\n * NOTE: This differs from `colorResolver.rgbToHex(r, g, b)` which takes\n * numeric components. This function parses CSS color strings.\n */\nexport function cssColorToHex(color: string): string | null {\n if (!color || color === 'transparent' || color === 'inherit') return null;\n\n if (color.startsWith('#')) {\n return color.slice(1).toUpperCase();\n }\n\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');\n const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');\n const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');\n return (r + g + b).toUpperCase();\n }\n\n return null;\n}\n\n/** Extract formatting from an HTML element's computed styles. */\nexport function extractFormattingFromElement(element: HTMLElement): Run['formatting'] {\n const style = window.getComputedStyle(element);\n const formatting: Run['formatting'] = {};\n\n // Bold\n if (style.fontWeight === 'bold' || parseInt(style.fontWeight) >= 700) {\n formatting.bold = true;\n }\n\n // Italic\n if (style.fontStyle === 'italic') {\n formatting.italic = true;\n }\n\n // Underline\n const textDecoration = style.textDecoration || style.textDecorationLine;\n if (textDecoration && textDecoration.includes('underline')) {\n formatting.underline = { style: 'single' };\n }\n\n // Strikethrough\n if (textDecoration && textDecoration.includes('line-through')) {\n formatting.strike = true;\n }\n\n // Font size (convert px to half-points)\n const fontSize = parseFloat(style.fontSize);\n if (!isNaN(fontSize) && fontSize > 0) {\n formatting.fontSize = Math.round((fontSize / 1.333) * 2);\n }\n\n // Font family\n const fontFamily = style.fontFamily.replace(/[\"']/g, '').split(',')[0].trim();\n if (fontFamily) {\n formatting.fontFamily = { ascii: fontFamily };\n }\n\n // Color\n const color = style.color;\n if (color && color !== 'rgb(0, 0, 0)') {\n const hex = cssColorToHex(color);\n if (hex) {\n formatting.color = { rgb: hex };\n }\n }\n\n // Background color\n const bgColor = style.backgroundColor;\n if (bgColor && bgColor !== 'transparent' && bgColor !== 'rgba(0, 0, 0, 0)') {\n const hex = rgbToHex(bgColor);\n if (hex) {\n formatting.shading = { fill: { rgb: hex } };\n }\n }\n\n return Object.keys(formatting).length > 0 ? formatting : undefined;\n}\n\n/** Get selected text from a run element, considering partial selection. */\nfunction getSelectedTextFromRun(runEl: Node, range: Range): string {\n const runRange = document.createRange();\n runRange.selectNodeContents(runEl);\n\n const startInRun =\n range.compareBoundaryPoints(Range.START_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, runRange) <= 0;\n const endInRun =\n range.compareBoundaryPoints(Range.END_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, runRange) <= 0;\n\n if (startInRun && endInRun) {\n return range.toString();\n } else if (startInRun) {\n const tempRange = document.createRange();\n tempRange.setStart(range.startContainer, range.startOffset);\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(runRange.endContainer, runRange.endOffset);\n return tempRange.toString();\n } else if (endInRun) {\n const tempRange = document.createRange();\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(range.endContainer, range.endOffset);\n tempRange.setStart(runRange.startContainer, runRange.startOffset);\n return tempRange.toString();\n } else if (range.intersectsNode(runEl)) {\n return runEl.textContent || '';\n }\n\n return '';\n}\n\n/** Find the paragraph element containing a node. */\nfunction findParagraphElement(node: Node): HTMLElement | null {\n let current: Node | null = node;\n while (current) {\n if (current.nodeType === Node.ELEMENT_NODE) {\n const element = current as HTMLElement;\n if (element.hasAttribute('data-paragraph-index')) {\n return element;\n }\n }\n current = current.parentNode;\n }\n return null;\n}\n\n/** Get selected runs from the current DOM selection. */\nexport function getSelectionRuns(): Run[] {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return [];\n\n const runs: Run[] = [];\n const range = selection.getRangeAt(0);\n\n const container = range.commonAncestorContainer;\n const containerElement =\n container.nodeType === Node.ELEMENT_NODE ? (container as HTMLElement) : container.parentElement;\n\n if (!containerElement) return runs;\n\n const runElements = containerElement.querySelectorAll('.docx-run');\n\n runElements.forEach((runEl) => {\n if (range.intersectsNode(runEl)) {\n const text = getSelectedTextFromRun(runEl, range);\n if (text) {\n const formatting = extractFormattingFromElement(runEl as HTMLElement);\n runs.push({\n type: 'run',\n formatting,\n content: [{ type: 'text', text }],\n });\n }\n }\n });\n\n if (runs.length === 0) {\n const selectedText = selection.toString();\n if (selectedText) {\n runs.push({\n type: 'run',\n content: [{ type: 'text', text: selectedText }],\n });\n }\n }\n\n return runs;\n}\n\n/** Create a ClipboardSelection from the current DOM selection. */\nexport function createSelectionFromDOM(): ClipboardSelection | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return null;\n\n const runs = getSelectionRuns();\n if (runs.length === 0) return null;\n\n const text = selection.toString();\n const range = selection.getRangeAt(0);\n const startPara = findParagraphElement(range.startContainer);\n const endPara = findParagraphElement(range.endContainer);\n\n const startParagraphIndex = startPara\n ? parseInt(startPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n const endParagraphIndex = endPara\n ? parseInt(endPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n\n return {\n text,\n runs,\n startParagraphIndex,\n startRunIndex: 0,\n startOffset: range.startOffset,\n endParagraphIndex,\n endRunIndex: 0,\n endOffset: range.endOffset,\n isMultiParagraph: startParagraphIndex !== endParagraphIndex,\n };\n}\n\n// Backwards-compatible alias\nexport const rgbToHex = cssColorToHex;\n","/**\n * ErrorManager\n *\n * Framework-agnostic pub/sub error notification system.\n * Replaces React's `componentDidCatch` + context pattern for error notifications.\n *\n * Usage with React:\n * ```ts\n * const { notifications } = useSyncExternalStore(manager.subscribe, manager.getSnapshot);\n * ```\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { ErrorManagerSnapshot, ErrorNotification, ErrorSeverity } from './types';\n\nexport class ErrorManager extends Subscribable<ErrorManagerSnapshot> {\n private notifications: ErrorNotification[] = [];\n private idCounter = 0;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n\n constructor() {\n super({ notifications: [] });\n }\n\n /** Show an error notification (persistent, not auto-dismissed). */\n showError(message: string, details?: string): string {\n return this.addNotification(message, 'error', details);\n }\n\n /** Show a warning notification (auto-dismissed after 5s). */\n showWarning(message: string, details?: string): string {\n return this.addNotification(message, 'warning', details);\n }\n\n /** Show an info notification (auto-dismissed after 5s). */\n showInfo(message: string, details?: string): string {\n return this.addNotification(message, 'info', details);\n }\n\n /** Dismiss a notification by ID. */\n dismiss(id: string): void {\n this.notifications = this.notifications.map((n) =>\n n.id === id ? { ...n, dismissed: true } : n\n );\n this.emitSnapshot();\n\n // Remove from list after animation delay\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n this.notifications = this.notifications.filter((n) => n.id !== id);\n this.emitSnapshot();\n }, 300);\n this.timers.add(timer);\n }\n\n /** Clear all notifications and cancel pending timers. */\n clearAll(): void {\n this.notifications = [];\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n this.emitSnapshot();\n }\n\n /** Destroy the manager and clean up all timers. */\n destroy(): void {\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n this.notifications = [];\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private addNotification(message: string, severity: ErrorSeverity, details?: string): string {\n const id = `error-${++this.idCounter}-${Date.now()}`;\n const notification: ErrorNotification = {\n id,\n message,\n severity,\n details,\n timestamp: Date.now(),\n };\n\n this.notifications = [...this.notifications, notification];\n this.emitSnapshot();\n\n // Auto-dismiss after 5 seconds for info/warning\n if (severity !== 'error') {\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n this.dismiss(id);\n }, 5000);\n this.timers.add(timer);\n }\n\n return id;\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({ notifications: this.notifications });\n }\n}\n","/**\n * PluginLifecycleManager\n *\n * Framework-agnostic class for managing editor plugin lifecycle.\n * Extracted from React's `PluginHost.tsx`.\n *\n * Handles:\n * - Plugin initialization and state tracking\n * - Plugin state updates via `updateStates()`\n * - Plugin destroy/cleanup\n *\n * Does NOT handle (framework hosts are responsible for):\n * - CSS injection (use the exported `injectStyles` utility)\n * - DOM event listeners / dispatch wrapping\n */\n\nimport type { EditorView } from 'prosemirror-view';\n\nimport { Subscribable } from './Subscribable';\nimport type { PluginLifecycleConfig, PluginLifecycleSnapshot } from './types';\n\n// ============================================================================\n// CSS INJECTION UTILITY\n// ============================================================================\n\n/** Inject CSS styles into the document head. Returns a cleanup function. */\nexport function injectStyles(pluginId: string, css: string): () => void {\n const styleId = `plugin-styles-${pluginId}`;\n\n const existing = document.getElementById(styleId);\n if (existing) {\n existing.remove();\n }\n\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = css;\n document.head.appendChild(style);\n\n return () => {\n const el = document.getElementById(styleId);\n if (el) {\n el.remove();\n }\n };\n}\n\n// ============================================================================\n// MANAGER\n// ============================================================================\n\nexport class PluginLifecycleManager extends Subscribable<PluginLifecycleSnapshot> {\n private plugins: PluginLifecycleConfig[] = [];\n private pluginStates = new Map<string, unknown>();\n private version = 0;\n\n constructor() {\n super({ states: new Map(), version: 0 });\n }\n\n /**\n * Initialize plugins with an editor view.\n * Calls `plugin.initialize(editorView)` for each plugin.\n *\n * Note: CSS injection and DOM event listeners are the responsibility\n * of the framework-specific host (e.g. React PluginHost).\n */\n initialize(plugins: PluginLifecycleConfig[], editorView: EditorView): void {\n // Clean up previous\n this.destroyPlugins();\n\n this.plugins = plugins;\n\n // Initialize plugin states\n for (const plugin of plugins) {\n if (plugin.initialize && !this.pluginStates.has(plugin.id)) {\n this.pluginStates.set(plugin.id, plugin.initialize(editorView));\n }\n }\n\n this.emitSnapshot();\n }\n\n /**\n * Update all plugin states by calling `onStateChange` on each plugin.\n * Returns true if any plugin state changed.\n */\n updateStates(editorView: EditorView): boolean {\n let anyChanged = false;\n for (const plugin of this.plugins) {\n if (plugin.onStateChange) {\n const newState = plugin.onStateChange(editorView);\n if (newState !== undefined) {\n this.pluginStates.set(plugin.id, newState);\n anyChanged = true;\n }\n }\n }\n\n if (anyChanged) {\n this.version++;\n this.emitSnapshot();\n }\n\n return anyChanged;\n }\n\n /** Get plugin state by ID. */\n getPluginState<T>(pluginId: string): T | undefined {\n return this.pluginStates.get(pluginId) as T | undefined;\n }\n\n /** Set plugin state by ID. */\n setPluginState<T>(pluginId: string, state: T): void {\n this.pluginStates.set(pluginId, state);\n this.version++;\n this.emitSnapshot();\n }\n\n /** Destroy all plugins and clean up. */\n destroy(): void {\n this.destroyPlugins();\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private destroyPlugins(): void {\n // Call plugin destroy\n for (const plugin of this.plugins) {\n if (plugin.destroy) {\n plugin.destroy();\n }\n }\n\n this.pluginStates.clear();\n this.plugins = [];\n }\n\n private emitSnapshot(): void {\n this.setSnapshot({\n states: new Map(this.pluginStates),\n version: this.version,\n });\n }\n}\n","/**\n * LayoutCoordinator\n *\n * Framework-agnostic class coordinating the PM state → layout engine →\n * layout painter → selection overlay pipeline.\n *\n * Extracted from PagedEditor.tsx. Manages:\n * - Layout pipeline state (blocks, measures, layout)\n * - Selection state (selectionRects, caretPosition)\n * - Drag selection state\n * - Column resize state\n * - Image interaction state\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(coordinator.subscribe, coordinator.getSnapshot);\n * ```\n *\n * NOTE: This class defines the state shape and subscription pattern.\n * Full integration with PagedEditor is done incrementally.\n */\n\nimport { Subscribable } from './Subscribable';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Selection rectangle for rendering selection overlays */\nexport interface SelectionRect {\n x: number;\n y: number;\n width: number;\n height: number;\n pageIndex: number;\n}\n\n/** Caret position for rendering the blinking cursor */\nexport interface CaretPosition {\n x: number;\n y: number;\n height: number;\n pageIndex: number;\n}\n\n/** Info about the currently selected/hovered image */\nexport interface ImageSelectionInfo {\n pmPos: number;\n pageIndex: number;\n rect: { x: number; y: number; width: number; height: number };\n widthEmu: number;\n heightEmu: number;\n isInline: boolean;\n}\n\n/** Column resize tracking state */\nexport interface ColumnResizeState {\n isResizing: boolean;\n startX: number;\n columnIndex: number;\n tablePmStart: number;\n originalWidths: { left: number; right: number };\n}\n\n/** The full snapshot exposed to UI frameworks */\nexport interface LayoutCoordinatorSnapshot {\n /** Computed page layout, null until first computation */\n hasLayout: boolean;\n /** Selection rectangles for range selection overlay */\n selectionRects: SelectionRect[];\n /** Caret position for cursor overlay */\n caretPosition: CaretPosition | null;\n /** Currently selected/hovered image */\n selectedImageInfo: ImageSelectionInfo | null;\n /** Whether the editor is focused */\n isFocused: boolean;\n /** Whether a text drag is in progress */\n isDragging: boolean;\n /** Whether a column resize is in progress */\n isResizingColumn: boolean;\n /** Whether an image interaction is in progress */\n isImageInteracting: boolean;\n /** Version counter — incremented on every state change */\n version: number;\n}\n\n// ============================================================================\n// COORDINATOR\n// ============================================================================\n\nexport class LayoutCoordinator extends Subscribable<LayoutCoordinatorSnapshot> {\n // Layout pipeline state\n private _hasLayout = false;\n\n // Selection state\n private _selectionRects: SelectionRect[] = [];\n private _caretPosition: CaretPosition | null = null;\n\n // Drag state\n private _isDragging = false;\n private _dragAnchor: number | null = null;\n\n // Column resize state\n private _columnResize: ColumnResizeState = {\n isResizing: false,\n startX: 0,\n columnIndex: 0,\n tablePmStart: 0,\n originalWidths: { left: 0, right: 0 },\n };\n\n // Image interaction state\n private _selectedImageInfo: ImageSelectionInfo | null = null;\n private _isImageInteracting = false;\n\n // Focus state\n private _isFocused = false;\n\n // Version counter for fine-grained change tracking\n private _version = 0;\n\n constructor() {\n super({\n hasLayout: false,\n selectionRects: [],\n caretPosition: null,\n selectedImageInfo: null,\n isFocused: false,\n isDragging: false,\n isResizingColumn: false,\n isImageInteracting: false,\n version: 0,\n });\n }\n\n // --------------------------------------------------------------------------\n // LAYOUT PIPELINE\n // --------------------------------------------------------------------------\n\n /** Notify that layout has been computed. */\n setLayoutReady(hasLayout: boolean): void {\n this._hasLayout = hasLayout;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // SELECTION STATE\n // --------------------------------------------------------------------------\n\n /** Update selection rectangles and caret position. */\n updateSelection(selectionRects: SelectionRect[], caretPosition: CaretPosition | null): void {\n this._selectionRects = selectionRects;\n this._caretPosition = caretPosition;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // DRAG SELECTION\n // --------------------------------------------------------------------------\n\n /** Start a drag selection from the given PM anchor position. */\n startDrag(anchor: number): void {\n this._isDragging = true;\n this._dragAnchor = anchor;\n this.emitSnapshot();\n }\n\n /** End drag selection. */\n endDrag(): void {\n this._isDragging = false;\n this._dragAnchor = null;\n this.emitSnapshot();\n }\n\n /** Get the drag anchor position. */\n getDragAnchor(): number | null {\n return this._dragAnchor;\n }\n\n // --------------------------------------------------------------------------\n // COLUMN RESIZE\n // --------------------------------------------------------------------------\n\n /** Start resizing a table column. */\n startColumnResize(\n tablePmStart: number,\n columnIndex: number,\n startX: number,\n originalWidths: { left: number; right: number }\n ): void {\n this._columnResize = {\n isResizing: true,\n startX,\n columnIndex,\n tablePmStart,\n originalWidths,\n };\n this.emitSnapshot();\n }\n\n /** End column resize. */\n endColumnResize(): void {\n this._columnResize = {\n ...this._columnResize,\n isResizing: false,\n };\n this.emitSnapshot();\n }\n\n /** Get current column resize state. */\n getColumnResize(): ColumnResizeState {\n return this._columnResize;\n }\n\n // --------------------------------------------------------------------------\n // IMAGE INTERACTION\n // --------------------------------------------------------------------------\n\n /** Set the currently selected image. */\n setSelectedImage(imageInfo: ImageSelectionInfo | null): void {\n this._selectedImageInfo = imageInfo;\n this.emitSnapshot();\n }\n\n /** Clear the image selection. */\n clearSelectedImage(): void {\n this._selectedImageInfo = null;\n this._isImageInteracting = false;\n this.emitSnapshot();\n }\n\n /** Set whether an image interaction (resize/move) is in progress. */\n setImageInteracting(interacting: boolean): void {\n this._isImageInteracting = interacting;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // FOCUS\n // --------------------------------------------------------------------------\n\n /** Update focus state. */\n setFocused(focused: boolean): void {\n this._isFocused = focused;\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private emitSnapshot(): void {\n this._version++;\n this.setSnapshot({\n hasLayout: this._hasLayout,\n selectionRects: this._selectionRects,\n caretPosition: this._caretPosition,\n selectedImageInfo: this._selectedImageInfo,\n isFocused: this._isFocused,\n isDragging: this._isDragging,\n isResizingColumn: this._columnResize.isResizing,\n isImageInteracting: this._isImageInteracting,\n version: this._version,\n });\n }\n}\n","/**\n * EditorCoordinator\n *\n * Framework-agnostic class managing the document editor lifecycle:\n * - Document parsing and loading\n * - Font loading coordination\n * - Zoom level management\n * - Extension manager initialization\n * - Agent command execution\n *\n * Extracted from DocxEditor.tsx.\n *\n * Usage with React:\n * ```ts\n * const snapshot = useSyncExternalStore(coordinator.subscribe, coordinator.getSnapshot);\n * ```\n *\n * NOTE: This class defines the state shape and coordination logic.\n * Full integration with DocxEditor is done incrementally.\n */\n\nimport { Subscribable } from './Subscribable';\nimport type { Document } from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/** Editor loading state */\nexport type EditorLoadingState = 'idle' | 'parsing' | 'loading-fonts' | 'ready' | 'error';\n\n/** Configuration for EditorCoordinator */\nexport interface EditorCoordinatorOptions {\n /** Initial zoom level (default: 1.0) */\n initialZoom?: number;\n /** Callback when the document changes */\n onChange?: (document: Document) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n}\n\n/** The full snapshot exposed to UI frameworks */\nexport interface EditorCoordinatorSnapshot {\n /** Current loading state */\n loadingState: EditorLoadingState;\n /** Error message if loadingState is 'error' */\n parseError: string | null;\n /** Whether the editor is ready for interaction */\n isReady: boolean;\n /** Current zoom level (1.0 = 100%) */\n zoom: number;\n /** Whether fonts have been loaded */\n fontsLoaded: boolean;\n /** Version counter */\n version: number;\n}\n\n// ============================================================================\n// COORDINATOR\n// ============================================================================\n\nexport class EditorCoordinator extends Subscribable<EditorCoordinatorSnapshot> {\n private _loadingState: EditorLoadingState = 'idle';\n private _parseError: string | null = null;\n private _zoom: number;\n private _fontsLoaded = false;\n private _document: Document | null = null;\n private _version = 0;\n\n private onChangeCallback?: (document: Document) => void;\n private onErrorCallback?: (error: Error) => void;\n\n constructor(options: EditorCoordinatorOptions = {}) {\n const zoom = options.initialZoom ?? 1.0;\n super({\n loadingState: 'idle',\n parseError: null,\n isReady: false,\n zoom,\n fontsLoaded: false,\n version: 0,\n });\n\n this._zoom = zoom;\n this.onChangeCallback = options.onChange;\n this.onErrorCallback = options.onError;\n }\n\n // --------------------------------------------------------------------------\n // DOCUMENT LIFECYCLE\n // --------------------------------------------------------------------------\n\n /** Signal that document parsing has started. */\n setParsingStarted(): void {\n this._loadingState = 'parsing';\n this._parseError = null;\n this.emitSnapshot();\n }\n\n /** Signal that document parsing completed successfully. */\n setDocumentLoaded(document: Document): void {\n this._document = document;\n this._loadingState = 'loading-fonts';\n this._parseError = null;\n this.emitSnapshot();\n }\n\n /** Signal that font loading completed. */\n setFontsLoaded(): void {\n this._fontsLoaded = true;\n this._loadingState = 'ready';\n this.emitSnapshot();\n }\n\n /** Signal that an error occurred during loading. */\n setLoadError(error: Error): void {\n this._loadingState = 'error';\n this._parseError = error.message;\n this.onErrorCallback?.(error);\n this.emitSnapshot();\n }\n\n /** Get the current document. */\n getDocument(): Document | null {\n return this._document;\n }\n\n /** Update the document (after edits). */\n updateDocument(document: Document): void {\n this._document = document;\n this.onChangeCallback?.(document);\n this.emitSnapshot();\n }\n\n // --------------------------------------------------------------------------\n // ZOOM\n // --------------------------------------------------------------------------\n\n /** Set the zoom level (1.0 = 100%). */\n setZoom(zoom: number): void {\n this._zoom = Math.max(0.25, Math.min(4.0, zoom));\n this.emitSnapshot();\n }\n\n /** Get the current zoom level. */\n getZoom(): number {\n return this._zoom;\n }\n\n // --------------------------------------------------------------------------\n // PRIVATE\n // --------------------------------------------------------------------------\n\n private emitSnapshot(): void {\n this._version++;\n this.setSnapshot({\n loadingState: this._loadingState,\n parseError: this._parseError,\n isReady: this._loadingState === 'ready',\n zoom: this._zoom,\n fontsLoaded: this._fontsLoaded,\n version: this._version,\n });\n }\n}\n","/**\n * @eigenpal/docx-js-editor/core\n *\n * Core entry point — types, parser, serializer, and utilities.\n * No React or ProseMirror dependencies.\n *\n * @example\n * ```ts\n * import { parseDocx, serializeDocx, resolveColor } from '@eigenpal/docx-js-editor/core';\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from './docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from './docx/serializer/documentSerializer';\nexport { repackDocx, createDocx } from './docx/rezip';\n\n// ============================================================================\n// TEMPLATE PROCESSING\n// ============================================================================\n\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n getTemplateTags,\n validateTemplate,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n} from './utils/processTemplate';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from './utils/createDocument';\n\n// ============================================================================\n// AGENT API\n// ============================================================================\n\nexport { DocumentAgent } from './agent/DocumentAgent';\nexport { executeCommand, executeCommands } from './agent/executor';\nexport { getAgentContext, getDocumentSummary, type AgentContextOptions } from './agent/context';\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n} from './agent/selectionContext';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from './utils/units';\n\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from './utils/colorResolver';\n\nexport {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n type InsertPosition,\n} from './utils/insertOperations';\n\nexport { type DocxInput, toArrayBuffer } from './utils/docxInput';\n\n// ============================================================================\n// FONT LOADER\n// ============================================================================\n\nexport {\n loadFont,\n loadFonts,\n loadFontFromBuffer,\n isFontLoaded,\n isLoading as isFontsLoading,\n getLoadedFonts,\n onFontsLoaded,\n canRenderFont,\n preloadCommonFonts,\n} from './utils/fontLoader';\n\n// ============================================================================\n// VARIABLE DETECTION\n// ============================================================================\n\nexport {\n detectVariables,\n detectVariablesDetailed,\n detectVariablesInBody,\n detectVariablesInParagraph,\n extractVariablesFromText,\n hasTemplateVariables,\n isValidVariableName,\n sanitizeVariableName,\n formatVariable,\n parseVariable,\n replaceVariables,\n removeVariables,\n documentHasVariables,\n type VariableDetectionResult,\n type VariableOccurrence,\n} from './utils/variableDetector';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Shape,\n TextBox,\n Hyperlink,\n BookmarkStart,\n BookmarkEnd,\n Field,\n Theme,\n ThemeColorScheme,\n ThemeFont,\n ThemeFontScheme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n HeaderFooter,\n HeaderReference,\n FooterReference,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from './types/document';\n\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n} from './types/agentApi';\n\n// ============================================================================\n// EDITOR PLUGIN API (Framework-Agnostic)\n// ============================================================================\n\nexport type {\n EditorPluginCore,\n PluginPanelProps,\n PanelConfig,\n RenderedDomContext,\n PositionCoordinates,\n} from './plugin-api/types';\n\n// ============================================================================\n// CORE PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n docxtemplaterPlugin,\n type CorePlugin,\n type McpToolDefinition,\n type McpToolHandler,\n type McpToolResult,\n type McpSession,\n} from './core-plugins';\n\n// ============================================================================\n// MANAGER CLASSES (Framework-Agnostic Business Logic)\n// ============================================================================\n\nexport {\n // Base class\n Subscribable,\n // Manager classes\n AutoSaveManager,\n TableSelectionManager,\n ErrorManager,\n PluginLifecycleManager,\n // AutoSave utilities\n formatLastSaveTime,\n getAutoSaveStatusLabel,\n getAutoSaveStorageSize,\n formatStorageSize,\n isAutoSaveSupported,\n // TableSelection utilities\n TABLE_DATA_ATTRIBUTES,\n findTableFromClick,\n getTableFromDocument,\n updateTableInDocument,\n deleteTableFromDocument,\n // Clipboard utilities\n getSelectionRuns,\n createSelectionFromDOM,\n extractFormattingFromElement,\n rgbToHex,\n // PluginLifecycle utilities\n injectStyles,\n // Coordinators\n LayoutCoordinator,\n EditorCoordinator,\n} from './managers';\n\nexport type {\n // EditorHandle interface\n EditorHandle,\n // AutoSave types\n AutoSaveStatus,\n AutoSaveManagerOptions,\n SavedDocumentData,\n AutoSaveSnapshot,\n // TableSelection types\n CellCoordinates,\n TableSelectionSnapshot,\n // Error types\n ErrorSeverity,\n ErrorNotification,\n ErrorManagerSnapshot,\n // Plugin types\n PluginLifecycleConfig,\n PluginLifecycleSnapshot,\n // Clipboard types\n ClipboardSelection,\n // LayoutCoordinator types\n SelectionRect,\n CaretPosition,\n ImageSelectionInfo,\n ColumnResizeState,\n LayoutCoordinatorSnapshot,\n // EditorCoordinator types\n EditorLoadingState,\n EditorCoordinatorOptions,\n EditorCoordinatorSnapshot,\n} from './managers';\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var f={dk1:"000000",lt1:"FFFFFF",dk2:"44546A",lt2:"E7E6E6",accent1:"4472C4",accent2:"ED7D31",accent3:"A5A5A5",accent4:"FFC000",accent5:"5B9BD5",accent6:"70AD47",hlink:"0563C1",folHlink:"954F72"},S={black:"000000",blue:"0000FF",cyan:"00FFFF",darkBlue:"00008B",darkCyan:"008B8B",darkGray:"A9A9A9",darkGreen:"006400",darkMagenta:"8B008B",darkRed:"8B0000",darkYellow:"808000",green:"00FF00",lightGray:"D3D3D3",magenta:"FF00FF",red:"FF0000",white:"FFFFFF",yellow:"FFFF00",none:""},d={dk1:"dk1",lt1:"lt1",dk2:"dk2",lt2:"lt2",accent1:"accent1",accent2:"accent2",accent3:"accent3",accent4:"accent4",accent5:"accent5",accent6:"accent6",hlink:"hlink",folHlink:"folHlink",dark1:"dk1",light1:"lt1",dark2:"dk2",light2:"lt2",hyperlink:"hlink",followedHyperlink:"folHlink",background1:"lt1",text1:"dk1",background2:"lt2",text2:"dk2",tx1:"dk1",tx2:"dk2",bg1:"lt1",bg2:"lt2"};function b(e){if(!e)return 1;let n=parseInt(e,16);return isNaN(n)?1:n/255}function a(e){let n=e.padStart(6,"0").slice(0,6),r=parseInt(n.slice(0,2),16),t=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16);return {r:isNaN(r)?0:r,g:isNaN(t)?0:t,b:isNaN(o)?0:o}}function m(e,n,r){let t=o=>Math.max(0,Math.min(255,Math.round(o))).toString(16).padStart(2,"0");return `${t(e)}${t(n)}${t(r)}`.toUpperCase()}function p(e,n,r){e/=255,n/=255,r/=255;let t=Math.max(e,n,r),o=Math.min(e,n,r),u=(t+o)/2;if(t===o)return {h:0,s:0,l:u};let l=t-o,c=u>.5?l/(2-t-o):l/(t+o),i;switch(t){case e:i=((n-r)/l+(n<r?6:0))/6;break;case n:i=((r-e)/l+2)/6;break;case r:i=((e-n)/l+4)/6;break;default:i=0;}return {h:i*360,s:c,l:u}}function h(e,n,r){if(e=e/360,n===0){let l=Math.round(r*255);return {r:l,g:l,b:l}}let t=(l,c,i)=>(i<0&&(i+=1),i>1&&(i-=1),i<1/6?l+(c-l)*6*i:i<1/2?c:i<2/3?l+(c-l)*(2/3-i)*6:l),o=r<.5?r*(1+n):r+n-r*n,u=2*r-o;return {r:Math.round(t(u,o,e+1/3)*255),g:Math.round(t(u,o,e)*255),b:Math.round(t(u,o,e-1/3)*255)}}function g(e,n){if(n<=0||n>=1)return n>=1?"FFFFFF":e;let r=a(e),t=p(r.r,r.g,r.b);t.l=t.l+(1-t.l)*n;let o=h(t.h,t.s,t.l);return m(o.r,o.g,o.b)}function C(e,n){if(n<=0||n>=1)return n<=0?"000000":e;let r=a(e),t=p(r.r,r.g,r.b);t.l=t.l*n;let o=h(t.h,t.s,t.l);return m(o.r,o.g,o.b)}function x(e,n){let r=d[n]??n,t=["dk1","lt1","dk2","lt2","accent1","accent2","accent3","accent4","accent5","accent6","hlink","folHlink"],o=u=>t.includes(u);return e?.colorScheme?o(r)?e.colorScheme[r]??f[r]??"000000":"000000":o(r)?f[r]??"000000":"000000"}function T(e){if(!e)return null;let n=e.toLowerCase();return d[e]??d[n]??null}function s(e,n,r="000000"){if(!e)return `#${r}`;if(e.auto)return `#${r}`;let t;if(e.themeColor){let o=T(e.themeColor);if(o?t=x(n,o):t=e.rgb??r,e.themeTint){let u=b(e.themeTint);t=g(t,u);}else if(e.themeShade){let u=b(e.themeShade);t=C(t,u);}}else e.rgb?t=e.rgb:t=r;return `#${t.toUpperCase().replace(/^#/,"")}`}function P(e){if(!e||e==="none")return "";let n=S[e];return n?`#${n}`:""}function E(e,n){return e?e.auto?"transparent":s(e,n):""}function I(e,n){if(!e)return false;if(e.auto)return true;let t=s(e,n).replace(/^#/,"").toLowerCase(),o=a(t);return (o.r+o.g+o.b)/3<20}function F(e,n){if(!e)return false;let t=s(e,n).replace(/^#/,"").toLowerCase(),o=a(t);return (o.r+o.g+o.b)/3>235}function H(e,n){if(!e)return "#000000";let t=s(e,n).replace(/^#/,""),o=a(t);return (.299*o.r+.587*o.g+.114*o.b)/255>.5?"#000000":"#FFFFFF"}function k(e){if(!e)return;let n=e.trim();if(n.toLowerCase()==="auto")return {auto:true};let r=T(n);if(r)return {themeColor:r};let t=n.replace(/^#/,"").toUpperCase();return /^[0-9A-F]{6}$/i.test(t)?{rgb:t}:/^[0-9A-F]{3}$/i.test(t)?{rgb:t.split("").map(u=>u+u).join("")}:{rgb:t.padStart(6,"0").slice(0,6)}}function R(e,n,r){let t={themeColor:e};return n!==void 0&&n>0&&n<1&&(t.themeTint=Math.round(n*255).toString(16).toUpperCase().padStart(2,"0")),r!==void 0&&r>0&&r<1&&(t.themeShade=Math.round(r*255).toString(16).toUpperCase().padStart(2,"0")),t}function N(e){return {rgb:e.replace(/^#/,"").toUpperCase()}}function M(e,n,r){let o=s(e,n).replace(/^#/,""),u=1-r/100;return `#${C(o,u)}`}function y(e,n,r){let o=s(e,n).replace(/^#/,""),u=r/100;return `#${g(o,u)}`}function L(e,n,r,t){let o=s(e,t).replace(/^#/,""),u=s(n,t).replace(/^#/,""),l=a(o),c=a(u),i={r:Math.round(l.r*(1-r)+c.r*r),g:Math.round(l.g*(1-r)+c.g*r),b:Math.round(l.b*(1-r)+c.b*r)};return `#${m(i.r,i.g,i.b)}`}function A(e,n,r){if(!e&&!n)return true;if(!e||!n)return false;let t=s(e,r).toUpperCase(),o=s(n,r).toUpperCase();return t===o}function v(e){return e/1440*96}function w(e){return e/96*1440}function D(e){return e/914400*96}function U(e){return e/96*914400}function $(e){return e/914400*1440}function B(e){return e/1440*914400}function O(e){return e/72*96}function X(e){return e/144*96}function G(e){return e/2}function K(e){return e/576*96}function _(e,n=2){let r=Math.pow(10,n);return Math.round(e*r)/r}function W(e){return `${_(e)}px`}exports.a=s;exports.b=P;exports.c=E;exports.d=I;exports.e=F;exports.f=H;exports.g=k;exports.h=R;exports.i=N;exports.j=M;exports.k=y;exports.l=L;exports.m=A;exports.n=v;exports.o=w;exports.p=D;exports.q=U;exports.r=$;exports.s=B;exports.t=O;exports.u=X;exports.v=G;exports.w=K;exports.x=W;//# sourceMappingURL=chunk-GJ4GKSDU.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-GJ4GKSDU.cjs.map
|