@eigenpal/docx-js-editor 0.0.19 → 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 (201) hide show
  1. package/README.md +83 -0
  2. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  3. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  4. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  5. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  6. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  7. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  8. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  9. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  10. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  11. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  12. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  13. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  14. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  15. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  17. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  18. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  19. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  20. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  21. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  22. package/dist/chunk-32HMU2UV.js +111 -0
  23. package/dist/chunk-4CUGBNL2.cjs +1 -0
  24. package/dist/chunk-5GFXHUMP.js +1 -0
  25. package/dist/chunk-6NDMKJIE.js +9 -0
  26. package/dist/chunk-6NYA53QC.cjs +258 -0
  27. package/dist/chunk-7KJ3YVDQ.js +10 -0
  28. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  29. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  30. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  31. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  32. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  33. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  34. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  35. package/dist/chunk-FXJAIFPR.js +59 -0
  36. package/dist/chunk-GICVJSFJ.cjs +9 -0
  37. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  38. package/dist/chunk-HT2Z33YM.cjs +111 -0
  39. package/dist/chunk-JRRTZZ72.cjs +1 -0
  40. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  41. package/dist/chunk-P3AEZKQO.cjs +3 -0
  42. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  43. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  44. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  45. package/dist/chunk-Q7YYC75E.js +258 -0
  46. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  47. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  48. package/dist/chunk-USRMBYI6.js +3 -0
  49. package/dist/chunk-UTWPV2I4.js +26 -0
  50. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  51. package/dist/chunk-XQNCLN4T.cjs +3 -0
  52. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  53. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  54. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  55. package/dist/chunk-ZTVQA46Q.js +1 -0
  56. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  57. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  58. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  59. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  60. package/dist/core-plugins-reexport.cjs +1 -2
  61. package/dist/core-plugins-reexport.d.cts +4 -4
  62. package/dist/core-plugins-reexport.d.ts +4 -4
  63. package/dist/core-plugins-reexport.js +1 -2
  64. package/dist/core-reexport.cjs +1 -2
  65. package/dist/core-reexport.d.cts +10 -10
  66. package/dist/core-reexport.d.ts +10 -10
  67. package/dist/core-reexport.js +1 -2
  68. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  69. package/dist/executor-L2MVKMXO.js +1 -0
  70. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  71. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  72. package/dist/headless-reexport.cjs +4 -5
  73. package/dist/headless-reexport.d.cts +7 -7
  74. package/dist/headless-reexport.d.ts +7 -7
  75. package/dist/headless-reexport.js +4 -5
  76. package/dist/index.cjs +6 -7
  77. package/dist/index.css +0 -1
  78. package/dist/index.d.cts +12 -12
  79. package/dist/index.d.ts +12 -12
  80. package/dist/index.js +6 -7
  81. package/dist/lib-GD2QD2JK.js +1 -0
  82. package/dist/lib-HOLGQI5K.cjs +1 -0
  83. package/dist/mcp-reexport.cjs +9 -10
  84. package/dist/mcp-reexport.d.cts +2 -2
  85. package/dist/mcp-reexport.d.ts +2 -2
  86. package/dist/mcp-reexport.js +4 -5
  87. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  88. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  89. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  90. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  91. package/dist/react.cjs +1 -2
  92. package/dist/react.css +0 -1
  93. package/dist/react.d.cts +5 -5
  94. package/dist/react.d.ts +5 -5
  95. package/dist/react.js +1 -2
  96. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  97. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  98. package/dist/selectionRects-7QU337P5.cjs +1 -0
  99. package/dist/selectionRects-V5RC2BYX.js +1 -0
  100. package/dist/styles.css +1 -1
  101. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  102. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  103. package/dist/ui.cjs +1 -2
  104. package/dist/ui.d.cts +32 -85
  105. package/dist/ui.d.ts +32 -85
  106. package/dist/ui.js +1 -2
  107. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  108. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  109. package/package.json +2 -1
  110. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  112. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  114. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  115. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  117. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  118. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  119. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  120. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  121. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  123. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  124. package/dist/chunk-2CHPKB5A.cjs +0 -112
  125. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  126. package/dist/chunk-2QOEHCBX.js.map +0 -1
  127. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  128. package/dist/chunk-5DYSI4O4.cjs +0 -60
  129. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  130. package/dist/chunk-5FJXHXFV.cjs +0 -2
  131. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  132. package/dist/chunk-6FEWNF6B.js +0 -4
  133. package/dist/chunk-6FEWNF6B.js.map +0 -1
  134. package/dist/chunk-6LF5HZCV.js +0 -10
  135. package/dist/chunk-6LF5HZCV.js.map +0 -1
  136. package/dist/chunk-7JSPKVOW.js.map +0 -1
  137. package/dist/chunk-C33XDRDJ.cjs +0 -28
  138. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  139. package/dist/chunk-CV5WFE7K.js.map +0 -1
  140. package/dist/chunk-CXJRNISO.js +0 -2
  141. package/dist/chunk-CXJRNISO.js.map +0 -1
  142. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  143. package/dist/chunk-DP6Q75ZD.js +0 -28
  144. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  145. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  146. package/dist/chunk-FGVGZLBL.js.map +0 -1
  147. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  148. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  149. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  150. package/dist/chunk-JOYPFQW2.js.map +0 -1
  151. package/dist/chunk-L54YNLSE.js +0 -2
  152. package/dist/chunk-L54YNLSE.js.map +0 -1
  153. package/dist/chunk-LPGMLJMO.js +0 -259
  154. package/dist/chunk-LPGMLJMO.js.map +0 -1
  155. package/dist/chunk-M2T6XKT5.js.map +0 -1
  156. package/dist/chunk-OHG7ROFC.js +0 -11
  157. package/dist/chunk-OHG7ROFC.js.map +0 -1
  158. package/dist/chunk-PANKMCFX.cjs +0 -4
  159. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  160. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  161. package/dist/chunk-QDV75OJ4.js +0 -112
  162. package/dist/chunk-QDV75OJ4.js.map +0 -1
  163. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  164. package/dist/chunk-QVIZ775M.cjs +0 -259
  165. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  166. package/dist/chunk-RMUMR42R.cjs +0 -10
  167. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  168. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  169. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  170. package/dist/chunk-ULXNEG66.js +0 -60
  171. package/dist/chunk-ULXNEG66.js.map +0 -1
  172. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  173. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  174. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  175. package/dist/core-plugins-reexport.cjs.map +0 -1
  176. package/dist/core-plugins-reexport.js.map +0 -1
  177. package/dist/core-reexport.cjs.map +0 -1
  178. package/dist/core-reexport.js.map +0 -1
  179. package/dist/executor-K5RXUTTR.js +0 -2
  180. package/dist/executor-K5RXUTTR.js.map +0 -1
  181. package/dist/executor-XIPIU3H4.cjs +0 -2
  182. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  183. package/dist/headless-reexport.cjs.map +0 -1
  184. package/dist/headless-reexport.js.map +0 -1
  185. package/dist/index.cjs.map +0 -1
  186. package/dist/index.css.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/mcp-reexport.cjs.map +0 -1
  189. package/dist/mcp-reexport.js.map +0 -1
  190. package/dist/processTemplate-G37IM66O.js.map +0 -1
  191. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  192. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  193. package/dist/react.cjs.map +0 -1
  194. package/dist/react.css.map +0 -1
  195. package/dist/react.js.map +0 -1
  196. package/dist/selectionRects-6DU7HN7E.js +0 -2
  197. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  198. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  199. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  200. package/dist/ui.cjs.map +0 -1
  201. package/dist/ui.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/agent/executor.ts"],"names":["executeCommand","doc","command","pluginHandler","pluginRegistry","executeInsertText","executeReplaceText","executeDeleteText","executeFormatText","executeFormatParagraph","executeApplyStyle","executeInsertTable","executeInsertImage","executeInsertHyperlink","executeRemoveHyperlink","executeInsertParagraphBreak","executeMergeParagraphs","executeSplitParagraph","executeSetVariable","executeApplyVariables","_exhaustive","executeCommands","commands","currentDoc","cloneDocument","getBlockIndexForParagraph","body","paragraphIndex","currentParagraphIndex","i","getParagraphText","paragraph","text","item","content","child","createTextRun","formatting","insertTextAtOffset","offset","newContent","currentOffset","inserted","runText","c","runStart","runEnd","insertPos","deleteTextInParagraph","startOffset","endOffset","newText","applyFormattingInParagraph","overlapStart","overlapEnd","newDoc","blockIndex","start","end","startBlockIndex","startParagraph","startText","paragraphsToRemove","endBlockIndex","endParagraph","indicesToRemove","paragraphText","numPr","ilvl","isBullet","marker","num","n","abstractNum","a","level","l","rows","r","cells","cellText","table","imageRun","linkText","hyperlink","beforeContent","afterContent","newParagraph","baseParagraph","para","replaceVariablesInRun","run","name","value","pattern","replaceVariablesInParagraph","replaceVariablesInBlock","block","row","cell","cellBlock"],"mappings":"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","file":"chunk-GWBTKVFD.cjs","sourcesContent":["/**\n * Command Executor\n *\n * Executes agent commands on a document immutably:\n * - Handles all command types from AgentCommand\n * - Preserves surrounding formatting\n * - Returns new document (immutable updates)\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Run,\n TextContent,\n ParagraphContent,\n BlockContent,\n Table,\n TableRow,\n TableCell,\n TextFormatting,\n Image,\n Hyperlink,\n} from '../types/document';\n\nimport type {\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n FormatParagraphCommand,\n ApplyStyleCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n RemoveHyperlinkCommand,\n InsertParagraphBreakCommand,\n MergeParagraphsCommand,\n SplitParagraphCommand,\n SetVariableCommand,\n ApplyVariablesCommand,\n} from '../types/agentApi';\n\nimport { pluginRegistry } from '../core-plugins/registry';\n\n// ============================================================================\n// MAIN EXECUTOR\n// ============================================================================\n\n/**\n * Execute an agent command on a document\n * Returns a new document with the command applied (immutable)\n *\n * Dispatch order:\n * 1. Try plugin handlers first (allows plugins to override built-in commands)\n * 2. Fall back to built-in handlers\n *\n * @param doc - The document to modify\n * @param command - The command to execute\n * @returns New document with command applied\n */\nexport function executeCommand(doc: Document, command: AgentCommand): Document {\n // Try plugin handlers first\n const pluginHandler = pluginRegistry.getCommandHandler(command.type);\n if (pluginHandler) {\n // Plugin commands use a more flexible type\n return pluginHandler(doc, command as unknown as import('../core-plugins/types').PluginCommand);\n }\n\n // Fall back to built-in handlers\n switch (command.type) {\n case 'insertText':\n return executeInsertText(doc, command);\n case 'replaceText':\n return executeReplaceText(doc, command);\n case 'deleteText':\n return executeDeleteText(doc, command);\n case 'formatText':\n return executeFormatText(doc, command);\n case 'formatParagraph':\n return executeFormatParagraph(doc, command);\n case 'applyStyle':\n return executeApplyStyle(doc, command);\n case 'insertTable':\n return executeInsertTable(doc, command);\n case 'insertImage':\n return executeInsertImage(doc, command);\n case 'insertHyperlink':\n return executeInsertHyperlink(doc, command);\n case 'removeHyperlink':\n return executeRemoveHyperlink(doc, command);\n case 'insertParagraphBreak':\n return executeInsertParagraphBreak(doc, command);\n case 'mergeParagraphs':\n return executeMergeParagraphs(doc, command);\n case 'splitParagraph':\n return executeSplitParagraph(doc, command);\n case 'setVariable':\n return executeSetVariable(doc, command);\n case 'applyVariables':\n return executeApplyVariables(doc, command);\n default:\n // Exhaustive check - should never happen with proper types\n const _exhaustive: never = command;\n throw new Error(`Unknown command type: ${(_exhaustive as AgentCommand).type}`);\n }\n}\n\n/**\n * Execute multiple commands in sequence\n *\n * @param doc - The document to modify\n * @param commands - Commands to execute in order\n * @returns New document with all commands applied\n */\nexport function executeCommands(doc: Document, commands: AgentCommand[]): Document {\n return commands.reduce((currentDoc, command) => executeCommand(currentDoc, command), doc);\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Deep clone a document for immutable updates\n */\nfunction cloneDocument(doc: Document): Document {\n return JSON.parse(JSON.stringify(doc));\n}\n\n/**\n * Get the block index for a paragraph index\n */\nfunction getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number {\n let currentParagraphIndex = 0;\n for (let i = 0; i < body.content.length; i++) {\n if (body.content[i].type === 'paragraph') {\n if (currentParagraphIndex === paragraphIndex) {\n return i;\n }\n currentParagraphIndex++;\n }\n }\n return -1;\n}\n\n/**\n * Get plain text from a paragraph\n */\nfunction getParagraphText(paragraph: Paragraph): string {\n let text = '';\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n for (const content of item.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n for (const content of child.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n }\n }\n }\n }\n return text;\n}\n\n/**\n * Create a new run with text\n */\nfunction createTextRun(text: string, formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [\n {\n type: 'text',\n text,\n },\n ],\n };\n}\n\n/**\n * Insert text at a specific offset within a paragraph\n * Returns new paragraph content\n */\nfunction insertTextAtOffset(\n paragraph: Paragraph,\n offset: number,\n text: string,\n formatting?: TextFormatting\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n let inserted = false;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && offset >= runStart && offset <= runEnd) {\n // Insert within this run\n const insertPos = offset - runStart;\n\n if (insertPos > 0) {\n // Text before insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n // New text\n newContent.push(createTextRun(text, formatting || item.formatting));\n\n if (insertPos < runText.length) {\n // Text after insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n // If not inserted yet, append at the end\n if (!inserted) {\n newContent.push(createTextRun(text, formatting));\n }\n\n return newContent;\n}\n\n/**\n * Delete text in a range within a single paragraph\n */\nfunction deleteTextInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with deletion range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run\n newContent.push(item);\n } else {\n // Partial overlap\n let newText = '';\n\n if (runStart < startOffset) {\n // Keep text before start\n newText += runText.slice(0, startOffset - runStart);\n }\n\n if (runEnd > endOffset) {\n // Keep text after end\n newText += runText.slice(endOffset - runStart);\n }\n\n if (newText.length > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: newText }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n/**\n * Apply formatting to text in a range within a paragraph\n */\nfunction applyFormattingInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number,\n formatting: Partial<TextFormatting>\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with formatting range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run unchanged\n newContent.push(item);\n } else if (runStart >= startOffset && runEnd <= endOffset) {\n // Entire run is within range, apply formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n });\n } else {\n // Partial overlap - need to split run\n const overlapStart = Math.max(startOffset, runStart);\n const overlapEnd = Math.min(endOffset, runEnd);\n\n // Text before overlap\n if (runStart < overlapStart) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, overlapStart - runStart) }],\n });\n }\n\n // Overlapping text with formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n content: [\n {\n type: 'text',\n text: runText.slice(overlapStart - runStart, overlapEnd - runStart),\n },\n ],\n });\n\n // Text after overlap\n if (runEnd > overlapEnd) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(overlapEnd - runStart) }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n// ============================================================================\n// COMMAND IMPLEMENTATIONS\n// ============================================================================\n\n/**\n * Insert text at a position\n */\nfunction executeInsertText(doc: Document, command: InsertTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = insertTextAtOffset(\n paragraph,\n command.position.offset,\n command.text,\n command.formatting\n );\n\n return newDoc;\n}\n\n/**\n * Replace text in a range\n */\nfunction executeReplaceText(doc: Document, command: ReplaceTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Delete the range first\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Then insert the new text\n paragraph.content = insertTextAtOffset(\n paragraph,\n start.offset,\n command.text,\n command.formatting\n );\n } else {\n // Multiple paragraphs - simplify by deleting and inserting\n // Delete from start to end of first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n startParagraph.content = insertTextAtOffset(\n startParagraph,\n start.offset,\n command.text,\n command.formatting\n );\n\n // Delete intermediate paragraphs and beginning of last paragraph\n const paragraphsToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n paragraphsToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n // Remove in reverse order to preserve indices\n for (let i = paragraphsToRemove.length - 1; i >= 0; i--) {\n if (paragraphsToRemove[i] !== -1) {\n body.content.splice(paragraphsToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Delete text in a range\n */\nfunction executeDeleteText(doc: Document, command: DeleteTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n } else {\n // Multiple paragraphs\n // Truncate first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n\n // Delete intermediate paragraphs and truncate last\n const endBlockIndex = getBlockIndexForParagraph(body, end.paragraphIndex);\n const endParagraph = body.content[endBlockIndex] as Paragraph;\n endParagraph.content = deleteTextInParagraph(endParagraph, 0, end.offset);\n\n // Merge last paragraph content into first\n startParagraph.content.push(...endParagraph.content);\n\n // Remove paragraphs between start and end (inclusive of end)\n const indicesToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n indicesToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n if (indicesToRemove[i] !== -1) {\n body.content.splice(indicesToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply formatting to a range\n */\nfunction executeFormatText(doc: Document, command: FormatTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n start.offset,\n end.offset,\n command.formatting\n );\n } else {\n // Multiple paragraphs\n for (let i = start.paragraphIndex; i <= end.paragraphIndex; i++) {\n const blockIndex = getBlockIndexForParagraph(body, i);\n if (blockIndex === -1) continue;\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n let startOffset = 0;\n let endOffset = paragraphText.length;\n\n if (i === start.paragraphIndex) {\n startOffset = start.offset;\n }\n if (i === end.paragraphIndex) {\n endOffset = end.offset;\n }\n\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n startOffset,\n endOffset,\n command.formatting\n );\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply paragraph formatting\n */\nfunction executeFormatParagraph(doc: Document, command: FormatParagraphCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = { ...paragraph.formatting, ...command.formatting };\n\n // Handle listRendering when numPr changes\n if ('numPr' in command.formatting) {\n const numPr = command.formatting.numPr;\n if (numPr && numPr.numId !== undefined && numPr.numId !== 0) {\n // Setting a list - compute listRendering\n const ilvl = numPr.ilvl ?? 0;\n const isBullet = numPr.numId === 1; // numId 1 is typically bullets, 2 is numbered\n\n // Try to get marker from numbering definitions if available\n let marker = isBullet ? '•' : `${1}.`; // Default markers\n\n if (newDoc.package.numbering) {\n const num = newDoc.package.numbering.nums.find((n) => n.numId === numPr.numId);\n if (num) {\n const abstractNum = newDoc.package.numbering.abstractNums.find(\n (a) => a.abstractNumId === num.abstractNumId\n );\n if (abstractNum) {\n const level = abstractNum.levels.find((l) => l.ilvl === ilvl);\n if (level) {\n marker = level.lvlText || marker;\n }\n }\n }\n }\n\n paragraph.listRendering = {\n level: ilvl,\n numId: numPr.numId,\n marker,\n isBullet,\n };\n } else {\n // Removing list - clear listRendering\n delete paragraph.listRendering;\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply a named style to a paragraph\n */\nfunction executeApplyStyle(doc: Document, command: ApplyStyleCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = {\n ...paragraph.formatting,\n styleId: command.styleId,\n };\n\n return newDoc;\n}\n\n/**\n * Insert a table at a position\n */\nfunction executeInsertTable(doc: Document, command: InsertTableCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Create table structure\n const rows: TableRow[] = [];\n\n for (let r = 0; r < command.rows; r++) {\n const cells: TableCell[] = [];\n\n for (let c = 0; c < command.columns; c++) {\n const cellText = command.data?.[r]?.[c] || '';\n cells.push({\n type: 'tableCell',\n content: [\n {\n type: 'paragraph',\n content: cellText ? [createTextRun(cellText)] : [],\n },\n ],\n });\n }\n\n rows.push({\n type: 'tableRow',\n formatting: r === 0 && command.hasHeader ? { header: true } : undefined,\n cells,\n });\n }\n\n const table: Table = {\n type: 'table',\n rows,\n };\n\n // Insert table after the specified paragraph\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n body.content.push(table);\n } else {\n body.content.splice(blockIndex + 1, 0, table);\n }\n\n return newDoc;\n}\n\n/**\n * Insert an image at a position\n */\nfunction executeInsertImage(doc: Document, command: InsertImageCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Create image\n const image: Image = {\n type: 'image',\n rId: `rId_img_${Date.now()}`,\n src: command.src,\n alt: command.alt,\n size: {\n width: (command.width || 100) * 914400, // Convert pixels to EMU\n height: (command.height || 100) * 914400,\n },\n wrap: { type: 'inline' },\n };\n\n // Create run with drawing content\n const imageRun: Run = {\n type: 'run',\n content: [\n {\n type: 'drawing',\n image,\n },\n ],\n };\n\n // Insert image run at offset\n const newContent = insertTextAtOffset(paragraph, command.position.offset, '', undefined);\n // Find insertion point and add image\n let inserted = false;\n let currentOffset = 0;\n\n for (let i = 0; i < newContent.length; i++) {\n const item = newContent[i];\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n currentOffset += runText.length;\n\n if (!inserted && currentOffset >= command.position.offset) {\n newContent.splice(i + 1, 0, imageRun);\n inserted = true;\n break;\n }\n }\n }\n\n if (!inserted) {\n newContent.push(imageRun);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a hyperlink at a range\n */\nfunction executeInsertHyperlink(doc: Document, command: InsertHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex !== end.paragraphIndex) {\n throw new Error('Hyperlinks cannot span multiple paragraphs');\n }\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Get the text that will become the link\n const linkText = command.displayText || paragraphText.slice(start.offset, end.offset);\n\n // Delete the original text\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Create hyperlink\n const hyperlink: Hyperlink = {\n type: 'hyperlink',\n href: command.url,\n tooltip: command.tooltip,\n children: [createTextRun(linkText)],\n };\n\n // Insert hyperlink at position\n let inserted = false;\n let currentOffset = 0;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && currentOffset <= start.offset && start.offset <= runEnd) {\n const insertPos = start.offset - currentOffset;\n\n if (insertPos > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n newContent.push(hyperlink);\n\n if (insertPos < runText.length) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n if (!inserted) {\n newContent.push(hyperlink);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Remove a hyperlink but keep the text\n */\nfunction executeRemoveHyperlink(doc: Document, command: RemoveHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start } = command.range;\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'hyperlink') {\n // Convert hyperlink children to regular runs\n for (const child of item.children) {\n if (child.type === 'run') {\n newContent.push(child);\n }\n }\n } else {\n newContent.push(item);\n }\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a paragraph break\n */\nfunction executeInsertParagraphBreak(\n doc: Document,\n command: InsertParagraphBreakCommand\n): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Split the paragraph at the offset\n const beforeContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n command.position.offset,\n paragraphText.length\n );\n\n const afterContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n 0,\n command.position.offset\n );\n\n // Update current paragraph with content before break\n paragraph.content = beforeContent;\n\n // Create new paragraph with content after break\n const newParagraph: Paragraph = {\n type: 'paragraph',\n formatting: paragraph.formatting,\n content: afterContent,\n };\n\n // Insert new paragraph after current one\n body.content.splice(blockIndex + 1, 0, newParagraph);\n\n return newDoc;\n}\n\n/**\n * Merge paragraphs\n */\nfunction executeMergeParagraphs(doc: Document, command: MergeParagraphsCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const startBlockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (startBlockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const baseParagraph = body.content[startBlockIndex] as Paragraph;\n\n // Collect all content from paragraphs to merge\n const indicesToRemove: number[] = [];\n\n for (let i = 1; i <= command.count; i++) {\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex + i);\n if (blockIndex !== -1) {\n const para = body.content[blockIndex] as Paragraph;\n baseParagraph.content.push(...para.content);\n indicesToRemove.push(blockIndex);\n }\n }\n\n // Remove merged paragraphs in reverse order\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n body.content.splice(indicesToRemove[i], 1);\n }\n\n return newDoc;\n}\n\n/**\n * Split a paragraph at a position\n */\nfunction executeSplitParagraph(doc: Document, command: SplitParagraphCommand): Document {\n // Split is the same as insert paragraph break\n return executeInsertParagraphBreak(doc, {\n type: 'insertParagraphBreak',\n position: command.position,\n });\n}\n\n/**\n * Set a template variable value\n */\nfunction executeSetVariable(doc: Document, command: SetVariableCommand): Document {\n const newDoc = cloneDocument(doc);\n\n // Store variable in document for later application\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n\n if (!newDoc.templateVariables.includes(command.name)) {\n newDoc.templateVariables.push(command.name);\n }\n\n // Note: Actual variable substitution happens in applyVariables\n return newDoc;\n}\n\n/**\n * Apply all template variables\n */\nfunction executeApplyVariables(doc: Document, command: ApplyVariablesCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Replace {variable} patterns in all text content\n function replaceVariablesInRun(run: Run): void {\n for (const content of run.content) {\n if (content.type === 'text') {\n for (const [name, value] of Object.entries(command.values)) {\n const pattern = new RegExp(`\\\\{${name}\\\\}`, 'g');\n content.text = content.text.replace(pattern, value);\n }\n }\n }\n }\n\n function replaceVariablesInParagraph(paragraph: Paragraph): void {\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n replaceVariablesInRun(item);\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n replaceVariablesInRun(child);\n }\n }\n }\n }\n }\n\n function replaceVariablesInBlock(block: BlockContent): void {\n if (block.type === 'paragraph') {\n replaceVariablesInParagraph(block);\n } else if (block.type === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const cellBlock of cell.content) {\n replaceVariablesInBlock(cellBlock);\n }\n }\n }\n }\n }\n\n for (const block of body.content) {\n replaceVariablesInBlock(block);\n }\n\n return newDoc;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/agent/executor.ts"],"names":["executeCommand","doc","command","pluginHandler","pluginRegistry","executeInsertText","executeReplaceText","executeDeleteText","executeFormatText","executeFormatParagraph","executeApplyStyle","executeInsertTable","executeInsertImage","executeInsertHyperlink","executeRemoveHyperlink","executeInsertParagraphBreak","executeMergeParagraphs","executeSplitParagraph","executeSetVariable","executeApplyVariables","_exhaustive","executeCommands","commands","currentDoc","cloneDocument","getBlockIndexForParagraph","body","paragraphIndex","currentParagraphIndex","i","getParagraphText","paragraph","text","item","content","child","createTextRun","formatting","insertTextAtOffset","offset","newContent","currentOffset","inserted","runText","c","runStart","runEnd","insertPos","deleteTextInParagraph","startOffset","endOffset","newText","applyFormattingInParagraph","overlapStart","overlapEnd","newDoc","blockIndex","start","end","startBlockIndex","startParagraph","startText","paragraphsToRemove","endBlockIndex","endParagraph","indicesToRemove","paragraphText","numPr","ilvl","isBullet","marker","num","n","abstractNum","a","level","l","rows","r","cells","cellText","table","imageRun","linkText","hyperlink","beforeContent","afterContent","newParagraph","baseParagraph","para","replaceVariablesInRun","run","name","value","pattern","replaceVariablesInParagraph","replaceVariablesInBlock","block","row","cell","cellBlock"],"mappings":"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","file":"chunk-JOYPFQW2.js","sourcesContent":["/**\n * Command Executor\n *\n * Executes agent commands on a document immutably:\n * - Handles all command types from AgentCommand\n * - Preserves surrounding formatting\n * - Returns new document (immutable updates)\n */\n\nimport type {\n Document,\n DocumentBody,\n Paragraph,\n Run,\n TextContent,\n ParagraphContent,\n BlockContent,\n Table,\n TableRow,\n TableCell,\n TextFormatting,\n Image,\n Hyperlink,\n} from '../types/document';\n\nimport type {\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n FormatParagraphCommand,\n ApplyStyleCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n RemoveHyperlinkCommand,\n InsertParagraphBreakCommand,\n MergeParagraphsCommand,\n SplitParagraphCommand,\n SetVariableCommand,\n ApplyVariablesCommand,\n} from '../types/agentApi';\n\nimport { pluginRegistry } from '../core-plugins/registry';\n\n// ============================================================================\n// MAIN EXECUTOR\n// ============================================================================\n\n/**\n * Execute an agent command on a document\n * Returns a new document with the command applied (immutable)\n *\n * Dispatch order:\n * 1. Try plugin handlers first (allows plugins to override built-in commands)\n * 2. Fall back to built-in handlers\n *\n * @param doc - The document to modify\n * @param command - The command to execute\n * @returns New document with command applied\n */\nexport function executeCommand(doc: Document, command: AgentCommand): Document {\n // Try plugin handlers first\n const pluginHandler = pluginRegistry.getCommandHandler(command.type);\n if (pluginHandler) {\n // Plugin commands use a more flexible type\n return pluginHandler(doc, command as unknown as import('../core-plugins/types').PluginCommand);\n }\n\n // Fall back to built-in handlers\n switch (command.type) {\n case 'insertText':\n return executeInsertText(doc, command);\n case 'replaceText':\n return executeReplaceText(doc, command);\n case 'deleteText':\n return executeDeleteText(doc, command);\n case 'formatText':\n return executeFormatText(doc, command);\n case 'formatParagraph':\n return executeFormatParagraph(doc, command);\n case 'applyStyle':\n return executeApplyStyle(doc, command);\n case 'insertTable':\n return executeInsertTable(doc, command);\n case 'insertImage':\n return executeInsertImage(doc, command);\n case 'insertHyperlink':\n return executeInsertHyperlink(doc, command);\n case 'removeHyperlink':\n return executeRemoveHyperlink(doc, command);\n case 'insertParagraphBreak':\n return executeInsertParagraphBreak(doc, command);\n case 'mergeParagraphs':\n return executeMergeParagraphs(doc, command);\n case 'splitParagraph':\n return executeSplitParagraph(doc, command);\n case 'setVariable':\n return executeSetVariable(doc, command);\n case 'applyVariables':\n return executeApplyVariables(doc, command);\n default:\n // Exhaustive check - should never happen with proper types\n const _exhaustive: never = command;\n throw new Error(`Unknown command type: ${(_exhaustive as AgentCommand).type}`);\n }\n}\n\n/**\n * Execute multiple commands in sequence\n *\n * @param doc - The document to modify\n * @param commands - Commands to execute in order\n * @returns New document with all commands applied\n */\nexport function executeCommands(doc: Document, commands: AgentCommand[]): Document {\n return commands.reduce((currentDoc, command) => executeCommand(currentDoc, command), doc);\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Deep clone a document for immutable updates\n */\nfunction cloneDocument(doc: Document): Document {\n return JSON.parse(JSON.stringify(doc));\n}\n\n/**\n * Get the block index for a paragraph index\n */\nfunction getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number {\n let currentParagraphIndex = 0;\n for (let i = 0; i < body.content.length; i++) {\n if (body.content[i].type === 'paragraph') {\n if (currentParagraphIndex === paragraphIndex) {\n return i;\n }\n currentParagraphIndex++;\n }\n }\n return -1;\n}\n\n/**\n * Get plain text from a paragraph\n */\nfunction getParagraphText(paragraph: Paragraph): string {\n let text = '';\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n for (const content of item.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n for (const content of child.content) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n }\n }\n }\n }\n return text;\n}\n\n/**\n * Create a new run with text\n */\nfunction createTextRun(text: string, formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [\n {\n type: 'text',\n text,\n },\n ],\n };\n}\n\n/**\n * Insert text at a specific offset within a paragraph\n * Returns new paragraph content\n */\nfunction insertTextAtOffset(\n paragraph: Paragraph,\n offset: number,\n text: string,\n formatting?: TextFormatting\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n let inserted = false;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && offset >= runStart && offset <= runEnd) {\n // Insert within this run\n const insertPos = offset - runStart;\n\n if (insertPos > 0) {\n // Text before insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n // New text\n newContent.push(createTextRun(text, formatting || item.formatting));\n\n if (insertPos < runText.length) {\n // Text after insertion point\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n // If not inserted yet, append at the end\n if (!inserted) {\n newContent.push(createTextRun(text, formatting));\n }\n\n return newContent;\n}\n\n/**\n * Delete text in a range within a single paragraph\n */\nfunction deleteTextInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with deletion range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run\n newContent.push(item);\n } else {\n // Partial overlap\n let newText = '';\n\n if (runStart < startOffset) {\n // Keep text before start\n newText += runText.slice(0, startOffset - runStart);\n }\n\n if (runEnd > endOffset) {\n // Keep text after end\n newText += runText.slice(endOffset - runStart);\n }\n\n if (newText.length > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: newText }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n/**\n * Apply formatting to text in a range within a paragraph\n */\nfunction applyFormattingInParagraph(\n paragraph: Paragraph,\n startOffset: number,\n endOffset: number,\n formatting: Partial<TextFormatting>\n): ParagraphContent[] {\n const newContent: ParagraphContent[] = [];\n let currentOffset = 0;\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runStart = currentOffset;\n const runEnd = currentOffset + runText.length;\n\n // Check if run overlaps with formatting range\n if (runEnd <= startOffset || runStart >= endOffset) {\n // No overlap, keep entire run unchanged\n newContent.push(item);\n } else if (runStart >= startOffset && runEnd <= endOffset) {\n // Entire run is within range, apply formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n });\n } else {\n // Partial overlap - need to split run\n const overlapStart = Math.max(startOffset, runStart);\n const overlapEnd = Math.min(endOffset, runEnd);\n\n // Text before overlap\n if (runStart < overlapStart) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, overlapStart - runStart) }],\n });\n }\n\n // Overlapping text with formatting\n newContent.push({\n ...item,\n formatting: { ...item.formatting, ...formatting },\n content: [\n {\n type: 'text',\n text: runText.slice(overlapStart - runStart, overlapEnd - runStart),\n },\n ],\n });\n\n // Text after overlap\n if (runEnd > overlapEnd) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(overlapEnd - runStart) }],\n });\n }\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n return newContent;\n}\n\n// ============================================================================\n// COMMAND IMPLEMENTATIONS\n// ============================================================================\n\n/**\n * Insert text at a position\n */\nfunction executeInsertText(doc: Document, command: InsertTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = insertTextAtOffset(\n paragraph,\n command.position.offset,\n command.text,\n command.formatting\n );\n\n return newDoc;\n}\n\n/**\n * Replace text in a range\n */\nfunction executeReplaceText(doc: Document, command: ReplaceTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Delete the range first\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Then insert the new text\n paragraph.content = insertTextAtOffset(\n paragraph,\n start.offset,\n command.text,\n command.formatting\n );\n } else {\n // Multiple paragraphs - simplify by deleting and inserting\n // Delete from start to end of first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n startParagraph.content = insertTextAtOffset(\n startParagraph,\n start.offset,\n command.text,\n command.formatting\n );\n\n // Delete intermediate paragraphs and beginning of last paragraph\n const paragraphsToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n paragraphsToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n // Remove in reverse order to preserve indices\n for (let i = paragraphsToRemove.length - 1; i >= 0; i--) {\n if (paragraphsToRemove[i] !== -1) {\n body.content.splice(paragraphsToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Delete text in a range\n */\nfunction executeDeleteText(doc: Document, command: DeleteTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n } else {\n // Multiple paragraphs\n // Truncate first paragraph\n const startBlockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n const startParagraph = body.content[startBlockIndex] as Paragraph;\n const startText = getParagraphText(startParagraph);\n startParagraph.content = deleteTextInParagraph(startParagraph, start.offset, startText.length);\n\n // Delete intermediate paragraphs and truncate last\n const endBlockIndex = getBlockIndexForParagraph(body, end.paragraphIndex);\n const endParagraph = body.content[endBlockIndex] as Paragraph;\n endParagraph.content = deleteTextInParagraph(endParagraph, 0, end.offset);\n\n // Merge last paragraph content into first\n startParagraph.content.push(...endParagraph.content);\n\n // Remove paragraphs between start and end (inclusive of end)\n const indicesToRemove: number[] = [];\n for (let i = start.paragraphIndex + 1; i <= end.paragraphIndex; i++) {\n indicesToRemove.push(getBlockIndexForParagraph(body, i));\n }\n\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n if (indicesToRemove[i] !== -1) {\n body.content.splice(indicesToRemove[i], 1);\n }\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply formatting to a range\n */\nfunction executeFormatText(doc: Document, command: FormatTextCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex === end.paragraphIndex) {\n // Same paragraph\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n start.offset,\n end.offset,\n command.formatting\n );\n } else {\n // Multiple paragraphs\n for (let i = start.paragraphIndex; i <= end.paragraphIndex; i++) {\n const blockIndex = getBlockIndexForParagraph(body, i);\n if (blockIndex === -1) continue;\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n let startOffset = 0;\n let endOffset = paragraphText.length;\n\n if (i === start.paragraphIndex) {\n startOffset = start.offset;\n }\n if (i === end.paragraphIndex) {\n endOffset = end.offset;\n }\n\n paragraph.content = applyFormattingInParagraph(\n paragraph,\n startOffset,\n endOffset,\n command.formatting\n );\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply paragraph formatting\n */\nfunction executeFormatParagraph(doc: Document, command: FormatParagraphCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = { ...paragraph.formatting, ...command.formatting };\n\n // Handle listRendering when numPr changes\n if ('numPr' in command.formatting) {\n const numPr = command.formatting.numPr;\n if (numPr && numPr.numId !== undefined && numPr.numId !== 0) {\n // Setting a list - compute listRendering\n const ilvl = numPr.ilvl ?? 0;\n const isBullet = numPr.numId === 1; // numId 1 is typically bullets, 2 is numbered\n\n // Try to get marker from numbering definitions if available\n let marker = isBullet ? '•' : `${1}.`; // Default markers\n\n if (newDoc.package.numbering) {\n const num = newDoc.package.numbering.nums.find((n) => n.numId === numPr.numId);\n if (num) {\n const abstractNum = newDoc.package.numbering.abstractNums.find(\n (a) => a.abstractNumId === num.abstractNumId\n );\n if (abstractNum) {\n const level = abstractNum.levels.find((l) => l.ilvl === ilvl);\n if (level) {\n marker = level.lvlText || marker;\n }\n }\n }\n }\n\n paragraph.listRendering = {\n level: ilvl,\n numId: numPr.numId,\n marker,\n isBullet,\n };\n } else {\n // Removing list - clear listRendering\n delete paragraph.listRendering;\n }\n }\n\n return newDoc;\n}\n\n/**\n * Apply a named style to a paragraph\n */\nfunction executeApplyStyle(doc: Document, command: ApplyStyleCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n paragraph.formatting = {\n ...paragraph.formatting,\n styleId: command.styleId,\n };\n\n return newDoc;\n}\n\n/**\n * Insert a table at a position\n */\nfunction executeInsertTable(doc: Document, command: InsertTableCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Create table structure\n const rows: TableRow[] = [];\n\n for (let r = 0; r < command.rows; r++) {\n const cells: TableCell[] = [];\n\n for (let c = 0; c < command.columns; c++) {\n const cellText = command.data?.[r]?.[c] || '';\n cells.push({\n type: 'tableCell',\n content: [\n {\n type: 'paragraph',\n content: cellText ? [createTextRun(cellText)] : [],\n },\n ],\n });\n }\n\n rows.push({\n type: 'tableRow',\n formatting: r === 0 && command.hasHeader ? { header: true } : undefined,\n cells,\n });\n }\n\n const table: Table = {\n type: 'table',\n rows,\n };\n\n // Insert table after the specified paragraph\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n body.content.push(table);\n } else {\n body.content.splice(blockIndex + 1, 0, table);\n }\n\n return newDoc;\n}\n\n/**\n * Insert an image at a position\n */\nfunction executeInsertImage(doc: Document, command: InsertImageCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n\n // Create image\n const image: Image = {\n type: 'image',\n rId: `rId_img_${Date.now()}`,\n src: command.src,\n alt: command.alt,\n size: {\n width: (command.width || 100) * 914400, // Convert pixels to EMU\n height: (command.height || 100) * 914400,\n },\n wrap: { type: 'inline' },\n };\n\n // Create run with drawing content\n const imageRun: Run = {\n type: 'run',\n content: [\n {\n type: 'drawing',\n image,\n },\n ],\n };\n\n // Insert image run at offset\n const newContent = insertTextAtOffset(paragraph, command.position.offset, '', undefined);\n // Find insertion point and add image\n let inserted = false;\n let currentOffset = 0;\n\n for (let i = 0; i < newContent.length; i++) {\n const item = newContent[i];\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n currentOffset += runText.length;\n\n if (!inserted && currentOffset >= command.position.offset) {\n newContent.splice(i + 1, 0, imageRun);\n inserted = true;\n break;\n }\n }\n }\n\n if (!inserted) {\n newContent.push(imageRun);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a hyperlink at a range\n */\nfunction executeInsertHyperlink(doc: Document, command: InsertHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start, end } = command.range;\n\n if (start.paragraphIndex !== end.paragraphIndex) {\n throw new Error('Hyperlinks cannot span multiple paragraphs');\n }\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Get the text that will become the link\n const linkText = command.displayText || paragraphText.slice(start.offset, end.offset);\n\n // Delete the original text\n paragraph.content = deleteTextInParagraph(paragraph, start.offset, end.offset);\n\n // Create hyperlink\n const hyperlink: Hyperlink = {\n type: 'hyperlink',\n href: command.url,\n tooltip: command.tooltip,\n children: [createTextRun(linkText)],\n };\n\n // Insert hyperlink at position\n let inserted = false;\n let currentOffset = 0;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n const runText = item.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n const runEnd = currentOffset + runText.length;\n\n if (!inserted && currentOffset <= start.offset && start.offset <= runEnd) {\n const insertPos = start.offset - currentOffset;\n\n if (insertPos > 0) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(0, insertPos) }],\n });\n }\n\n newContent.push(hyperlink);\n\n if (insertPos < runText.length) {\n newContent.push({\n ...item,\n content: [{ type: 'text', text: runText.slice(insertPos) }],\n });\n }\n\n inserted = true;\n } else {\n newContent.push(item);\n }\n\n currentOffset = runEnd;\n } else {\n newContent.push(item);\n }\n }\n\n if (!inserted) {\n newContent.push(hyperlink);\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Remove a hyperlink but keep the text\n */\nfunction executeRemoveHyperlink(doc: Document, command: RemoveHyperlinkCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const { start } = command.range;\n\n const blockIndex = getBlockIndexForParagraph(body, start.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${start.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const newContent: ParagraphContent[] = [];\n\n for (const item of paragraph.content) {\n if (item.type === 'hyperlink') {\n // Convert hyperlink children to regular runs\n for (const child of item.children) {\n if (child.type === 'run') {\n newContent.push(child);\n }\n }\n } else {\n newContent.push(item);\n }\n }\n\n paragraph.content = newContent;\n\n return newDoc;\n}\n\n/**\n * Insert a paragraph break\n */\nfunction executeInsertParagraphBreak(\n doc: Document,\n command: InsertParagraphBreakCommand\n): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const blockIndex = getBlockIndexForParagraph(body, command.position.paragraphIndex);\n if (blockIndex === -1) {\n throw new Error(`Paragraph index ${command.position.paragraphIndex} not found`);\n }\n\n const paragraph = body.content[blockIndex] as Paragraph;\n const paragraphText = getParagraphText(paragraph);\n\n // Split the paragraph at the offset\n const beforeContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n command.position.offset,\n paragraphText.length\n );\n\n const afterContent = deleteTextInParagraph(\n { ...paragraph, content: [...paragraph.content] },\n 0,\n command.position.offset\n );\n\n // Update current paragraph with content before break\n paragraph.content = beforeContent;\n\n // Create new paragraph with content after break\n const newParagraph: Paragraph = {\n type: 'paragraph',\n formatting: paragraph.formatting,\n content: afterContent,\n };\n\n // Insert new paragraph after current one\n body.content.splice(blockIndex + 1, 0, newParagraph);\n\n return newDoc;\n}\n\n/**\n * Merge paragraphs\n */\nfunction executeMergeParagraphs(doc: Document, command: MergeParagraphsCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n const startBlockIndex = getBlockIndexForParagraph(body, command.paragraphIndex);\n if (startBlockIndex === -1) {\n throw new Error(`Paragraph index ${command.paragraphIndex} not found`);\n }\n\n const baseParagraph = body.content[startBlockIndex] as Paragraph;\n\n // Collect all content from paragraphs to merge\n const indicesToRemove: number[] = [];\n\n for (let i = 1; i <= command.count; i++) {\n const blockIndex = getBlockIndexForParagraph(body, command.paragraphIndex + i);\n if (blockIndex !== -1) {\n const para = body.content[blockIndex] as Paragraph;\n baseParagraph.content.push(...para.content);\n indicesToRemove.push(blockIndex);\n }\n }\n\n // Remove merged paragraphs in reverse order\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n body.content.splice(indicesToRemove[i], 1);\n }\n\n return newDoc;\n}\n\n/**\n * Split a paragraph at a position\n */\nfunction executeSplitParagraph(doc: Document, command: SplitParagraphCommand): Document {\n // Split is the same as insert paragraph break\n return executeInsertParagraphBreak(doc, {\n type: 'insertParagraphBreak',\n position: command.position,\n });\n}\n\n/**\n * Set a template variable value\n */\nfunction executeSetVariable(doc: Document, command: SetVariableCommand): Document {\n const newDoc = cloneDocument(doc);\n\n // Store variable in document for later application\n if (!newDoc.templateVariables) {\n newDoc.templateVariables = [];\n }\n\n if (!newDoc.templateVariables.includes(command.name)) {\n newDoc.templateVariables.push(command.name);\n }\n\n // Note: Actual variable substitution happens in applyVariables\n return newDoc;\n}\n\n/**\n * Apply all template variables\n */\nfunction executeApplyVariables(doc: Document, command: ApplyVariablesCommand): Document {\n const newDoc = cloneDocument(doc);\n const body = newDoc.package.document;\n\n // Replace {variable} patterns in all text content\n function replaceVariablesInRun(run: Run): void {\n for (const content of run.content) {\n if (content.type === 'text') {\n for (const [name, value] of Object.entries(command.values)) {\n const pattern = new RegExp(`\\\\{${name}\\\\}`, 'g');\n content.text = content.text.replace(pattern, value);\n }\n }\n }\n }\n\n function replaceVariablesInParagraph(paragraph: Paragraph): void {\n for (const item of paragraph.content) {\n if (item.type === 'run') {\n replaceVariablesInRun(item);\n } else if (item.type === 'hyperlink') {\n for (const child of item.children) {\n if (child.type === 'run') {\n replaceVariablesInRun(child);\n }\n }\n }\n }\n }\n\n function replaceVariablesInBlock(block: BlockContent): void {\n if (block.type === 'paragraph') {\n replaceVariablesInParagraph(block);\n } else if (block.type === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const cellBlock of cell.content) {\n replaceVariablesInBlock(cellBlock);\n }\n }\n }\n }\n }\n\n for (const block of body.content) {\n replaceVariablesInBlock(block);\n }\n\n return newDoc;\n}\n"]}
@@ -1,2 +0,0 @@
1
- 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`}export{s as a,P as b,E as c,I as d,F as e,H as f,k as g,R as h,N as i,M as j,y as k,L as l,A as m,v as n,w as o,D as p,U as q,$ as r,B as s,O as t,X as u,G as v,K as w,W as x};//# sourceMappingURL=chunk-L54YNLSE.js.map
2
- //# sourceMappingURL=chunk-L54YNLSE.js.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":"AA0BA,IAAMA,EAAyC,CAC7C,GAAA,CAAK,QAAA,CACL,GAAA,CAAK,SACL,GAAA,CAAK,QAAA,CACL,GAAA,CAAK,QAAA,CACL,QAAS,QAAA,CACT,OAAA,CAAS,SACT,OAAA,CAAS,QAAA,CACT,QAAS,QAAA,CACT,OAAA,CAAS,QAAA,CACT,OAAA,CAAS,SACT,KAAA,CAAO,QAAA,CACP,QAAA,CAAU,QACZ,EAMMC,CAAAA,CAA2C,CAC/C,KAAA,CAAO,QAAA,CACP,KAAM,QAAA,CACN,IAAA,CAAM,SACN,QAAA,CAAU,QAAA,CACV,SAAU,QAAA,CACV,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,SACX,WAAA,CAAa,QAAA,CACb,OAAA,CAAS,QAAA,CACT,WAAY,QAAA,CACZ,KAAA,CAAO,QAAA,CACP,SAAA,CAAW,SACX,OAAA,CAAS,QAAA,CACT,IAAK,QAAA,CACL,KAAA,CAAO,SACP,MAAA,CAAQ,QAAA,CACR,IAAA,CAAM,EACR,EAMMC,CAAAA,CAAsD,CAE1D,IAAK,KAAA,CACL,GAAA,CAAK,MACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,QAAS,SAAA,CACT,OAAA,CAAS,UACT,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,UAAA,CAEV,MAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,KAAA,CAAO,MACP,MAAA,CAAQ,KAAA,CACR,UAAW,OAAA,CACX,iBAAA,CAAmB,WAEnB,WAAA,CAAa,KAAA,CACb,KAAA,CAAO,KAAA,CACP,YAAa,KAAA,CACb,KAAA,CAAO,MACP,GAAA,CAAK,KAAA,CACL,IAAK,KAAA,CACL,GAAA,CAAK,KAAA,CACL,GAAA,CAAK,KACP,CAAA,CASA,SAASC,EAAmBC,CAAAA,CAAsC,CAChE,GAAI,CAACA,CAAAA,CAAU,OAAO,CAAA,CAEtB,IAAMC,CAAAA,CAAS,QAAA,CAASD,CAAAA,CAAU,EAAE,EACpC,OAAI,KAAA,CAAMC,CAAM,CAAA,CAAU,EAGnBA,CAAAA,CAAS,GAClB,CAQA,SAASC,CAAAA,CAASC,EAAkD,CAElE,IAAMC,CAAAA,CAAaD,CAAAA,CAAI,SAAS,CAAA,CAAG,GAAG,EAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAE5C,CAAA,CAAI,QAAA,CAASC,CAAAA,CAAW,MAAM,CAAA,CAAG,CAAC,EAAG,EAAE,CAAA,CACvCC,EAAI,QAAA,CAASD,CAAAA,CAAW,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAG,EAAE,CAAA,CACvCE,CAAAA,CAAI,SAASF,CAAAA,CAAW,KAAA,CAAM,CAAA,CAAG,CAAC,EAAG,EAAE,CAAA,CAE7C,OAAO,CACL,CAAA,CAAG,MAAM,CAAC,CAAA,CAAI,CAAA,CAAI,CAAA,CAClB,EAAG,KAAA,CAAMC,CAAC,EAAI,CAAA,CAAIA,CAAAA,CAClB,EAAG,KAAA,CAAMC,CAAC,CAAA,CAAI,CAAA,CAAIA,CACpB,CACF,CAUA,SAASC,CAAAA,CAASC,CAAAA,CAAWH,EAAWC,CAAAA,CAAmB,CACzD,IAAMG,CAAAA,CAASC,GACb,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,IAAI,GAAA,CAAK,IAAA,CAAK,KAAA,CAAMA,CAAC,CAAC,CAAC,CAAA,CACrC,SAAS,EAAE,CAAA,CACX,SAAS,CAAA,CAAG,GAAG,CAAA,CAEpB,OAAO,GAAGD,CAAAA,CAAMD,CAAC,CAAC,CAAA,EAAGC,CAAAA,CAAMJ,CAAC,CAAC,CAAA,EAAGI,CAAAA,CAAMH,CAAC,CAAC,CAAA,CAAA,CAAG,WAAA,EAC7C,CAUA,SAASK,EAASH,CAAAA,CAAWH,CAAAA,CAAWC,CAAAA,CAAgD,CACtFE,GAAK,GAAA,CACLH,CAAAA,EAAK,GAAA,CACLC,CAAAA,EAAK,IAEL,IAAMM,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAIJ,EAAGH,CAAAA,CAAGC,CAAC,EACtBO,CAAAA,CAAM,IAAA,CAAK,IAAIL,CAAAA,CAAGH,CAAAA,CAAGC,CAAC,CAAA,CACtBQ,GAAKF,CAAAA,CAAMC,CAAAA,EAAO,EAExB,GAAID,CAAAA,GAAQC,EACV,OAAO,CAAE,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAA,CAAAC,CAAE,CAAA,CAGzB,IAAMC,EAAIH,CAAAA,CAAMC,CAAAA,CACVG,CAAAA,CAAIF,CAAAA,CAAI,GAAMC,CAAAA,EAAK,CAAA,CAAIH,CAAAA,CAAMC,CAAAA,CAAAA,CAAOE,GAAKH,CAAAA,CAAMC,CAAAA,CAAAA,CAEjDI,CAAAA,CACJ,OAAQL,GACN,KAAKJ,EACHS,CAAAA,CAAAA,CAAAA,CAAMZ,CAAAA,CAAIC,GAAKS,CAAAA,EAAKV,CAAAA,CAAIC,CAAAA,CAAI,CAAA,CAAI,IAAM,CAAA,CACtC,MACF,KAAKD,CAAAA,CACHY,CAAAA,CAAAA,CAAAA,CAAMX,EAAIE,CAAAA,EAAKO,CAAAA,CAAI,CAAA,EAAK,CAAA,CACxB,MACF,KAAKT,CAAAA,CACHW,IAAMT,CAAAA,CAAIH,CAAAA,EAAKU,EAAI,CAAA,EAAK,CAAA,CACxB,MACF,QACEE,EAAI,EACR,CAEA,OAAO,CAAE,EAAGA,CAAAA,CAAI,GAAA,CAAK,CAAA,CAAAD,CAAAA,CAAG,EAAAF,CAAE,CAC5B,CAUA,SAASI,CAAAA,CAASD,EAAWD,CAAAA,CAAWF,CAAAA,CAAgD,CAGtF,GAFAG,EAAIA,CAAAA,CAAI,GAAA,CAEJD,CAAAA,GAAM,CAAA,CAAG,CACX,IAAMG,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAML,EAAI,GAAG,CAAA,CAC/B,OAAO,CAAE,CAAA,CAAGK,EAAM,CAAA,CAAGA,CAAAA,CAAM,CAAA,CAAGA,CAAK,CACrC,CAEA,IAAMC,CAAAA,CAAU,CAACC,EAAWC,CAAAA,CAAWC,CAAAA,IACjCA,CAAAA,CAAI,CAAA,GAAGA,GAAK,CAAA,CAAA,CACZA,CAAAA,CAAI,IAAGA,CAAAA,EAAK,CAAA,CAAA,CACZA,EAAI,CAAA,CAAI,CAAA,CAAUF,CAAAA,CAAAA,CAAKC,CAAAA,CAAID,GAAK,CAAA,CAAIE,CAAAA,CACpCA,EAAI,CAAA,CAAI,CAAA,CAAUD,EAClBC,CAAAA,CAAI,CAAA,CAAI,CAAA,CAAUF,CAAAA,CAAAA,CAAKC,EAAID,CAAAA,GAAM,CAAA,CAAI,EAAIE,CAAAA,CAAAA,CAAK,CAAA,CAC3CF,GAGHC,CAAAA,CAAIR,CAAAA,CAAI,EAAA,CAAMA,CAAAA,EAAK,EAAIE,CAAAA,CAAAA,CAAKF,CAAAA,CAAIE,CAAAA,CAAIF,CAAAA,CAAIE,EACxCK,CAAAA,CAAI,CAAA,CAAIP,CAAAA,CAAIQ,CAAAA,CAElB,OAAO,CACL,CAAA,CAAG,KAAK,KAAA,CAAMF,CAAAA,CAAQC,EAAGC,CAAAA,CAAGL,CAAAA,CAAI,CAAA,CAAI,CAAC,EAAI,GAAG,CAAA,CAC5C,EAAG,IAAA,CAAK,KAAA,CAAMG,EAAQC,CAAAA,CAAGC,CAAAA,CAAGL,CAAC,CAAA,CAAI,GAAG,CAAA,CACpC,CAAA,CAAG,KAAK,KAAA,CAAMG,CAAAA,CAAQC,EAAGC,CAAAA,CAAGL,CAAAA,CAAI,CAAA,CAAI,CAAC,EAAI,GAAG,CAC9C,CACF,CAaA,SAASO,CAAAA,CAAUrB,CAAAA,CAAasB,CAAAA,CAAsB,CACpD,GAAIA,CAAAA,EAAQ,CAAA,EAAKA,GAAQ,CAAA,CACvB,OAAOA,GAAQ,CAAA,CAAI,QAAA,CAAWtB,CAAAA,CAGhC,IAAMuB,EAAMxB,CAAAA,CAASC,CAAG,EAClBwB,CAAAA,CAAMhB,CAAAA,CAASe,EAAI,CAAA,CAAGA,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,CAAC,CAAA,CAGxCC,CAAAA,CAAI,EAAIA,CAAAA,CAAI,CAAA,CAAA,CAAK,EAAIA,CAAAA,CAAI,CAAA,EAAKF,CAAAA,CAE9B,IAAMG,EAASV,CAAAA,CAASS,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,EAAGA,CAAAA,CAAI,CAAC,CAAA,CAC3C,OAAOpB,EAASqB,CAAAA,CAAO,CAAA,CAAGA,EAAO,CAAA,CAAGA,CAAAA,CAAO,CAAC,CAC9C,CAaA,SAASC,CAAAA,CAAW1B,EAAa2B,CAAAA,CAAuB,CACtD,GAAIA,CAAAA,EAAS,CAAA,EAAKA,GAAS,CAAA,CACzB,OAAOA,CAAAA,EAAS,CAAA,CAAI,SAAW3B,CAAAA,CAGjC,IAAMuB,EAAMxB,CAAAA,CAASC,CAAG,EAClBwB,CAAAA,CAAMhB,CAAAA,CAASe,CAAAA,CAAI,CAAA,CAAGA,EAAI,CAAA,CAAGA,CAAAA,CAAI,CAAC,CAAA,CAGxCC,EAAI,CAAA,CAAIA,CAAAA,CAAI,CAAA,CAAIG,CAAAA,CAEhB,IAAMF,CAAAA,CAASV,CAAAA,CAASS,EAAI,CAAA,CAAGA,CAAAA,CAAI,EAAGA,CAAAA,CAAI,CAAC,CAAA,CAC3C,OAAOpB,EAASqB,CAAAA,CAAO,CAAA,CAAGA,EAAO,CAAA,CAAGA,CAAAA,CAAO,CAAC,CAC9C,CASA,SAASG,CAAAA,CAAmBC,EAAiCC,CAAAA,CAA8B,CAEzF,IAAMC,CAAAA,CAAYpC,CAAAA,CAAoBmC,CAAI,CAAA,EAAKA,CAAAA,CAGzCE,CAAAA,CAAa,CACjB,MACA,KAAA,CACA,KAAA,CACA,KAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,QACA,UACF,CAAA,CAGMC,EAAeC,CAAAA,EAAkCF,CAAAA,CAAW,SAASE,CAAgB,CAAA,CAE3F,OAAKL,CAAAA,EAAO,YAORI,CAAAA,CAAYF,CAAS,EAChBF,CAAAA,CAAM,WAAA,CAAYE,CAAS,CAAA,EAAKtC,CAAAA,CAAqBsC,CAAS,CAAA,EAAK,SAGrE,QAAA,CAVDE,CAAAA,CAAYF,CAAS,CAAA,CAChBtC,CAAAA,CAAqBsC,CAAS,CAAA,EAAK,QAAA,CAErC,QAQX,CAQA,SAASI,CAAAA,CAAsBC,CAAAA,CAA0C,CACvE,GAAI,CAACA,CAAAA,CAAW,OAAO,IAAA,CAEvB,IAAMnC,EAAamC,CAAAA,CAAU,WAAA,GAG7B,OAFazC,CAAAA,CAAoByC,CAAS,CAAA,EAAKzC,CAAAA,CAAoBM,CAAU,CAAA,EAE9D,IACjB,CAUO,SAASoC,EACdC,CAAAA,CACAT,CAAAA,CACAU,EAAuB,QAAA,CACf,CACR,GAAI,CAACD,EACH,OAAO,CAAA,CAAA,EAAIC,CAAY,CAAA,CAAA,CAIzB,GAAID,EAAM,IAAA,CAER,OAAO,CAAA,CAAA,EAAIC,CAAY,GAGzB,IAAIC,CAAAA,CAGJ,GAAIF,CAAAA,CAAM,WAAY,CACpB,IAAMR,CAAAA,CAAOK,CAAAA,CAAsBG,EAAM,UAAU,CAAA,CASnD,GARIR,CAAAA,CACFU,CAAAA,CAAWZ,EAAmBC,CAAAA,CAAOC,CAAI,CAAA,CAGzCU,CAAAA,CAAWF,EAAM,GAAA,EAAOC,CAAAA,CAItBD,CAAAA,CAAM,SAAA,CAAW,CACnB,IAAMG,CAAAA,CAAY7C,CAAAA,CAAmB0C,CAAAA,CAAM,SAAS,CAAA,CACpDE,CAAAA,CAAWnB,EAAUmB,CAAAA,CAAUC,CAAS,EAC1C,CAAA,KAAA,GAAWH,CAAAA,CAAM,UAAA,CAAY,CAC3B,IAAMI,CAAAA,CAAa9C,CAAAA,CAAmB0C,CAAAA,CAAM,UAAU,EACtDE,CAAAA,CAAWd,CAAAA,CAAWc,CAAAA,CAAUE,CAAU,EAC5C,CACF,CAAA,KAAWJ,EAAM,GAAA,CAEfE,CAAAA,CAAWF,EAAM,GAAA,CAGjBE,CAAAA,CAAWD,CAAAA,CAIb,OAAO,IAAIC,CAAAA,CAAS,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAC,CAAA,CACrD,CAQO,SAASG,EAAsBC,CAAAA,CAAuC,CAC3E,GAAI,CAACA,CAAAA,EAAaA,IAAc,MAAA,CAC9B,OAAO,EAAA,CAGT,IAAM5C,EAAMN,CAAAA,CAAiBkD,CAAS,CAAA,CACtC,OAAO5C,EAAM,CAAA,CAAA,EAAIA,CAAG,CAAA,CAAA,CAAK,EAC3B,CASO,SAAS6C,CAAAA,CACdP,EACAT,CAAAA,CACQ,CACR,OAAKS,CAAAA,CAGDA,CAAAA,CAAM,IAAA,CACD,aAAA,CAGFD,EAAaC,CAAAA,CAAOT,CAAK,EAPb,EAQrB,CASO,SAASiB,CAAAA,CACdR,CAAAA,CACAT,CAAAA,CACS,CACT,GAAI,CAACS,CAAAA,CAAO,OAAO,MAAA,CACnB,GAAIA,EAAM,IAAA,CAAM,OAAO,KAAA,CAGvB,IAAMtC,EADWqC,CAAAA,CAAaC,CAAAA,CAAOT,CAAK,CAAA,CACrB,QAAQ,IAAA,CAAM,EAAE,CAAA,CAAE,WAAA,GAGjCN,CAAAA,CAAMxB,CAAAA,CAASC,CAAG,CAAA,CAGxB,OAAA,CAFmBuB,EAAI,CAAA,CAAIA,CAAAA,CAAI,CAAA,CAAIA,CAAAA,CAAI,GAAK,CAAA,CAEzB,EACrB,CASO,SAASwB,CAAAA,CACdT,EACAT,CAAAA,CACS,CACT,GAAI,CAACS,EAAO,OAAO,MAAA,CAGnB,IAAMtC,CAAAA,CADWqC,CAAAA,CAAaC,EAAOT,CAAK,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAAE,WAAA,EAAY,CAG7CN,CAAAA,CAAMxB,EAASC,CAAG,CAAA,CAGxB,OAAA,CAFmBuB,CAAAA,CAAI,EAAIA,CAAAA,CAAI,CAAA,CAAIA,EAAI,CAAA,EAAK,CAAA,CAEzB,GACrB,CASO,SAASyB,CAAAA,CACdC,CAAAA,CACApB,EACQ,CACR,GAAI,CAACoB,CAAAA,CAAiB,OAAO,UAG7B,IAAMC,CAAAA,CADab,CAAAA,CAAaY,CAAAA,CAAiBpB,CAAK,CAAA,CAC7B,OAAA,CAAQ,KAAM,EAAE,CAAA,CACnCsB,EAAQpD,CAAAA,CAASmD,CAAK,CAAA,CAM5B,OAAA,CAHmB,KAAQC,CAAAA,CAAM,CAAA,CAAI,IAAA,CAAQA,CAAAA,CAAM,EAAI,IAAA,CAAQA,CAAAA,CAAM,CAAA,EAAK,GAAA,CAGvD,GAAM,SAAA,CAAY,SACvC,CAQO,SAASC,CAAAA,CAAiBC,EAAyD,CACxF,GAAI,CAACA,CAAAA,CAAa,OAElB,IAAMpD,CAAAA,CAAaoD,EAAY,IAAA,EAAK,CAEpC,GAAIpD,CAAAA,CAAW,WAAA,EAAY,GAAM,MAAA,CAC/B,OAAO,CAAE,IAAA,CAAM,IAAK,CAAA,CAItB,IAAMqD,EAAYnB,CAAAA,CAAsBlC,CAAU,CAAA,CAClD,GAAIqD,EACF,OAAO,CAAE,UAAA,CAAYA,CAAU,EAKjC,IAAMtD,CAAAA,CAAMC,CAAAA,CAAW,OAAA,CAAQ,KAAM,EAAE,CAAA,CAAE,aAAY,CAGrD,OAAI,iBAAiB,IAAA,CAAKD,CAAG,CAAA,CACpB,CAAE,IAAKA,CAAI,CAAA,CAIhB,iBAAiB,IAAA,CAAKA,CAAG,EAKpB,CAAE,GAAA,CAJQA,CAAAA,CACd,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAKuD,GAAMA,CAAAA,CAAIA,CAAC,EAChB,IAAA,CAAK,EAAE,CACa,CAAA,CAIlB,CAAE,GAAA,CAAKvD,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAE,CACjD,CAUO,SAASwD,CAAAA,CACdC,CAAAA,CACAnC,EACAK,CAAAA,CACY,CACZ,IAAM+B,CAAAA,CAAqB,CAAE,UAAA,CAAAD,CAAW,EAExC,OAAInC,CAAAA,GAAS,QAAaA,CAAAA,CAAO,CAAA,EAAKA,CAAAA,CAAO,CAAA,GAC3CoC,EAAO,SAAA,CAAY,IAAA,CAAK,MAAMpC,CAAAA,CAAO,GAAG,EACrC,QAAA,CAAS,EAAE,CAAA,CACX,WAAA,GACA,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAAA,CAGhBK,IAAU,MAAA,EAAaA,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,CAAQ,IAC9C+B,CAAAA,CAAO,UAAA,CAAa,KAAK,KAAA,CAAM/B,CAAAA,CAAQ,GAAG,CAAA,CACvC,QAAA,CAAS,EAAE,CAAA,CACX,aAAY,CACZ,QAAA,CAAS,EAAG,GAAG,CAAA,CAAA,CAGb+B,CACT,CAQO,SAASC,CAAAA,CAAe3D,CAAAA,CAAyB,CACtD,OAAO,CAAE,IAAKA,CAAAA,CAAI,OAAA,CAAQ,KAAM,EAAE,CAAA,CAAE,WAAA,EAAc,CACpD,CAUO,SAAS4D,CAAAA,CACdtB,CAAAA,CACAT,EACAgC,CAAAA,CACQ,CAER,IAAM7D,CAAAA,CADWqC,EAAaC,CAAAA,CAAOT,CAAK,EACrB,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAC/BF,CAAAA,CAAQ,CAAA,CAAIkC,CAAAA,CAAU,IAC5B,OAAO,CAAA,CAAA,EAAInC,EAAW1B,CAAAA,CAAK2B,CAAK,CAAC,CAAA,CACnC,CAUO,SAASmC,CAAAA,CACdxB,EACAT,CAAAA,CACAgC,CAAAA,CACQ,CAER,IAAM7D,CAAAA,CADWqC,EAAaC,CAAAA,CAAOT,CAAK,CAAA,CACrB,OAAA,CAAQ,KAAM,EAAE,CAAA,CAC/BP,CAAAA,CAAOuC,CAAAA,CAAU,IACvB,OAAO,CAAA,CAAA,EAAIxC,CAAAA,CAAUrB,CAAAA,CAAKsB,CAAI,CAAC,CAAA,CACjC,CAWO,SAASyC,CAAAA,CACdC,EACAC,CAAAA,CACAC,CAAAA,CACArC,CAAAA,CACQ,CACR,IAAMsC,CAAAA,CAAY9B,CAAAA,CAAa2B,EAAQnC,CAAK,CAAA,CAAE,QAAQ,IAAA,CAAM,EAAE,CAAA,CACxDuC,CAAAA,CAAY/B,EAAa4B,CAAAA,CAAQpC,CAAK,EAAE,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAExDwC,CAAAA,CAAOtE,CAAAA,CAASoE,CAAS,EACzBG,CAAAA,CAAOvE,CAAAA,CAASqE,CAAS,CAAA,CAEzBG,EAAU,CACd,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMF,EAAK,CAAA,EAAK,CAAA,CAAIH,GAASI,CAAAA,CAAK,CAAA,CAAIJ,CAAK,CAAA,CACnD,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMG,EAAK,CAAA,EAAK,CAAA,CAAIH,GAASI,CAAAA,CAAK,CAAA,CAAIJ,CAAK,CAAA,CACnD,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMG,EAAK,CAAA,EAAK,CAAA,CAAIH,GAASI,CAAAA,CAAK,CAAA,CAAIJ,CAAK,CACrD,CAAA,CAEA,OAAO,CAAA,CAAA,EAAI9D,EAASmE,CAAAA,CAAQ,CAAA,CAAGA,CAAAA,CAAQ,CAAA,CAAGA,EAAQ,CAAC,CAAC,CAAA,CACtD,CAUO,SAASC,CAAAA,CACdR,CAAAA,CACAC,EACApC,CAAAA,CACS,CACT,GAAI,CAACmC,CAAAA,EAAU,CAACC,CAAAA,CAAQ,OAAO,KAAA,CAC/B,GAAI,CAACD,CAAAA,EAAU,CAACC,EAAQ,OAAO,MAAA,CAE/B,IAAME,CAAAA,CAAY9B,EAAa2B,CAAAA,CAAQnC,CAAK,EAAE,WAAA,EAAY,CACpDuC,EAAY/B,CAAAA,CAAa4B,CAAAA,CAAQpC,CAAK,CAAA,CAAE,aAAY,CAE1D,OAAOsC,CAAAA,GAAcC,CACvB,CCvnBO,SAASK,CAAAA,CAAcC,CAAAA,CAAuB,CACnD,OAAQA,CAAAA,CAAQ,IAAA,CAAkB,EACpC,CAKO,SAASC,EAAcC,CAAAA,CAAoB,CAChD,OAAQA,CAAAA,CAAK,GAAmB,IAClC,CAWO,SAASC,CAAAA,CAAYC,CAAAA,CAAqB,CAC/C,OAAQA,CAAAA,CAAM,MAAA,CAAiB,EACjC,CAKO,SAASC,CAAAA,CAAYH,EAAoB,CAC9C,OAAQA,EAAK,EAAA,CAAmB,MAClC,CAKO,SAASI,EAAWF,CAAAA,CAAqB,CAC9C,OAAQA,CAAAA,CAAM,OAAiB,IACjC,CAKO,SAASG,CAAAA,CAAWP,EAAuB,CAChD,OAAQA,EAAQ,IAAA,CAAkB,MACpC,CAYO,SAASQ,CAAAA,CAAeC,CAAAA,CAAwB,CACrD,OAAQA,CAAAA,CAAS,EAAA,CAAmB,EACtC,CAWO,SAASC,EAAmBC,CAAAA,CAA4B,CAC7D,OAAQA,CAAAA,CAAa,IAAwB,EAC/C,CAKO,SAASC,CAAAA,CAAmBD,CAAAA,CAA4B,CAC7D,OAAOA,CAAAA,CAAa,CACtB,CAkBO,SAASE,CAAAA,CAAgBC,CAAAA,CAAyB,CACvD,OAAQA,EAAU,GAAA,CAAoB,EACxC,CASO,SAASC,EAAYb,CAAAA,CAAYc,CAAAA,CAAwB,EAAW,CACzE,IAAMC,EAAS,IAAA,CAAK,GAAA,CAAI,EAAA,CAAID,CAAa,EACzC,OAAO,IAAA,CAAK,MAAMd,CAAAA,CAAKe,CAAM,EAAIA,CACnC,CAgBO,SAASC,CAAAA,CAAShB,EAAoB,CAC3C,OAAO,GAAGa,CAAAA,CAAYb,CAAE,CAAC,CAAA,EAAA,CAC3B","file":"chunk-L54YNLSE.js","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"]}