@eigenpal/docx-js-editor 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  2. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  3. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  4. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  5. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  6. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  7. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  8. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  9. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  10. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  11. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  12. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  13. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  14. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  15. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  17. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  18. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  19. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  20. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  21. package/dist/chunk-32HMU2UV.js +111 -0
  22. package/dist/chunk-4CUGBNL2.cjs +1 -0
  23. package/dist/chunk-5GFXHUMP.js +1 -0
  24. package/dist/chunk-6NDMKJIE.js +9 -0
  25. package/dist/chunk-6NYA53QC.cjs +258 -0
  26. package/dist/chunk-7KJ3YVDQ.js +10 -0
  27. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  28. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  29. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  30. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  31. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  32. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  33. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  34. package/dist/chunk-FXJAIFPR.js +59 -0
  35. package/dist/chunk-GICVJSFJ.cjs +9 -0
  36. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  37. package/dist/chunk-HT2Z33YM.cjs +111 -0
  38. package/dist/chunk-JRRTZZ72.cjs +1 -0
  39. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  40. package/dist/chunk-P3AEZKQO.cjs +3 -0
  41. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  42. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  43. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  44. package/dist/chunk-Q7YYC75E.js +258 -0
  45. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  46. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  47. package/dist/chunk-USRMBYI6.js +3 -0
  48. package/dist/chunk-UTWPV2I4.js +26 -0
  49. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  50. package/dist/chunk-XQNCLN4T.cjs +3 -0
  51. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  52. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  53. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  54. package/dist/chunk-ZTVQA46Q.js +1 -0
  55. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  56. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  57. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  58. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  59. package/dist/core-plugins-reexport.cjs +1 -2
  60. package/dist/core-plugins-reexport.d.cts +4 -4
  61. package/dist/core-plugins-reexport.d.ts +4 -4
  62. package/dist/core-plugins-reexport.js +1 -2
  63. package/dist/core-reexport.cjs +1 -2
  64. package/dist/core-reexport.d.cts +10 -10
  65. package/dist/core-reexport.d.ts +10 -10
  66. package/dist/core-reexport.js +1 -2
  67. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  68. package/dist/executor-L2MVKMXO.js +1 -0
  69. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  70. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  71. package/dist/headless-reexport.cjs +4 -5
  72. package/dist/headless-reexport.d.cts +7 -7
  73. package/dist/headless-reexport.d.ts +7 -7
  74. package/dist/headless-reexport.js +4 -5
  75. package/dist/index.cjs +6 -7
  76. package/dist/index.css +0 -1
  77. package/dist/index.d.cts +12 -12
  78. package/dist/index.d.ts +12 -12
  79. package/dist/index.js +6 -7
  80. package/dist/lib-GD2QD2JK.js +1 -0
  81. package/dist/lib-HOLGQI5K.cjs +1 -0
  82. package/dist/mcp-reexport.cjs +9 -10
  83. package/dist/mcp-reexport.d.cts +2 -2
  84. package/dist/mcp-reexport.d.ts +2 -2
  85. package/dist/mcp-reexport.js +4 -5
  86. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  87. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  88. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  89. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  90. package/dist/react.cjs +1 -2
  91. package/dist/react.css +0 -1
  92. package/dist/react.d.cts +5 -5
  93. package/dist/react.d.ts +5 -5
  94. package/dist/react.js +1 -2
  95. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  96. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  97. package/dist/selectionRects-7QU337P5.cjs +1 -0
  98. package/dist/selectionRects-V5RC2BYX.js +1 -0
  99. package/dist/styles.css +1 -1
  100. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  101. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  102. package/dist/ui.cjs +1 -2
  103. package/dist/ui.d.cts +32 -85
  104. package/dist/ui.d.ts +32 -85
  105. package/dist/ui.js +1 -2
  106. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  107. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  108. package/package.json +1 -1
  109. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  110. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  112. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  114. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  115. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  117. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  118. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  119. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  120. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  121. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  123. package/dist/chunk-2CHPKB5A.cjs +0 -112
  124. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  125. package/dist/chunk-2QOEHCBX.js.map +0 -1
  126. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  127. package/dist/chunk-5DYSI4O4.cjs +0 -60
  128. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  129. package/dist/chunk-5FJXHXFV.cjs +0 -2
  130. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  131. package/dist/chunk-6FEWNF6B.js +0 -4
  132. package/dist/chunk-6FEWNF6B.js.map +0 -1
  133. package/dist/chunk-6LF5HZCV.js +0 -10
  134. package/dist/chunk-6LF5HZCV.js.map +0 -1
  135. package/dist/chunk-7JSPKVOW.js.map +0 -1
  136. package/dist/chunk-C33XDRDJ.cjs +0 -28
  137. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  138. package/dist/chunk-CV5WFE7K.js.map +0 -1
  139. package/dist/chunk-CXJRNISO.js +0 -2
  140. package/dist/chunk-CXJRNISO.js.map +0 -1
  141. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  142. package/dist/chunk-DP6Q75ZD.js +0 -28
  143. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  144. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  145. package/dist/chunk-FGVGZLBL.js.map +0 -1
  146. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  147. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  148. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  149. package/dist/chunk-JOYPFQW2.js.map +0 -1
  150. package/dist/chunk-L54YNLSE.js +0 -2
  151. package/dist/chunk-L54YNLSE.js.map +0 -1
  152. package/dist/chunk-LPGMLJMO.js +0 -259
  153. package/dist/chunk-LPGMLJMO.js.map +0 -1
  154. package/dist/chunk-M2T6XKT5.js.map +0 -1
  155. package/dist/chunk-OHG7ROFC.js +0 -11
  156. package/dist/chunk-OHG7ROFC.js.map +0 -1
  157. package/dist/chunk-PANKMCFX.cjs +0 -4
  158. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  159. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  160. package/dist/chunk-QDV75OJ4.js +0 -112
  161. package/dist/chunk-QDV75OJ4.js.map +0 -1
  162. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  163. package/dist/chunk-QVIZ775M.cjs +0 -259
  164. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  165. package/dist/chunk-RMUMR42R.cjs +0 -10
  166. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  167. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  168. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  169. package/dist/chunk-ULXNEG66.js +0 -60
  170. package/dist/chunk-ULXNEG66.js.map +0 -1
  171. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  172. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  173. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  174. package/dist/core-plugins-reexport.cjs.map +0 -1
  175. package/dist/core-plugins-reexport.js.map +0 -1
  176. package/dist/core-reexport.cjs.map +0 -1
  177. package/dist/core-reexport.js.map +0 -1
  178. package/dist/executor-K5RXUTTR.js +0 -2
  179. package/dist/executor-K5RXUTTR.js.map +0 -1
  180. package/dist/executor-XIPIU3H4.cjs +0 -2
  181. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  182. package/dist/headless-reexport.cjs.map +0 -1
  183. package/dist/headless-reexport.js.map +0 -1
  184. package/dist/index.cjs.map +0 -1
  185. package/dist/index.css.map +0 -1
  186. package/dist/index.js.map +0 -1
  187. package/dist/mcp-reexport.cjs.map +0 -1
  188. package/dist/mcp-reexport.js.map +0 -1
  189. package/dist/processTemplate-G37IM66O.js.map +0 -1
  190. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  191. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  192. package/dist/react.cjs.map +0 -1
  193. package/dist/react.css.map +0 -1
  194. package/dist/react.js.map +0 -1
  195. package/dist/selectionRects-6DU7HN7E.js +0 -2
  196. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  197. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  198. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  199. package/dist/ui.cjs.map +0 -1
  200. package/dist/ui.js.map +0 -1
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/utils/colorResolver.ts","../../core/src/utils/units.ts"],"names":["DEFAULT_THEME_COLORS","HIGHLIGHT_COLORS","THEME_COLOR_ALIASES","parseModifierValue","hexValue","parsed","hexToRgb","hex","normalized","g","b","rgbToHex","r","toHex","n","rgbToHsl","max","min","l","d","s","h","hslToRgb","gray","hue2rgb","p","q","t","applyTint","tint","rgb","hsl","newRgb","applyShade","shade","getThemeColorValue","theme","slot","schemeKey","schemeKeys","isSchemeKey","key","resolveThemeColorSlot","colorName","resolveColor","color","defaultColor","hexColor","tintValue","shadeValue","resolveHighlightColor","highlight","resolveShadingColor","isBlack","isWhite","getContrastingColor","backgroundColor","bgHex","bgRgb","parseColorString","colorString","themeSlot","c","createThemeColor","themeColor","result","createRgbColor","darkenColor","percent","lightenColor","blendColors","color1","color2","ratio","resolved1","resolved2","rgb1","rgb2","blended","colorsEqual","twipsToPixels","twips","pixelsToTwips","px","emuToPixels","emu","pixelsToEmu","emuToTwips","twipsToEmu","pointsToPixels","points","halfPointsToPixels","halfPoints","halfPointsToPoints","eighthsToPixels","eighths","roundPixels","decimalPlaces","factor","formatPx"],"mappings":"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","file":"chunk-GJ4GKSDU.cjs","sourcesContent":["/**\n * Color Resolver - Convert OOXML colors to CSS\n *\n * Handles:\n * - Theme color references (accent1, dk1, etc.)\n * - RGB hex values\n * - \"auto\" colors (context-dependent)\n * - Tint/shade modifications\n *\n * OOXML Color References:\n * - w:color/@w:val - RGB hex or \"auto\"\n * - w:color/@w:themeColor - Theme color slot\n * - w:color/@w:themeTint - Tint modifier (0-255, hex)\n * - w:color/@w:themeShade - Shade modifier (0-255, hex)\n *\n * Tint/Shade Calculations:\n * - Tint makes color lighter (blend with white)\n * - Shade makes color darker (blend with black)\n * - Value is in hex (00-FF), converted to 0-1 for calculation\n */\n\nimport type { ColorValue, Theme, ThemeColorSlot, ThemeColorScheme } from '../types/document';\n\n/**\n * Default theme colors (Office 2016 default theme)\n */\nconst DEFAULT_THEME_COLORS: ThemeColorScheme = {\n dk1: '000000',\n lt1: 'FFFFFF',\n dk2: '44546A',\n lt2: 'E7E6E6',\n accent1: '4472C4',\n accent2: 'ED7D31',\n accent3: 'A5A5A5',\n accent4: 'FFC000',\n accent5: '5B9BD5',\n accent6: '70AD47',\n hlink: '0563C1',\n folHlink: '954F72',\n};\n\n/**\n * Highlight color mapping to hex values\n * These are the W3C standard colors for Word highlighting\n */\nconst HIGHLIGHT_COLORS: Record<string, string> = {\n black: '000000',\n blue: '0000FF',\n cyan: '00FFFF',\n darkBlue: '00008B',\n darkCyan: '008B8B',\n darkGray: 'A9A9A9',\n darkGreen: '006400',\n darkMagenta: '8B008B',\n darkRed: '8B0000',\n darkYellow: '808000',\n green: '00FF00',\n lightGray: 'D3D3D3',\n magenta: 'FF00FF',\n red: 'FF0000',\n white: 'FFFFFF',\n yellow: 'FFFF00',\n none: '',\n};\n\n/**\n * Map alternative theme color names to standard slots\n * OOXML uses different names in different contexts\n */\nconst THEME_COLOR_ALIASES: Record<string, ThemeColorSlot> = {\n // Standard names\n dk1: 'dk1',\n lt1: 'lt1',\n dk2: 'dk2',\n lt2: 'lt2',\n accent1: 'accent1',\n accent2: 'accent2',\n accent3: 'accent3',\n accent4: 'accent4',\n accent5: 'accent5',\n accent6: 'accent6',\n hlink: 'hlink',\n folHlink: 'folHlink',\n // Alternative names used in some OOXML contexts\n dark1: 'dk1',\n light1: 'lt1',\n dark2: 'dk2',\n light2: 'lt2',\n hyperlink: 'hlink',\n followedHyperlink: 'folHlink',\n // Background/text names (map to dk1/lt1)\n background1: 'lt1',\n text1: 'dk1',\n background2: 'lt2',\n text2: 'dk2',\n tx1: 'dk1',\n tx2: 'dk2',\n bg1: 'lt1',\n bg2: 'lt2',\n};\n\n/**\n * Parse a hex color modifier value (tint or shade)\n * OOXML stores tint/shade as hex string (00-FF) representing 0-255\n *\n * @param hexValue - Hex string like \"80\" or \"FF\"\n * @returns Decimal value 0-1\n */\nfunction parseModifierValue(hexValue: string | undefined): number {\n if (!hexValue) return 1;\n\n const parsed = parseInt(hexValue, 16);\n if (isNaN(parsed)) return 1;\n\n // Value is 0-255, convert to 0-1\n return parsed / 255;\n}\n\n/**\n * Parse RGB hex color to component values\n *\n * @param hex - 6-character hex color (no #)\n * @returns RGB object with r, g, b values 0-255\n */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n // Ensure 6 characters\n const normalized = hex.padStart(6, '0').slice(0, 6);\n\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n\n return {\n r: isNaN(r) ? 0 : r,\n g: isNaN(g) ? 0 : g,\n b: isNaN(b) ? 0 : b,\n };\n}\n\n/**\n * Convert RGB values to hex color\n *\n * @param r - Red 0-255\n * @param g - Green 0-255\n * @param b - Blue 0-255\n * @returns 6-character hex color (no #)\n */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, '0');\n\n return `${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();\n}\n\n/**\n * Convert RGB to HSL\n *\n * @param r - Red 0-255\n * @param g - Green 0-255\n * @param b - Blue 0-255\n * @returns HSL object with h (0-360), s (0-1), l (0-1)\n */\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n\n if (max === min) {\n return { h: 0, s: 0, l };\n }\n\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n let h: number;\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n default:\n h = 0;\n }\n\n return { h: h * 360, s, l };\n}\n\n/**\n * Convert HSL to RGB\n *\n * @param h - Hue 0-360\n * @param s - Saturation 0-1\n * @param l - Lightness 0-1\n * @returns RGB object with r, g, b values 0-255\n */\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h = h / 360;\n\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n}\n\n/**\n * Apply tint to a color (make lighter by blending with white)\n *\n * OOXML tint algorithm:\n * - Converts to HSL\n * - Adjusts luminance: newLum = lum + (1 - lum) * tint\n *\n * @param hex - 6-character hex color (no #)\n * @param tint - Tint value 0-1 (0 = no change, 1 = fully white)\n * @returns Modified hex color\n */\nfunction applyTint(hex: string, tint: number): string {\n if (tint <= 0 || tint >= 1) {\n return tint >= 1 ? 'FFFFFF' : hex;\n }\n\n const rgb = hexToRgb(hex);\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Apply tint: increase luminance toward white\n hsl.l = hsl.l + (1 - hsl.l) * tint;\n\n const newRgb = hslToRgb(hsl.h, hsl.s, hsl.l);\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b);\n}\n\n/**\n * Apply shade to a color (make darker by blending with black)\n *\n * OOXML shade algorithm:\n * - Converts to HSL\n * - Adjusts luminance: newLum = lum * shade\n *\n * @param hex - 6-character hex color (no #)\n * @param shade - Shade value 0-1 (0 = fully black, 1 = no change)\n * @returns Modified hex color\n */\nfunction applyShade(hex: string, shade: number): string {\n if (shade <= 0 || shade >= 1) {\n return shade <= 0 ? '000000' : hex;\n }\n\n const rgb = hexToRgb(hex);\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Apply shade: decrease luminance toward black\n hsl.l = hsl.l * shade;\n\n const newRgb = hslToRgb(hsl.h, hsl.s, hsl.l);\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b);\n}\n\n/**\n * Get a theme color by slot name\n *\n * @param theme - Theme object\n * @param slot - Color slot name\n * @returns Hex color (6 characters, no #)\n */\nfunction getThemeColorValue(theme: Theme | null | undefined, slot: ThemeColorSlot): string {\n // Map alias slots to actual color scheme keys\n const schemeKey = THEME_COLOR_ALIASES[slot] ?? slot;\n\n // Define the actual keys that exist on ThemeColorScheme\n const schemeKeys = [\n 'dk1',\n 'lt1',\n 'dk2',\n 'lt2',\n 'accent1',\n 'accent2',\n 'accent3',\n 'accent4',\n 'accent5',\n 'accent6',\n 'hlink',\n 'folHlink',\n ] as const;\n type SchemeKey = (typeof schemeKeys)[number];\n\n const isSchemeKey = (key: string): key is SchemeKey => schemeKeys.includes(key as SchemeKey);\n\n if (!theme?.colorScheme) {\n if (isSchemeKey(schemeKey)) {\n return DEFAULT_THEME_COLORS[schemeKey] ?? '000000';\n }\n return '000000';\n }\n\n if (isSchemeKey(schemeKey)) {\n return theme.colorScheme[schemeKey] ?? DEFAULT_THEME_COLORS[schemeKey] ?? '000000';\n }\n\n return '000000';\n}\n\n/**\n * Resolve a theme color name to a standard slot\n *\n * @param colorName - Theme color name (could be alias)\n * @returns Standard ThemeColorSlot or null if unknown\n */\nfunction resolveThemeColorSlot(colorName: string): ThemeColorSlot | null {\n if (!colorName) return null;\n\n const normalized = colorName.toLowerCase();\n const slot = THEME_COLOR_ALIASES[colorName] ?? THEME_COLOR_ALIASES[normalized];\n\n return slot ?? null;\n}\n\n/**\n * Resolve a ColorValue to a CSS color string\n *\n * @param color - ColorValue object with rgb, themeColor, tint/shade, or auto\n * @param theme - Theme for resolving theme colors\n * @param defaultColor - Default color if auto or undefined (default: black)\n * @returns CSS color string (e.g., \"#FF0000\" or \"inherit\")\n */\nexport function resolveColor(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined,\n defaultColor: string = '000000'\n): string {\n if (!color) {\n return `#${defaultColor}`;\n }\n\n // Handle \"auto\" color\n if (color.auto) {\n // Auto typically means black for text, but can be context-dependent\n return `#${defaultColor}`;\n }\n\n let hexColor: string;\n\n // Check for theme color first\n if (color.themeColor) {\n const slot = resolveThemeColorSlot(color.themeColor);\n if (slot) {\n hexColor = getThemeColorValue(theme, slot);\n } else {\n // Unknown theme color, use RGB if available or default\n hexColor = color.rgb ?? defaultColor;\n }\n\n // Apply tint/shade modifiers\n if (color.themeTint) {\n const tintValue = parseModifierValue(color.themeTint);\n hexColor = applyTint(hexColor, tintValue);\n } else if (color.themeShade) {\n const shadeValue = parseModifierValue(color.themeShade);\n hexColor = applyShade(hexColor, shadeValue);\n }\n } else if (color.rgb) {\n // Direct RGB value\n hexColor = color.rgb;\n } else {\n // No color specified\n hexColor = defaultColor;\n }\n\n // Ensure proper format\n return `#${hexColor.toUpperCase().replace(/^#/, '')}`;\n}\n\n/**\n * Resolve a highlight color name to CSS\n *\n * @param highlight - Highlight color name (e.g., \"yellow\", \"cyan\")\n * @returns CSS color string or empty string for \"none\"\n */\nexport function resolveHighlightColor(highlight: string | undefined): string {\n if (!highlight || highlight === 'none') {\n return '';\n }\n\n const hex = HIGHLIGHT_COLORS[highlight];\n return hex ? `#${hex}` : '';\n}\n\n/**\n * Resolve a shading fill or pattern color to CSS\n *\n * @param color - ColorValue for fill\n * @param theme - Theme for resolving theme colors\n * @returns CSS color string\n */\nexport function resolveShadingColor(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined\n): string {\n if (!color) return '';\n\n // For shading, \"auto\" typically means transparent\n if (color.auto) {\n return 'transparent';\n }\n\n return resolveColor(color, theme);\n}\n\n/**\n * Check if a color is effectively black\n *\n * @param color - ColorValue object\n * @param theme - Theme for resolving theme colors\n * @returns True if color resolves to black or very dark\n */\nexport function isBlack(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined\n): boolean {\n if (!color) return false;\n if (color.auto) return true;\n\n const resolved = resolveColor(color, theme);\n const hex = resolved.replace(/^#/, '').toLowerCase();\n\n // Check if it's black or very dark\n const rgb = hexToRgb(hex);\n const luminance = (rgb.r + rgb.g + rgb.b) / 3;\n\n return luminance < 20;\n}\n\n/**\n * Check if a color is effectively white\n *\n * @param color - ColorValue object\n * @param theme - Theme for resolving theme colors\n * @returns True if color resolves to white or very light\n */\nexport function isWhite(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined\n): boolean {\n if (!color) return false;\n\n const resolved = resolveColor(color, theme);\n const hex = resolved.replace(/^#/, '').toLowerCase();\n\n // Check if it's white or very light\n const rgb = hexToRgb(hex);\n const luminance = (rgb.r + rgb.g + rgb.b) / 3;\n\n return luminance > 235;\n}\n\n/**\n * Get contrasting text color for a background\n *\n * @param backgroundColor - Background ColorValue\n * @param theme - Theme for resolving theme colors\n * @returns Black or white hex color for best contrast\n */\nexport function getContrastingColor(\n backgroundColor: ColorValue | undefined | null,\n theme: Theme | null | undefined\n): string {\n if (!backgroundColor) return '#000000';\n\n const bgResolved = resolveColor(backgroundColor, theme);\n const bgHex = bgResolved.replace(/^#/, '');\n const bgRgb = hexToRgb(bgHex);\n\n // Calculate relative luminance using sRGB formula\n const luminance = (0.299 * bgRgb.r + 0.587 * bgRgb.g + 0.114 * bgRgb.b) / 255;\n\n // Return black for light backgrounds, white for dark\n return luminance > 0.5 ? '#000000' : '#FFFFFF';\n}\n\n/**\n * Parse a color string (various formats) to ColorValue\n *\n * @param colorString - Color string like \"FF0000\", \"auto\", or theme color name\n * @returns ColorValue object\n */\nexport function parseColorString(colorString: string | undefined): ColorValue | undefined {\n if (!colorString) return undefined;\n\n const normalized = colorString.trim();\n\n if (normalized.toLowerCase() === 'auto') {\n return { auto: true };\n }\n\n // Check if it's a theme color name\n const themeSlot = resolveThemeColorSlot(normalized);\n if (themeSlot) {\n return { themeColor: themeSlot };\n }\n\n // Assume it's an RGB hex value\n // Remove # if present and normalize to 6 chars\n const hex = normalized.replace(/^#/, '').toUpperCase();\n\n // Validate hex format\n if (/^[0-9A-F]{6}$/i.test(hex)) {\n return { rgb: hex };\n }\n\n // 3-character shorthand\n if (/^[0-9A-F]{3}$/i.test(hex)) {\n const expanded = hex\n .split('')\n .map((c) => c + c)\n .join('');\n return { rgb: expanded };\n }\n\n // Unknown format, return as RGB anyway\n return { rgb: hex.padStart(6, '0').slice(0, 6) };\n}\n\n/**\n * Create a ColorValue from theme color reference\n *\n * @param themeColor - Theme color slot name\n * @param tint - Optional tint modifier\n * @param shade - Optional shade modifier\n * @returns ColorValue object\n */\nexport function createThemeColor(\n themeColor: ThemeColorSlot,\n tint?: number,\n shade?: number\n): ColorValue {\n const result: ColorValue = { themeColor };\n\n if (tint !== undefined && tint > 0 && tint < 1) {\n result.themeTint = Math.round(tint * 255)\n .toString(16)\n .toUpperCase()\n .padStart(2, '0');\n }\n\n if (shade !== undefined && shade > 0 && shade < 1) {\n result.themeShade = Math.round(shade * 255)\n .toString(16)\n .toUpperCase()\n .padStart(2, '0');\n }\n\n return result;\n}\n\n/**\n * Create a ColorValue from RGB hex\n *\n * @param hex - 6-character hex color (no #)\n * @returns ColorValue object\n */\nexport function createRgbColor(hex: string): ColorValue {\n return { rgb: hex.replace(/^#/, '').toUpperCase() };\n}\n\n/**\n * Darken a color by a percentage\n *\n * @param color - ColorValue to darken\n * @param theme - Theme for resolving\n * @param percent - Percentage to darken (0-100)\n * @returns CSS color string\n */\nexport function darkenColor(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined,\n percent: number\n): string {\n const resolved = resolveColor(color, theme);\n const hex = resolved.replace(/^#/, '');\n const shade = 1 - percent / 100;\n return `#${applyShade(hex, shade)}`;\n}\n\n/**\n * Lighten a color by a percentage\n *\n * @param color - ColorValue to lighten\n * @param theme - Theme for resolving\n * @param percent - Percentage to lighten (0-100)\n * @returns CSS color string\n */\nexport function lightenColor(\n color: ColorValue | undefined | null,\n theme: Theme | null | undefined,\n percent: number\n): string {\n const resolved = resolveColor(color, theme);\n const hex = resolved.replace(/^#/, '');\n const tint = percent / 100;\n return `#${applyTint(hex, tint)}`;\n}\n\n/**\n * Blend two colors together\n *\n * @param color1 - First color\n * @param color2 - Second color\n * @param ratio - Blend ratio (0 = all color1, 1 = all color2)\n * @param theme - Theme for resolving\n * @returns CSS color string\n */\nexport function blendColors(\n color1: ColorValue | undefined | null,\n color2: ColorValue | undefined | null,\n ratio: number,\n theme: Theme | null | undefined\n): string {\n const resolved1 = resolveColor(color1, theme).replace(/^#/, '');\n const resolved2 = resolveColor(color2, theme).replace(/^#/, '');\n\n const rgb1 = hexToRgb(resolved1);\n const rgb2 = hexToRgb(resolved2);\n\n const blended = {\n r: Math.round(rgb1.r * (1 - ratio) + rgb2.r * ratio),\n g: Math.round(rgb1.g * (1 - ratio) + rgb2.g * ratio),\n b: Math.round(rgb1.b * (1 - ratio) + rgb2.b * ratio),\n };\n\n return `#${rgbToHex(blended.r, blended.g, blended.b)}`;\n}\n\n/**\n * Check if two colors are equal\n *\n * @param color1 - First color\n * @param color2 - Second color\n * @param theme - Theme for resolving\n * @returns True if colors resolve to the same value\n */\nexport function colorsEqual(\n color1: ColorValue | undefined | null,\n color2: ColorValue | undefined | null,\n theme: Theme | null | undefined\n): boolean {\n if (!color1 && !color2) return true;\n if (!color1 || !color2) return false;\n\n const resolved1 = resolveColor(color1, theme).toUpperCase();\n const resolved2 = resolveColor(color2, theme).toUpperCase();\n\n return resolved1 === resolved2;\n}\n","/**\n * Unit Conversion Utilities - Convert OOXML units to CSS/pixels\n *\n * OOXML uses various unit systems that need conversion for rendering:\n * - Twips: 1/20 of a point (1440 twips = 1 inch)\n * - EMUs (English Metric Units): 914400 EMUs = 1 inch\n * - Half-points: 1/2 of a point (144 half-points = 1 inch)\n * - Points: 72 points = 1 inch\n * - Eighths of a point: 1/8 of a point (576 eighths = 1 inch)\n *\n * Standard assumption: 96 DPI (pixels per inch)\n */\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** Standard DPI for screen rendering */\nconst STANDARD_DPI = 96;\n\n/** Twips per inch (1 inch = 1440 twips) */\nexport const TWIPS_PER_INCH = 1440;\n\n/** EMUs per inch (1 inch = 914400 EMUs) */\nconst EMUS_PER_INCH = 914400;\n\n/** Points per inch (1 inch = 72 points) */\nconst POINTS_PER_INCH = 72;\n\n/** Half-points per inch (1 inch = 144 half-points) */\nconst HALF_POINTS_PER_INCH = 144;\n\n/** Eighths of a point per inch (1 inch = 576) */\nconst EIGHTHS_PER_INCH = 576;\n\n/** Pixels per inch at standard DPI */\nexport const PIXELS_PER_INCH = STANDARD_DPI;\n\n// ============================================================================\n// TWIPS CONVERSIONS\n// ============================================================================\n\n/**\n * Convert twips to pixels (at 96 DPI)\n *\n * 1 inch = 1440 twips = 96 pixels\n * → 1 twip = 96/1440 pixels = 1/15 pixels\n */\nexport function twipsToPixels(twips: number): number {\n return (twips / TWIPS_PER_INCH) * PIXELS_PER_INCH;\n}\n\n/**\n * Convert pixels to twips\n */\nexport function pixelsToTwips(px: number): number {\n return (px / PIXELS_PER_INCH) * TWIPS_PER_INCH;\n}\n\n// ============================================================================\n// EMU CONVERSIONS\n// ============================================================================\n\n/**\n * Convert EMUs to pixels (at 96 DPI)\n *\n * 1 inch = 914400 EMUs = 96 pixels\n */\nexport function emuToPixels(emu: number): number {\n return (emu / EMUS_PER_INCH) * PIXELS_PER_INCH;\n}\n\n/**\n * Convert pixels to EMUs\n */\nexport function pixelsToEmu(px: number): number {\n return (px / PIXELS_PER_INCH) * EMUS_PER_INCH;\n}\n\n/**\n * Convert EMUs to twips\n */\nexport function emuToTwips(emu: number): number {\n return (emu / EMUS_PER_INCH) * TWIPS_PER_INCH;\n}\n\n/**\n * Convert twips to EMUs\n */\nexport function twipsToEmu(twips: number): number {\n return (twips / TWIPS_PER_INCH) * EMUS_PER_INCH;\n}\n\n// ============================================================================\n// POINT CONVERSIONS\n// ============================================================================\n\n/**\n * Convert points to pixels (at 96 DPI)\n *\n * 1 inch = 72 points = 96 pixels\n * → 1 point = 96/72 pixels = 4/3 pixels\n */\nexport function pointsToPixels(points: number): number {\n return (points / POINTS_PER_INCH) * PIXELS_PER_INCH;\n}\n\n// ============================================================================\n// HALF-POINT CONVERSIONS\n// ============================================================================\n\n/**\n * Convert half-points to pixels (at 96 DPI)\n *\n * Half-points are commonly used for font sizes in OOXML (w:sz).\n */\nexport function halfPointsToPixels(halfPoints: number): number {\n return (halfPoints / HALF_POINTS_PER_INCH) * PIXELS_PER_INCH;\n}\n\n/**\n * Convert half-points to points\n */\nexport function halfPointsToPoints(halfPoints: number): number {\n return halfPoints / 2;\n}\n\n/**\n * Convert points to half-points\n */\nexport function pointsToHalfPoints(points: number): number {\n return points * 2;\n}\n\n// ============================================================================\n// EIGHTHS OF A POINT CONVERSIONS\n// ============================================================================\n\n/**\n * Convert eighths of a point to pixels (at 96 DPI)\n *\n * Eighths of a point are used for border widths in OOXML.\n */\nexport function eighthsToPixels(eighths: number): number {\n return (eighths / EIGHTHS_PER_INCH) * PIXELS_PER_INCH;\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Round a pixel value to avoid sub-pixel rendering issues\n */\nexport function roundPixels(px: number, decimalPlaces: number = 2): number {\n const factor = Math.pow(10, decimalPlaces);\n return Math.round(px * factor) / factor;\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n// ============================================================================\n// CSS VALUE FORMATTERS\n// ============================================================================\n\n/**\n * Format a pixel value as CSS string\n */\nexport function formatPx(px: number): string {\n return `${roundPixels(px)}px`;\n}\n"]}