@eigenpal/docx-js-editor 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  2. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  3. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  4. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  5. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  6. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  7. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  8. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  9. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  10. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  11. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  12. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  13. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  14. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  15. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  17. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  18. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  19. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  20. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  21. package/dist/chunk-32HMU2UV.js +111 -0
  22. package/dist/chunk-4CUGBNL2.cjs +1 -0
  23. package/dist/chunk-5GFXHUMP.js +1 -0
  24. package/dist/chunk-6NDMKJIE.js +9 -0
  25. package/dist/chunk-6NYA53QC.cjs +258 -0
  26. package/dist/chunk-7KJ3YVDQ.js +10 -0
  27. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  28. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  29. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  30. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  31. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  32. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  33. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  34. package/dist/chunk-FXJAIFPR.js +59 -0
  35. package/dist/chunk-GICVJSFJ.cjs +9 -0
  36. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  37. package/dist/chunk-HT2Z33YM.cjs +111 -0
  38. package/dist/chunk-JRRTZZ72.cjs +1 -0
  39. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  40. package/dist/chunk-P3AEZKQO.cjs +3 -0
  41. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  42. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  43. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  44. package/dist/chunk-Q7YYC75E.js +258 -0
  45. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  46. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  47. package/dist/chunk-USRMBYI6.js +3 -0
  48. package/dist/chunk-UTWPV2I4.js +26 -0
  49. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  50. package/dist/chunk-XQNCLN4T.cjs +3 -0
  51. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  52. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  53. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  54. package/dist/chunk-ZTVQA46Q.js +1 -0
  55. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  56. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  57. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  58. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  59. package/dist/core-plugins-reexport.cjs +1 -2
  60. package/dist/core-plugins-reexport.d.cts +4 -4
  61. package/dist/core-plugins-reexport.d.ts +4 -4
  62. package/dist/core-plugins-reexport.js +1 -2
  63. package/dist/core-reexport.cjs +1 -2
  64. package/dist/core-reexport.d.cts +10 -10
  65. package/dist/core-reexport.d.ts +10 -10
  66. package/dist/core-reexport.js +1 -2
  67. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  68. package/dist/executor-L2MVKMXO.js +1 -0
  69. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  70. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  71. package/dist/headless-reexport.cjs +4 -5
  72. package/dist/headless-reexport.d.cts +7 -7
  73. package/dist/headless-reexport.d.ts +7 -7
  74. package/dist/headless-reexport.js +4 -5
  75. package/dist/index.cjs +6 -7
  76. package/dist/index.css +0 -1
  77. package/dist/index.d.cts +12 -12
  78. package/dist/index.d.ts +12 -12
  79. package/dist/index.js +6 -7
  80. package/dist/lib-GD2QD2JK.js +1 -0
  81. package/dist/lib-HOLGQI5K.cjs +1 -0
  82. package/dist/mcp-reexport.cjs +9 -10
  83. package/dist/mcp-reexport.d.cts +2 -2
  84. package/dist/mcp-reexport.d.ts +2 -2
  85. package/dist/mcp-reexport.js +4 -5
  86. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  87. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  88. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  89. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  90. package/dist/react.cjs +1 -2
  91. package/dist/react.css +0 -1
  92. package/dist/react.d.cts +5 -5
  93. package/dist/react.d.ts +5 -5
  94. package/dist/react.js +1 -2
  95. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  96. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  97. package/dist/selectionRects-7QU337P5.cjs +1 -0
  98. package/dist/selectionRects-V5RC2BYX.js +1 -0
  99. package/dist/styles.css +1 -1
  100. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  101. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  102. package/dist/ui.cjs +1 -2
  103. package/dist/ui.d.cts +32 -85
  104. package/dist/ui.d.ts +32 -85
  105. package/dist/ui.js +1 -2
  106. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  107. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  108. package/package.json +1 -1
  109. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  110. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  112. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  114. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  115. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  117. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  118. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  119. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  120. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  121. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  123. package/dist/chunk-2CHPKB5A.cjs +0 -112
  124. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  125. package/dist/chunk-2QOEHCBX.js.map +0 -1
  126. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  127. package/dist/chunk-5DYSI4O4.cjs +0 -60
  128. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  129. package/dist/chunk-5FJXHXFV.cjs +0 -2
  130. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  131. package/dist/chunk-6FEWNF6B.js +0 -4
  132. package/dist/chunk-6FEWNF6B.js.map +0 -1
  133. package/dist/chunk-6LF5HZCV.js +0 -10
  134. package/dist/chunk-6LF5HZCV.js.map +0 -1
  135. package/dist/chunk-7JSPKVOW.js.map +0 -1
  136. package/dist/chunk-C33XDRDJ.cjs +0 -28
  137. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  138. package/dist/chunk-CV5WFE7K.js.map +0 -1
  139. package/dist/chunk-CXJRNISO.js +0 -2
  140. package/dist/chunk-CXJRNISO.js.map +0 -1
  141. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  142. package/dist/chunk-DP6Q75ZD.js +0 -28
  143. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  144. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  145. package/dist/chunk-FGVGZLBL.js.map +0 -1
  146. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  147. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  148. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  149. package/dist/chunk-JOYPFQW2.js.map +0 -1
  150. package/dist/chunk-L54YNLSE.js +0 -2
  151. package/dist/chunk-L54YNLSE.js.map +0 -1
  152. package/dist/chunk-LPGMLJMO.js +0 -259
  153. package/dist/chunk-LPGMLJMO.js.map +0 -1
  154. package/dist/chunk-M2T6XKT5.js.map +0 -1
  155. package/dist/chunk-OHG7ROFC.js +0 -11
  156. package/dist/chunk-OHG7ROFC.js.map +0 -1
  157. package/dist/chunk-PANKMCFX.cjs +0 -4
  158. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  159. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  160. package/dist/chunk-QDV75OJ4.js +0 -112
  161. package/dist/chunk-QDV75OJ4.js.map +0 -1
  162. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  163. package/dist/chunk-QVIZ775M.cjs +0 -259
  164. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  165. package/dist/chunk-RMUMR42R.cjs +0 -10
  166. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  167. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  168. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  169. package/dist/chunk-ULXNEG66.js +0 -60
  170. package/dist/chunk-ULXNEG66.js.map +0 -1
  171. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  172. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  173. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  174. package/dist/core-plugins-reexport.cjs.map +0 -1
  175. package/dist/core-plugins-reexport.js.map +0 -1
  176. package/dist/core-reexport.cjs.map +0 -1
  177. package/dist/core-reexport.js.map +0 -1
  178. package/dist/executor-K5RXUTTR.js +0 -2
  179. package/dist/executor-K5RXUTTR.js.map +0 -1
  180. package/dist/executor-XIPIU3H4.cjs +0 -2
  181. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  182. package/dist/headless-reexport.cjs.map +0 -1
  183. package/dist/headless-reexport.js.map +0 -1
  184. package/dist/index.cjs.map +0 -1
  185. package/dist/index.css.map +0 -1
  186. package/dist/index.js.map +0 -1
  187. package/dist/mcp-reexport.cjs.map +0 -1
  188. package/dist/mcp-reexport.js.map +0 -1
  189. package/dist/processTemplate-G37IM66O.js.map +0 -1
  190. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  191. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  192. package/dist/react.cjs.map +0 -1
  193. package/dist/react.css.map +0 -1
  194. package/dist/react.js.map +0 -1
  195. package/dist/selectionRects-6DU7HN7E.js +0 -2
  196. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  197. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  198. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  199. package/dist/ui.cjs.map +0 -1
  200. package/dist/ui.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ContextMenu.tsx","../src/components/ResponsePreview.tsx","../src/components/TextContextMenu.tsx","../src/components/ui/PrintPreview.tsx","../src/components/ui/TableMergeButton.tsx","../src/components/ui/TableInsertButtons.tsx","../src/components/ui/CellBackgroundPicker.tsx","../src/components/ui/UnsavedIndicator.tsx","../src/components/ui/LoadingIndicator.tsx","../src/components/ui/ResponsiveToolbar.tsx","../src/components/dialogs/InsertTableDialog.tsx","../src/components/dialogs/InsertImageDialog.tsx","../src/components/dialogs/InsertSymbolDialog.tsx","../src/components/dialogs/PasteSpecialDialog.tsx","../src/components/dialogs/KeyboardShortcutsDialog.tsx"],"names":["AskAIIcon","jsxs","jsx","RewriteIcon","ExpandIcon","SummarizeIcon","TranslateIcon","ExplainIcon","GrammarIcon","FormalIcon","CasualIcon","CustomIcon","getActionIcon","action","MenuItem","onClick","isHighlighted","onMouseEnter","label","getActionLabel","description","getActionDescription","icon","CustomPromptDialog","isOpen","onSubmit","onClose","selectedText","prompt","setPrompt","useState","inputRef","useRef","useEffect","handleSubmit","e","handleKeyDown","ContextMenu","position","_selectionContext","onAction","actions","DEFAULT_AI_ACTIONS","showCustomPrompt","className","menuRef","highlightedIndex","setHighlightedIndex","showPromptDialog","setShowPromptDialog","allActions","handleClickOutside","prev","getMenuStyle","useCallback","menuHeight","x","y","handleActionClick","handleCustomPromptSubmit","index","useContextMenu","setIsOpen","setPosition","setSelectedText","selectionContext","setSelectionContext","openMenu","text","context","closeMenu","getActionShortcut","isActionAvailable","_action","getDefaultActions","getAllActions","CheckIcon","XIcon","RefreshIcon","EditIcon","LoadingSpinner","calculateDiff","original","modified","segments","originalWords","modifiedWords","j","nextMatchInModified","nextMatchInOriginal","merged","segment","DiffView","style","ResponsePreview","originalText","response","isLoading","error","onAccept","onReject","onRetry","allowEdit","showDiff","isEditing","setIsEditing","editedText","setEditedText","textareaRef","containerRef","newText","handleAccept","handleStartEdit","handleCancelEdit","containerStyle","warning","useResponsePreview","state","setState","showPreview","setResponse","setError","hidePreview","createMockResponse","warnings","createErrorResponse","DEFAULT_MENU_ITEMS","CutIcon","CopyIcon","PasteIcon","DeleteIcon","SelectAllIcon","MenuItemComponent","item","Fragment","TextContextMenu","hasSelection","isEditable","hasClipboardContent","items","menuItems","disabled","navigableItems","timer","next","handleItemClick","navigableIndex","ni","useTextContextMenu","options","enabled","_isEditable","_containerRef","setHasSelection","checkSelection","selection","hasText","event","handleAction","onContextMenu","getTextActionLabel","getTextActionShortcut","getDefaultTextContextMenuItems","isTextActionAvailable","DEFAULT_PRINT_OPTIONS","PrintButton","onPrint","showIcon","compact","buttonStyle","PrintIcon","PrintStyles","size","triggerPrint","openPrintWindow","title","content","printWindow","getDefaultPrintOptions","parsePageRange","input","maxPages","trimmed","page","rangeMatch","start","end","formatPageRange","range","totalPages","isPrintSupported","TableMergeButton","canMerge","canSplit","handleMouseDown","handleMerge","handleSplit","mergeButton","Tooltip","Button","cn","MaterialSymbol","splitButton","INSERT_ACTIONS","TableInsertButtons","testId","STYLES","CellFillIcon","NoFillIcon","DEFAULT_CELL_COLORS","CellBackgroundPicker","value","onChange","colors","additionalStyle","showNoFill","showCustomColor","isHovered","setIsHovered","hoveredColor","setHoveredColor","noFillHovered","setNoFillHovered","handleToggle","handleColorSelect","color","handleNoFill","handleCustomColor","indicatorStyle","classNames","getDefaultCellColors","createCellColorOption","hex","name","isDefaultCellColor","c","getCellColorName","createShadingFromColor","getColorFromShading","shading","hexToRgbValues","result","getContrastingTextColor","bgHex","rgb","DEFAULT_UNSAVED_COLOR","DEFAULT_SAVED_COLOR","DEFAULT_WARNING_MESSAGE","SaveIcon","UnsavedIcon","pulseKeyframes","getIndicatorStyles","variant","hasUnsavedChanges","showPulse","unsavedColor","savedColor","baseStyles","UnsavedIndicator","savedLabel","showWhenSaved","styleId","styleElement","combinedStyles","defaultTitle","renderContent","useUnsavedChanges","currentDocument","warnBeforeLeave","warningMessage","onChangeStatusChange","setHasUnsavedChanges","changeCount","setChangeCount","lastSavedDocument","setLastSavedDocument","previousDocumentRef","initializedRef","serializeDocument","doc","markAsSaved","markAsChanged","resetTracking","newDocument","docToUse","currentSerialized","previousSerialized","lastSavedSerialized","handleBeforeUnload","getVariantLabel","getAllVariants","getAllPositions","createChangeTracker","lastSaveTime","SIZE_CONFIG","DEFAULT_COLOR","MIN_LOADING_DURATION","spinnerKeyframes","SpinnerVariant","strokeWidth","radius","circumference","DotsVariant","dotSize","gap","BarVariant","PulseVariant","ProgressVariant","progress","showText","fontSize","clampedProgress","LoadingIndicator","message","overlay","overlayOpacity","showProgressText","sizeConfig","renderVariant","useLoading","initialLoading","minDuration","onStart","onEnd","setIsLoading","setMessage","setProgress","startTimeRef","minDurationTimeoutRef","startLoading","msg","stopLoading","startTime","now","elapsed","remaining","withLoading","operation","useLoadingOperations","operations","setOperations","startOperation","id","updateOperation","updates","existing","endOperation","isAnyLoading","getLoadingVariantLabel","getAllLoadingVariants","getAllLoadingSizes","delay","ms","resolve","DEFAULT_ITEM_GAP","DEFAULT_OVERFLOW_BUTTON_WIDTH","DEFAULT_ITEM_MIN_WIDTH","MoreIcon","useResponsiveToolbar","itemGap","overflowButtonWidth","visibleCount","setVisibleCount","itemWidthsRef","calculateVisibleItems","container","containerWidth","sortedItems","a","b","usedWidth","count","widthWithGap","reservedWidth","useLayoutEffect","resizeObserver","visibleItems","overflowItems","useMemo","OverflowMenu","anchorRef","ResponsiveToolbar","additionalOverflowItems","alwaysShowOverflow","renderOverflowButton","renderOverflowMenu","padding","height","backgroundColor","borderBottom","overflowButtonRef","isOverflowOpen","setIsOverflowOpen","hasOverflow","allOverflowItems","showOverflow","toggleOverflow","closeOverflow","defaultOverflowButton","React","ToolbarGroup","children","separatorAfter","createToolbarItem","createToolbarItems","configs","config","getRecommendedPriority","itemType","DIALOG_OVERLAY_STYLE","DIALOG_CONTENT_STYLE","DIALOG_HEADER_STYLE","DIALOG_TITLE_STYLE","CLOSE_BUTTON_STYLE","DIALOG_BODY_STYLE","GRID_CONTAINER_STYLE","GRID_STYLE","GRID_CELL_STYLE","GRID_CELL_SELECTED_STYLE","GRID_LABEL_STYLE","SEPARATOR_STYLE","SEPARATOR_LINE_STYLE","INPUT_ROW_STYLE","LABEL_STYLE","INPUT_STYLE","DIALOG_FOOTER_STYLE","BUTTON_BASE_STYLE","PRIMARY_BUTTON_STYLE","SECONDARY_BUTTON_STYLE","DISABLED_BUTTON_STYLE","TableIcon","InsertTableDialog","onInsert","maxGridRows","maxGridColumns","maxRows","maxColumns","hoverRows","setHoverRows","hoverCols","setHoverCols","inputRows","setInputRows","inputCols","setInputCols","dialogRef","handleCellHover","row","col","handleCellClick","handleManualInsert","rows","cols","handleOverlayClick","handleRowsChange","handleColsChange","gridCells","isSelected","canInsert","gridLabel","useInsertTableDialog","open","close","toggle","createDefaultTableConfig","columns","isValidTableConfig","clampTableConfig","formatTableDimensions","getTablePresets","DROP_ZONE_STYLE","DROP_ZONE_ACTIVE_STYLE","DROP_ZONE_WITH_IMAGE_STYLE","PREVIEW_CONTAINER_STYLE","PREVIEW_IMAGE_STYLE","DROP_ZONE_ICON_STYLE","DROP_ZONE_TEXT_STYLE","DROP_ZONE_SUBTEXT_STYLE","FORM_GROUP_STYLE","SIZE_ROW_STYLE","SIZE_INPUT_STYLE","LOCK_BUTTON_STYLE","LOCK_BUTTON_ACTIVE_STYLE","FILE_INFO_STYLE","ImageIcon","LockIcon","locked","InsertImageDialog","maxWidth","maxHeight","accept","imageData","setImageData","isDragging","setIsDragging","width","setWidth","setHeight","altText","setAltText","aspectLocked","setAspectLocked","originalAspectRatio","setOriginalAspectRatio","fileInputRef","processFile","file","reader","src","img","w","h","scaleW","scaleH","scale","handleFileChange","handleDropZoneClick","handleDragOver","handleDragLeave","handleDrop","handleWidthChange","newWidth","handleHeightChange","newHeight","handleInsert","handleClear","getDropZoneStyle","useInsertImageDialog","isValidImageFile","getSupportedImageExtensions","getImageAcceptString","calculateFitDimensions","originalWidth","originalHeight","scaleX","scaleY","dataUrlToBlob","dataUrl","parts","mime","binaryString","bytes","getImageDimensions","reject","formatFileSize","SEARCH_INPUT_STYLE","CATEGORY_TABS_STYLE","CATEGORY_TAB_STYLE","CATEGORY_TAB_ACTIVE_STYLE","SYMBOLS_GRID_STYLE","SYMBOL_BUTTON_STYLE","PREVIEW_SECTION_STYLE","PREVIEW_SYMBOL_STYLE","PREVIEW_INFO_STYLE","SYMBOL_CATEGORIES","getAllSymbols","cat","InsertSymbolDialog","recentSymbols","selectedCategory","setSelectedCategory","selectedSymbol","setSelectedSymbol","searchQuery","setSearchQuery","hoveredSymbol","setHoveredSymbol","searchInputRef","filteredSymbols","query","symbol","codePoint","handleSymbolClick","handleSymbolDoubleClick","getSymbolInfo","symbolInfo","categories","useInsertSymbolDialog","maxRecent","setRecentSymbols","addRecent","filtered","s","getSymbolCategories","getSymbolsByCategory","categoryName","code","searchSymbols","lowerQuery","symbolFromCodePoint","codePointStr","cleaned","PASTE_OPTIONS","FormattedIcon","PlainTextIcon","getPasteOptionIcon","option","PasteOptionButton","PasteSpecialDialog","onPaste","selectedIndex","setSelectedIndex","clipboardContent","setClipboardContent","readFromClipboard","handlePaste","getDialogStyle","usePasteSpecial","openDialog","closeDialog","pasteAsPlainText","getPasteOption","getAllPasteOptions","getDefaultPasteOption","isPasteSpecialShortcut","CATEGORY_LABELS","CATEGORY_ORDER","DEFAULT_SHORTCUTS","isMac","formatKeys","keys","ShortcutItem","shortcut","formattedKeys","formattedAltKeys","KeyboardShortcutsDialog","customShortcuts","showSearch","allShortcuts","custom","existingIndex","filteredShortcuts","groupedShortcuts","groups","sorted","category","shortcuts","useKeyboardShortcutsDialog","_openShortcut","getDefaultShortcuts","getShortcutsByCategory","getCommonShortcuts","getCategoryLabel","getAllCategories","formatShortcutKeys"],"mappings":"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P,MAAA,CAAQ,mCACV,CAAA,CAEMG,EAAAA,CAAuC,CAC3C,GAAGH,EAAAA,CACH,eAAA,CAAiB,yBAAA,CACjB,KAAA,CAAO,uBAAA,CACP,MAAA,CAAQ,aACV,EASagI,EAAAA,CAAsC,CACjD,CACE,IAAA,CAAM,QAAA,CACN,KAAA,CAAO,QAAA,CACP,OAAA,CAAS,CACP,MAAA,CACA,MAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,MAAA,CACA,OACA,MAAA,CACA,MAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,QAAA,CACN,MAAO,QAAA,CACP,OAAA,CAAS,CACP,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QACF,CACF,EACA,CACE,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MAAA,CACP,OAAA,CAAS,CACP,GAAA,CACA,SACA,MAAA,CACA,MAAA,CACA,GAAA,CACA,QAAA,CACA,GAAA,CACA,GAAA,CACA,QAAA,CACA,QAAA,CACA,OACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,QACP,OAAA,CAAS,CACP,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,QAAA,CACN,KAAA,CAAO,QAAA,CACP,OAAA,CAAS,CACP,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,aAAA,CACN,KAAA,CAAO,cACP,OAAA,CAAS,CACP,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,OACA,MAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,MAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,UAAA,CACN,KAAA,CAAO,UAAA,CACP,OAAA,CAAS,CACP,GAAA,CACA,MAAA,CACA,OACA,MAAA,CACA,MAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,SACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,CACP,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,WAAA,CACA,YACA,WAAA,CACA,WAAA,CACA,oBAAA,CACA,oBAAA,CACA,6BAAA,CACA,6BAAA,CACA,6BAAA,CACA,WAAA,CACA,YACA,WAAA,CACA,WACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,CACP,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,YACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,YACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,QAAA,CACA,WAAA,CACA,QAAA,CACA,WAAA,CACA,WAAA,CACA,YACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,QAAA,CACA,WAAA,CACA,WAAA,CACA,YACA,QAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,WAAA,CACA,QACF,CA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","file":"chunk-2CHPKB5A.cjs","sourcesContent":["/**\n * Context Menu Component\n *\n * Right-click context menu for AI actions on selected text.\n * Shows AI options like rewrite, expand, summarize, translate, etc.\n */\n\nimport React, { useEffect, useRef, useCallback, useState } from 'react';\nimport type { AIAction, SelectionContext } from '@eigenpal/docx-core/types/agentApi';\nimport {\n getActionLabel,\n getActionDescription,\n DEFAULT_AI_ACTIONS,\n} from '@eigenpal/docx-core/types/agentApi';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Context menu props\n */\nexport interface ContextMenuProps {\n /** Whether the menu is visible */\n isOpen: boolean;\n /** Menu position */\n position: { x: number; y: number };\n /** Selected text */\n selectedText: string;\n /** Selection context for AI operations */\n selectionContext?: SelectionContext;\n /** Callback when an action is selected */\n onAction: (action: AIAction, customPrompt?: string) => void;\n /** Callback when menu is closed */\n onClose: () => void;\n /** Available actions (defaults to DEFAULT_AI_ACTIONS) */\n actions?: AIAction[];\n /** Whether to show custom prompt option */\n showCustomPrompt?: boolean;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Context menu item props\n */\ninterface MenuItemProps {\n action: AIAction;\n onClick: () => void;\n isHighlighted: boolean;\n onMouseEnter: () => void;\n}\n\n/**\n * Custom prompt dialog props\n */\ninterface CustomPromptDialogProps {\n isOpen: boolean;\n onSubmit: (prompt: string) => void;\n onClose: () => void;\n selectedText: string;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst AskAIIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 4v4M8 10v1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst RewriteIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 3L3 13M3 3h4v4M13 13h-4v-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ExpandIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SummarizeIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 4h10M3 8h7M3 12h4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst TranslateIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 3h6M5 3v6M3 5c0 2 1 4 2 4s2-2 2-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M9 7l3 6M15 7l-3 6M10 11h4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst ExplainIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 6c0-1.1.9-2 2-2s2 .9 2 2c0 1.5-2 1.5-2 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"12\" r=\"0.5\" fill=\"currentColor\" />\n </svg>\n);\n\nconst GrammarIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 12l3-8 3 8M5 10h4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6l2 2-2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst FormalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 7h4M6 9h4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CasualIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 9c.5.5 1 1 2 1s1.5-.5 2-1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"6\" cy=\"7\" r=\"0.5\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"7\" r=\"0.5\" fill=\"currentColor\" />\n </svg>\n);\n\nconst CustomIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 4L4 12M4 4l8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n/**\n * Get icon for an action\n */\nfunction getActionIcon(action: AIAction): React.ReactNode {\n switch (action) {\n case 'askAI':\n return <AskAIIcon />;\n case 'rewrite':\n return <RewriteIcon />;\n case 'expand':\n return <ExpandIcon />;\n case 'summarize':\n return <SummarizeIcon />;\n case 'translate':\n return <TranslateIcon />;\n case 'explain':\n return <ExplainIcon />;\n case 'fixGrammar':\n return <GrammarIcon />;\n case 'makeFormal':\n return <FormalIcon />;\n case 'makeCasual':\n return <CasualIcon />;\n case 'custom':\n return <CustomIcon />;\n default:\n return null;\n }\n}\n\n// ============================================================================\n// MENU ITEM COMPONENT\n// ============================================================================\n\nconst MenuItem: React.FC<MenuItemProps> = ({ action, onClick, isHighlighted, onMouseEnter }) => {\n const label = getActionLabel(action);\n const description = getActionDescription(action);\n const icon = getActionIcon(action);\n\n return (\n <button\n type=\"button\"\n className={`docx-context-menu-item ${isHighlighted ? 'docx-context-menu-item-highlighted' : ''}`}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n title={description}\n role=\"menuitem\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n background: isHighlighted ? 'var(--doc-primary-light)' : 'transparent',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'var(--doc-text)',\n textAlign: 'left',\n }}\n >\n <span style={{ display: 'flex', color: 'var(--doc-text-muted)' }}>{icon}</span>\n <span>{label}</span>\n </button>\n );\n};\n\n// ============================================================================\n// CUSTOM PROMPT DIALOG\n// ============================================================================\n\nconst CustomPromptDialog: React.FC<CustomPromptDialogProps> = ({\n isOpen,\n onSubmit,\n onClose,\n selectedText,\n}) => {\n const [prompt, setPrompt] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (prompt.trim()) {\n onSubmit(prompt.trim());\n setPrompt('');\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"docx-custom-prompt-dialog\"\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n padding: '8px',\n background: 'white',\n borderTop: '1px solid var(--doc-border)',\n }}\n >\n <form onSubmit={handleSubmit}>\n <div style={{ marginBottom: '8px', fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n Selected: \"{selectedText.slice(0, 50)}\n {selectedText.length > 50 ? '...' : ''}\"\n </div>\n <input\n ref={inputRef}\n type=\"text\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter custom prompt...\"\n style={{\n width: '100%',\n padding: '8px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n fontSize: '13px',\n }}\n />\n <div style={{ marginTop: '8px', display: 'flex', gap: '8px', justifyContent: 'flex-end' }}>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '6px 12px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n background: 'white',\n cursor: 'pointer',\n fontSize: '12px',\n }}\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={!prompt.trim()}\n style={{\n padding: '6px 12px',\n border: 'none',\n borderRadius: '4px',\n background: prompt.trim() ? 'var(--doc-primary)' : 'var(--doc-border)',\n color: prompt.trim() ? 'white' : 'var(--doc-text-placeholder)',\n cursor: prompt.trim() ? 'pointer' : 'not-allowed',\n fontSize: '12px',\n }}\n >\n Send\n </button>\n </div>\n </form>\n </div>\n );\n};\n\n// ============================================================================\n// MAIN CONTEXT MENU COMPONENT\n// ============================================================================\n\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n isOpen,\n position,\n selectedText,\n selectionContext: _selectionContext,\n onAction,\n onClose,\n actions = DEFAULT_AI_ACTIONS,\n showCustomPrompt = true,\n className = '',\n}) => {\n const menuRef = useRef<HTMLDivElement>(null);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [showPromptDialog, setShowPromptDialog] = useState(false);\n\n // All available actions including custom\n const allActions = showCustomPrompt ? [...actions, 'custom' as AIAction] : actions;\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose]);\n\n // Handle keyboard navigation\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n if (showPromptDialog) {\n setShowPromptDialog(false);\n } else {\n onClose();\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n setHighlightedIndex((prev) => (prev + 1) % allActions.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setHighlightedIndex((prev) => (prev - 1 + allActions.length) % allActions.length);\n break;\n case 'Enter':\n e.preventDefault();\n const action = allActions[highlightedIndex];\n if (action === 'custom') {\n setShowPromptDialog(true);\n } else {\n onAction(action);\n onClose();\n }\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, highlightedIndex, allActions, onAction, onClose, showPromptDialog]);\n\n // Reset highlighted index when menu opens\n useEffect(() => {\n if (isOpen) {\n setHighlightedIndex(0);\n setShowPromptDialog(false);\n }\n }, [isOpen]);\n\n // Position the menu to stay within viewport\n const getMenuStyle = useCallback((): React.CSSProperties => {\n const menuWidth = 200;\n const menuHeight = allActions.length * 36 + 16; // Approximate height\n\n let x = position.x;\n let y = position.y;\n\n // Adjust for viewport boundaries\n if (typeof window !== 'undefined') {\n if (x + menuWidth > window.innerWidth) {\n x = window.innerWidth - menuWidth - 10;\n }\n if (y + menuHeight > window.innerHeight) {\n y = window.innerHeight - menuHeight - 10;\n }\n if (x < 10) x = 10;\n if (y < 10) y = 10;\n }\n\n return {\n position: 'fixed',\n top: y,\n left: x,\n minWidth: menuWidth,\n background: 'white',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '8px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.15)',\n zIndex: 10000,\n padding: '4px 0',\n overflow: 'hidden',\n };\n }, [position, allActions.length]);\n\n const handleActionClick = (action: AIAction) => {\n if (action === 'custom') {\n setShowPromptDialog(true);\n } else {\n onAction(action);\n onClose();\n }\n };\n\n const handleCustomPromptSubmit = (prompt: string) => {\n onAction('custom', prompt);\n onClose();\n };\n\n if (!isOpen || !selectedText) return null;\n\n return (\n <div\n ref={menuRef}\n className={`docx-context-menu ${className}`}\n style={getMenuStyle()}\n role=\"menu\"\n aria-label=\"AI actions menu\"\n >\n {/* Header showing selected text preview */}\n <div\n style={{\n padding: '8px 12px',\n borderBottom: '1px solid var(--doc-border)',\n fontSize: '11px',\n color: 'var(--doc-text-muted)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n \"{selectedText.slice(0, 30)}\n {selectedText.length > 30 ? '...' : ''}\"\n </div>\n\n {/* Menu items */}\n <div role=\"group\">\n {allActions.map((action, index) => (\n <MenuItem\n key={action}\n action={action}\n onClick={() => handleActionClick(action)}\n isHighlighted={index === highlightedIndex}\n onMouseEnter={() => setHighlightedIndex(index)}\n />\n ))}\n </div>\n\n {/* Custom prompt dialog */}\n {showCustomPrompt && (\n <CustomPromptDialog\n isOpen={showPromptDialog}\n onSubmit={handleCustomPromptSubmit}\n onClose={() => setShowPromptDialog(false)}\n selectedText={selectedText}\n />\n )}\n </div>\n );\n};\n\n// ============================================================================\n// HOOK FOR CONTEXT MENU\n// ============================================================================\n\n/**\n * Hook to manage context menu state\n */\nexport function useContextMenu() {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [selectedText, setSelectedText] = useState('');\n const [selectionContext, setSelectionContext] = useState<SelectionContext | undefined>();\n\n const openMenu = useCallback(\n (e: React.MouseEvent | MouseEvent, text: string, context?: SelectionContext) => {\n e.preventDefault();\n setPosition({ x: e.clientX, y: e.clientY });\n setSelectedText(text);\n setSelectionContext(context);\n setIsOpen(true);\n },\n []\n );\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n return {\n isOpen,\n position,\n selectedText,\n selectionContext,\n openMenu,\n closeMenu,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get action shortcuts\n */\nexport function getActionShortcut(action: AIAction): string | undefined {\n const shortcuts: Partial<Record<AIAction, string>> = {\n rewrite: 'Ctrl+Shift+R',\n summarize: 'Ctrl+Shift+S',\n translate: 'Ctrl+Shift+T',\n fixGrammar: 'Ctrl+Shift+G',\n };\n return shortcuts[action];\n}\n\n/**\n * Check if action is available for selection\n */\nexport function isActionAvailable(\n _action: AIAction,\n selectedText: string,\n _selectionContext?: SelectionContext\n): boolean {\n if (!selectedText || selectedText.trim().length === 0) {\n return false;\n }\n\n // All actions are available for any non-empty selection\n return true;\n}\n\n/**\n * Get default actions for selection\n */\nexport function getDefaultActions(): AIAction[] {\n return [...DEFAULT_AI_ACTIONS];\n}\n\n/**\n * Get all available actions\n */\nexport function getAllActions(): AIAction[] {\n return [\n 'askAI',\n 'rewrite',\n 'expand',\n 'summarize',\n 'translate',\n 'explain',\n 'fixGrammar',\n 'makeFormal',\n 'makeCasual',\n 'custom',\n ];\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ContextMenu;\n","/**\n * Response Preview Component\n *\n * Shows AI response preview with diff view before applying changes.\n * Allows user to accept, reject, or edit the response.\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { AIAction, AgentResponse } from '@eigenpal/docx-core/types/agentApi';\nimport { getActionLabel } from '@eigenpal/docx-core/types/agentApi';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Response preview props\n */\nexport interface ResponsePreviewProps {\n /** Original selected text */\n originalText: string;\n /** AI response (or null if loading/error) */\n response: AgentResponse | null;\n /** Action that was performed */\n action: AIAction;\n /** Whether the response is loading */\n isLoading: boolean;\n /** Error message if request failed */\n error?: string;\n /** Callback when user accepts the change */\n onAccept: (newText: string) => void;\n /** Callback when user rejects the change */\n onReject: () => void;\n /** Callback when user wants to retry */\n onRetry?: () => void;\n /** Allow editing before accepting */\n allowEdit?: boolean;\n /** Show diff view */\n showDiff?: boolean;\n /** Additional className */\n className?: string;\n /** Position for the preview */\n position?: { x: number; y: number };\n}\n\n/**\n * Diff segment for rendering\n */\ninterface DiffSegment {\n type: 'same' | 'added' | 'removed';\n text: string;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst CheckIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 8l4 4 6-8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst XIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst RefreshIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 8a6 6 0 0111.318-2.828M14 8a6 6 0 01-11.318 2.828\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M13 2v4h-4M3 14v-4h4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst EditIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 2l3 3-9 9H2v-3l9-9z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst LoadingSpinner = () => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ animation: 'spin 1s linear infinite' }}\n >\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"var(--doc-border)\" strokeWidth=\"2\" fill=\"none\" />\n <path\n d=\"M10 2a8 8 0 018 8\"\n stroke=\"var(--doc-primary)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <style>{`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n </svg>\n);\n\n// ============================================================================\n// DIFF CALCULATION\n// ============================================================================\n\n/**\n * Calculate simple word-level diff between two texts\n */\nfunction calculateDiff(original: string, modified: string): DiffSegment[] {\n const segments: DiffSegment[] = [];\n\n // Split into words while preserving whitespace\n const originalWords = original.split(/(\\s+)/);\n const modifiedWords = modified.split(/(\\s+)/);\n\n // Simple LCS-based diff (not optimal but sufficient for short texts)\n let i = 0;\n let j = 0;\n\n while (i < originalWords.length || j < modifiedWords.length) {\n if (i >= originalWords.length) {\n // Remaining words in modified are additions\n segments.push({ type: 'added', text: modifiedWords.slice(j).join('') });\n break;\n }\n if (j >= modifiedWords.length) {\n // Remaining words in original are removals\n segments.push({ type: 'removed', text: originalWords.slice(i).join('') });\n break;\n }\n\n if (originalWords[i] === modifiedWords[j]) {\n // Same word\n segments.push({ type: 'same', text: originalWords[i] });\n i++;\n j++;\n } else {\n // Find next matching word\n const nextMatchInModified = modifiedWords.indexOf(originalWords[i], j);\n const nextMatchInOriginal = originalWords.indexOf(modifiedWords[j], i);\n\n if (nextMatchInModified === -1 && nextMatchInOriginal === -1) {\n // No match found - treat as replacement\n segments.push({ type: 'removed', text: originalWords[i] });\n segments.push({ type: 'added', text: modifiedWords[j] });\n i++;\n j++;\n } else if (\n nextMatchInOriginal !== -1 &&\n (nextMatchInModified === -1 || nextMatchInOriginal - i <= nextMatchInModified - j)\n ) {\n // Addition\n segments.push({ type: 'added', text: modifiedWords[j] });\n j++;\n } else {\n // Removal\n segments.push({ type: 'removed', text: originalWords[i] });\n i++;\n }\n }\n }\n\n // Merge consecutive segments of the same type\n const merged: DiffSegment[] = [];\n for (const segment of segments) {\n if (merged.length > 0 && merged[merged.length - 1].type === segment.type) {\n merged[merged.length - 1].text += segment.text;\n } else {\n merged.push(segment);\n }\n }\n\n return merged;\n}\n\n// ============================================================================\n// DIFF VIEW COMPONENT\n// ============================================================================\n\ninterface DiffViewProps {\n original: string;\n modified: string;\n}\n\nconst DiffView: React.FC<DiffViewProps> = ({ original, modified }) => {\n const segments = calculateDiff(original, modified);\n\n return (\n <div className=\"docx-response-diff\" style={{ lineHeight: 1.6, fontSize: '14px' }}>\n {segments.map((segment, index) => {\n let style: React.CSSProperties = {};\n\n switch (segment.type) {\n case 'removed':\n style = {\n textDecoration: 'line-through',\n color: '#d32f2f',\n backgroundColor: '#ffebee',\n };\n break;\n case 'added':\n style = {\n color: '#2e7d32',\n backgroundColor: '#e8f5e9',\n };\n break;\n default:\n break;\n }\n\n return (\n <span key={index} style={style}>\n {segment.text}\n </span>\n );\n })}\n </div>\n );\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const ResponsePreview: React.FC<ResponsePreviewProps> = ({\n originalText,\n response,\n action,\n isLoading,\n error,\n onAccept,\n onReject,\n onRetry,\n allowEdit = true,\n showDiff = true,\n className = '',\n position,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editedText, setEditedText] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Get the new text from response\n const newText = response?.newText || '';\n\n // Initialize edited text when response changes\n useEffect(() => {\n if (newText) {\n setEditedText(newText);\n }\n }, [newText]);\n\n // Focus textarea when editing\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.select();\n }\n }, [isEditing]);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (isEditing) {\n setIsEditing(false);\n setEditedText(newText);\n } else {\n onReject();\n }\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleAccept();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isEditing, newText, onReject]);\n\n const handleAccept = useCallback(() => {\n const textToAccept = isEditing ? editedText : newText;\n onAccept(textToAccept);\n }, [isEditing, editedText, newText, onAccept]);\n\n const handleStartEdit = useCallback(() => {\n setIsEditing(true);\n }, []);\n\n const handleCancelEdit = useCallback(() => {\n setIsEditing(false);\n setEditedText(newText);\n }, [newText]);\n\n // Calculate container style\n const containerStyle: React.CSSProperties = {\n position: position ? 'fixed' : 'relative',\n ...(position && {\n left: position.x,\n top: position.y,\n }),\n width: '400px',\n maxWidth: '90vw',\n maxHeight: '80vh',\n background: 'white',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n zIndex: 10000,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n };\n\n // Loading state\n if (isLoading) {\n return (\n <div\n ref={containerRef}\n className={`docx-response-preview docx-response-preview-loading ${className}`}\n style={containerStyle}\n >\n <div\n style={{\n padding: '24px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '16px',\n }}\n >\n <LoadingSpinner />\n <div style={{ color: 'var(--doc-text-muted)', fontSize: '14px' }}>\n {getActionLabel(action)}...\n </div>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div\n ref={containerRef}\n className={`docx-response-preview docx-response-preview-error ${className}`}\n style={containerStyle}\n >\n <div style={{ padding: '16px' }}>\n <div\n style={{\n padding: '12px',\n background: 'var(--doc-error-bg)',\n borderRadius: '4px',\n color: 'var(--doc-error)',\n fontSize: '13px',\n marginBottom: '16px',\n }}\n >\n {error}\n </div>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end' }}>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '8px 16px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n background: 'white',\n cursor: 'pointer',\n fontSize: '13px',\n }}\n >\n <RefreshIcon />\n Retry\n </button>\n )}\n <button\n type=\"button\"\n onClick={onReject}\n style={{\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n background: 'var(--doc-border)',\n cursor: 'pointer',\n fontSize: '13px',\n }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // No response yet\n if (!response || !newText) {\n return null;\n }\n\n return (\n <div ref={containerRef} className={`docx-response-preview ${className}`} style={containerStyle}>\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid var(--doc-border)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ fontWeight: 500, fontSize: '14px', color: 'var(--doc-text)' }}>\n {getActionLabel(action)} Result\n </div>\n <button\n type=\"button\"\n onClick={onReject}\n style={{\n display: 'flex',\n padding: '4px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--doc-text-muted)',\n }}\n title=\"Close (Esc)\"\n >\n <XIcon />\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n padding: '16px',\n overflowY: 'auto',\n flex: 1,\n }}\n >\n {isEditing ? (\n <div>\n <div style={{ marginBottom: '8px', fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n Edit the result before accepting:\n </div>\n <textarea\n ref={textareaRef}\n value={editedText}\n onChange={(e) => setEditedText(e.target.value)}\n style={{\n width: '100%',\n minHeight: '120px',\n padding: '12px',\n border: '1px solid var(--doc-primary)',\n borderRadius: '4px',\n fontSize: '14px',\n lineHeight: 1.6,\n resize: 'vertical',\n fontFamily: 'inherit',\n }}\n />\n </div>\n ) : showDiff ? (\n <div>\n <div style={{ marginBottom: '8px', fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n Changes:\n </div>\n <DiffView original={originalText} modified={newText} />\n </div>\n ) : (\n <div>\n <div style={{ marginBottom: '8px', fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n Original:\n </div>\n <div\n style={{\n padding: '8px 12px',\n background: 'var(--doc-bg-subtle)',\n borderRadius: '4px',\n marginBottom: '16px',\n textDecoration: 'line-through',\n color: 'var(--doc-text-placeholder)',\n fontSize: '13px',\n }}\n >\n {originalText}\n </div>\n <div style={{ marginBottom: '8px', fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n New:\n </div>\n <div\n style={{\n padding: '8px 12px',\n background: '#e8f5e9',\n borderRadius: '4px',\n color: '#2e7d32',\n fontSize: '13px',\n }}\n >\n {newText}\n </div>\n </div>\n )}\n\n {/* Warnings */}\n {response.warnings && response.warnings.length > 0 && (\n <div\n style={{\n marginTop: '16px',\n padding: '8px 12px',\n background: 'var(--doc-warning-bg)',\n borderRadius: '4px',\n fontSize: '12px',\n color: 'var(--doc-warning)',\n }}\n >\n {response.warnings.map((warning, index) => (\n <div key={index}>{warning}</div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid var(--doc-border)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div>\n {allowEdit && !isEditing && (\n <button\n type=\"button\"\n onClick={handleStartEdit}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '6px 12px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n background: 'white',\n cursor: 'pointer',\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n }}\n >\n <EditIcon />\n Edit\n </button>\n )}\n {isEditing && (\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n style={{\n padding: '6px 12px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n background: 'white',\n cursor: 'pointer',\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n }}\n >\n Cancel Edit\n </button>\n )}\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={onReject}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '8px 16px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n background: 'white',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'var(--doc-text-muted)',\n }}\n >\n <XIcon />\n Reject\n </button>\n <button\n type=\"button\"\n onClick={handleAccept}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '8px 16px',\n border: 'none',\n borderRadius: '4px',\n background: 'var(--doc-primary)',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'white',\n }}\n >\n <CheckIcon />\n Accept\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// HOOK FOR RESPONSE PREVIEW\n// ============================================================================\n\n/**\n * State for response preview\n */\nexport interface ResponsePreviewState {\n isVisible: boolean;\n originalText: string;\n response: AgentResponse | null;\n action: AIAction;\n isLoading: boolean;\n error?: string;\n position?: { x: number; y: number };\n}\n\n/**\n * Hook to manage response preview state\n */\nexport function useResponsePreview() {\n const [state, setState] = useState<ResponsePreviewState>({\n isVisible: false,\n originalText: '',\n response: null,\n action: 'rewrite',\n isLoading: false,\n });\n\n const showPreview = useCallback(\n (originalText: string, action: AIAction, position?: { x: number; y: number }) => {\n setState({\n isVisible: true,\n originalText,\n response: null,\n action,\n isLoading: true,\n position,\n });\n },\n []\n );\n\n const setResponse = useCallback((response: AgentResponse) => {\n setState((prev) => ({\n ...prev,\n response,\n isLoading: false,\n }));\n }, []);\n\n const setError = useCallback((error: string) => {\n setState((prev) => ({\n ...prev,\n error,\n isLoading: false,\n }));\n }, []);\n\n const hidePreview = useCallback(() => {\n setState((prev) => ({\n ...prev,\n isVisible: false,\n }));\n }, []);\n\n return {\n state,\n showPreview,\n setResponse,\n setError,\n hidePreview,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Create a mock response for testing\n */\nexport function createMockResponse(newText: string, warnings?: string[]): AgentResponse {\n return {\n success: true,\n newText,\n warnings,\n };\n}\n\n/**\n * Create an error response\n */\nexport function createErrorResponse(error: string): AgentResponse {\n return {\n success: false,\n error,\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ResponsePreview;\n","/**\n * Text Context Menu Component\n *\n * Right-click context menu for text editing operations.\n * Shows Cut, Copy, Paste, and other text editing options.\n */\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Context menu action types\n */\nexport type TextContextAction =\n | 'cut'\n | 'copy'\n | 'paste'\n | 'pasteAsPlainText'\n | 'selectAll'\n | 'delete'\n | 'separator';\n\n/**\n * Menu item configuration\n */\nexport interface TextContextMenuItem {\n /** Action type */\n action: TextContextAction;\n /** Display label */\n label: string;\n /** Keyboard shortcut hint */\n shortcut?: string;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Whether to show divider after this item */\n dividerAfter?: boolean;\n}\n\n/**\n * Context menu props\n */\nexport interface TextContextMenuProps {\n /** Whether the menu is visible */\n isOpen: boolean;\n /** Menu position */\n position: { x: number; y: number };\n /** Whether there's a selection (enables copy/cut) */\n hasSelection: boolean;\n /** Whether the editor is editable (enables paste/cut/delete) */\n isEditable: boolean;\n /** Whether clipboard has content (enables paste) */\n hasClipboardContent?: boolean;\n /** Callback when an action is selected */\n onAction: (action: TextContextAction) => void;\n /** Callback when menu is closed */\n onClose: () => void;\n /** Custom menu items (overrides default) */\n items?: TextContextMenuItem[];\n /** Additional className */\n className?: string;\n}\n\n/**\n * Hook options for text context menu\n */\nexport interface UseTextContextMenuOptions {\n /** Whether the context menu is enabled */\n enabled?: boolean;\n /** Whether the editor is editable */\n isEditable?: boolean;\n /** Container element ref */\n containerRef?: React.RefObject<HTMLElement>;\n /** Callback when an action is triggered */\n onAction?: (action: TextContextAction) => void;\n}\n\n/**\n * Hook return value\n */\nexport interface UseTextContextMenuReturn {\n /** Whether the menu is open */\n isOpen: boolean;\n /** Menu position */\n position: { x: number; y: number };\n /** Whether there's a text selection */\n hasSelection: boolean;\n /** Open the context menu */\n openMenu: (event: React.MouseEvent | MouseEvent) => void;\n /** Close the context menu */\n closeMenu: () => void;\n /** Handle action selection */\n handleAction: (action: TextContextAction) => void;\n /** Context menu event handler for onContextMenu prop */\n onContextMenu: (event: React.MouseEvent) => void;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Default menu items\n */\nconst DEFAULT_MENU_ITEMS: TextContextMenuItem[] = [\n { action: 'cut', label: 'Cut', shortcut: 'Ctrl+X' },\n { action: 'copy', label: 'Copy', shortcut: 'Ctrl+C' },\n { action: 'paste', label: 'Paste', shortcut: 'Ctrl+V' },\n {\n action: 'pasteAsPlainText',\n label: 'Paste as Plain Text',\n shortcut: 'Ctrl+Shift+V',\n dividerAfter: true,\n },\n { action: 'delete', label: 'Delete', shortcut: 'Del', dividerAfter: true },\n { action: 'selectAll', label: 'Select All', shortcut: 'Ctrl+A' },\n];\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst CutIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"4\" cy=\"12\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M5.5 10.5L10.5 3M10.5 10.5L5.5 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst CopyIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11 5V3a1 1 0 00-1-1H4a1 1 0 00-1 1v8a1 1 0 001 1h2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\nconst PasteIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"3\" width=\"10\" height=\"11\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 3V2a1 1 0 011-1h2a1 1 0 011 1v1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 8h4M6 11h4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst DeleteIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SelectAllIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n x=\"2\"\n y=\"2\"\n width=\"12\"\n height=\"12\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2 2\"\n />\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" fill=\"currentColor\" opacity=\"0.3\" />\n </svg>\n);\n\n/**\n * Get icon for action\n */\nfunction getActionIcon(action: TextContextAction): React.ReactNode {\n switch (action) {\n case 'cut':\n return <CutIcon />;\n case 'copy':\n return <CopyIcon />;\n case 'paste':\n case 'pasteAsPlainText':\n return <PasteIcon />;\n case 'delete':\n return <DeleteIcon />;\n case 'selectAll':\n return <SelectAllIcon />;\n default:\n return null;\n }\n}\n\n// ============================================================================\n// MENU ITEM COMPONENT\n// ============================================================================\n\ninterface MenuItemComponentProps {\n item: TextContextMenuItem;\n onClick: () => void;\n isHighlighted: boolean;\n onMouseEnter: () => void;\n}\n\nconst MenuItemComponent: React.FC<MenuItemComponentProps> = ({\n item,\n onClick,\n isHighlighted,\n onMouseEnter,\n}) => {\n if (item.action === 'separator') {\n return (\n <div\n className=\"docx-text-context-menu-separator\"\n style={{\n height: '1px',\n backgroundColor: 'var(--doc-border)',\n margin: '4px 12px',\n }}\n />\n );\n }\n\n return (\n <>\n <button\n type=\"button\"\n className={`docx-text-context-menu-item ${isHighlighted ? 'docx-text-context-menu-item-highlighted' : ''} ${item.disabled ? 'docx-text-context-menu-item-disabled' : ''}`}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n disabled={item.disabled}\n role=\"menuitem\"\n aria-disabled={item.disabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n background: isHighlighted && !item.disabled ? 'var(--doc-primary-light)' : 'transparent',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '13px',\n color: item.disabled ? 'var(--doc-text-subtle)' : 'var(--doc-text)',\n textAlign: 'left',\n opacity: item.disabled ? 0.6 : 1,\n }}\n >\n <span\n style={{\n display: 'flex',\n color: item.disabled ? 'var(--doc-border)' : 'var(--doc-text-muted)',\n }}\n >\n {getActionIcon(item.action)}\n </span>\n <span style={{ flex: 1 }}>{item.label}</span>\n {item.shortcut && (\n <span\n style={{\n fontSize: '11px',\n color: 'var(--doc-text-subtle)',\n fontFamily: 'monospace',\n }}\n >\n {item.shortcut}\n </span>\n )}\n </button>\n {item.dividerAfter && (\n <div\n className=\"docx-text-context-menu-separator\"\n style={{\n height: '1px',\n backgroundColor: 'var(--doc-border)',\n margin: '4px 12px',\n }}\n />\n )}\n </>\n );\n};\n\n// ============================================================================\n// TEXT CONTEXT MENU COMPONENT\n// ============================================================================\n\nexport const TextContextMenu: React.FC<TextContextMenuProps> = ({\n isOpen,\n position,\n hasSelection,\n isEditable,\n hasClipboardContent = true,\n onAction,\n onClose,\n items,\n className = '',\n}) => {\n const menuRef = useRef<HTMLDivElement>(null);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n // Build menu items with disabled states\n const menuItems = (items || DEFAULT_MENU_ITEMS).map((item) => {\n const disabled = (() => {\n if (item.disabled !== undefined) return item.disabled;\n switch (item.action) {\n case 'cut':\n case 'copy':\n case 'delete':\n return !hasSelection;\n case 'paste':\n case 'pasteAsPlainText':\n return !isEditable || !hasClipboardContent;\n default:\n return false;\n }\n })();\n\n return { ...item, disabled };\n });\n\n // Filter out separators for keyboard navigation\n const navigableItems = menuItems.filter((item) => item.action !== 'separator');\n\n // Handle click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n\n // Use timeout to avoid immediately closing on right-click\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onClose]);\n\n // Handle keyboard navigation\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'ArrowDown':\n e.preventDefault();\n setHighlightedIndex((prev) => {\n let next = (prev + 1) % navigableItems.length;\n // Skip disabled items\n while (navigableItems[next]?.disabled && next !== prev) {\n next = (next + 1) % navigableItems.length;\n }\n return next;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setHighlightedIndex((prev) => {\n let next = (prev - 1 + navigableItems.length) % navigableItems.length;\n // Skip disabled items\n while (navigableItems[next]?.disabled && next !== prev) {\n next = (next - 1 + navigableItems.length) % navigableItems.length;\n }\n return next;\n });\n break;\n case 'Enter':\n e.preventDefault();\n const item = navigableItems[highlightedIndex];\n if (item && !item.disabled) {\n onAction(item.action);\n onClose();\n }\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, highlightedIndex, navigableItems, onAction, onClose]);\n\n // Reset highlighted index when menu opens\n useEffect(() => {\n if (isOpen) {\n setHighlightedIndex(0);\n }\n }, [isOpen]);\n\n // Position menu to stay within viewport\n const getMenuStyle = useCallback((): React.CSSProperties => {\n const menuWidth = 220;\n const menuHeight = menuItems.length * 36 + 16;\n\n let x = position.x;\n let y = position.y;\n\n if (typeof window !== 'undefined') {\n if (x + menuWidth > window.innerWidth) {\n x = window.innerWidth - menuWidth - 10;\n }\n if (y + menuHeight > window.innerHeight) {\n y = window.innerHeight - menuHeight - 10;\n }\n if (x < 10) x = 10;\n if (y < 10) y = 10;\n }\n\n return {\n position: 'fixed',\n top: y,\n left: x,\n minWidth: menuWidth,\n background: 'white',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '8px',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.15)',\n zIndex: 10000,\n padding: '4px 0',\n overflow: 'hidden',\n };\n }, [position, menuItems.length]);\n\n const handleItemClick = (item: TextContextMenuItem) => {\n if (item.disabled) return;\n onAction(item.action);\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={menuRef}\n className={`docx-text-context-menu ${className}`}\n style={getMenuStyle()}\n role=\"menu\"\n aria-label=\"Text editing menu\"\n >\n {menuItems.map((item, index) => {\n // Find the index in navigable items for highlighting\n const navigableIndex = navigableItems.findIndex((ni) => ni === item);\n\n return (\n <MenuItemComponent\n key={`${item.action}-${index}`}\n item={item}\n onClick={() => handleItemClick(item)}\n isHighlighted={navigableIndex === highlightedIndex}\n onMouseEnter={() => {\n if (navigableIndex >= 0 && !item.disabled) {\n setHighlightedIndex(navigableIndex);\n }\n }}\n />\n );\n })}\n </div>\n );\n};\n\n// ============================================================================\n// USE TEXT CONTEXT MENU HOOK\n// ============================================================================\n\n/**\n * Hook to manage text context menu state\n */\nexport function useTextContextMenu(\n options: UseTextContextMenuOptions = {}\n): UseTextContextMenuReturn {\n const {\n enabled = true,\n isEditable: _isEditable = true,\n containerRef: _containerRef,\n onAction,\n } = options;\n\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [hasSelection, setHasSelection] = useState(false);\n\n /**\n * Check if there's a text selection\n */\n const checkSelection = useCallback(() => {\n const selection = window.getSelection();\n const hasText = selection && !selection.isCollapsed && selection.toString().length > 0;\n setHasSelection(!!hasText);\n return !!hasText;\n }, []);\n\n /**\n * Open the context menu\n */\n const openMenu = useCallback(\n (event: React.MouseEvent | MouseEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n // Update selection state\n checkSelection();\n\n setPosition({ x: event.clientX, y: event.clientY });\n setIsOpen(true);\n },\n [enabled, checkSelection]\n );\n\n /**\n * Close the context menu\n */\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n /**\n * Handle action selection\n */\n const handleAction = useCallback(\n (action: TextContextAction) => {\n closeMenu();\n\n // Execute the action\n switch (action) {\n case 'cut':\n document.execCommand('cut');\n break;\n case 'copy':\n document.execCommand('copy');\n break;\n case 'paste':\n document.execCommand('paste');\n break;\n case 'pasteAsPlainText':\n // Trigger paste event with shift key simulation\n // Note: This may not work in all browsers due to security restrictions\n navigator.clipboard\n .readText?.()\n .then((text) => {\n document.execCommand('insertText', false, text);\n })\n .catch(() => {\n // Fallback - just try regular paste\n document.execCommand('paste');\n });\n break;\n case 'delete':\n document.execCommand('delete');\n break;\n case 'selectAll':\n document.execCommand('selectAll');\n break;\n }\n\n onAction?.(action);\n },\n [closeMenu, onAction]\n );\n\n /**\n * Context menu event handler\n */\n const onContextMenu = useCallback(\n (event: React.MouseEvent) => {\n openMenu(event);\n },\n [openMenu]\n );\n\n // Close menu when clicking elsewhere or pressing Escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeMenu();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, closeMenu]);\n\n return {\n isOpen,\n position,\n hasSelection,\n openMenu,\n closeMenu,\n handleAction,\n onContextMenu,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get action label\n */\nexport function getTextActionLabel(action: TextContextAction): string {\n const labels: Record<TextContextAction, string> = {\n cut: 'Cut',\n copy: 'Copy',\n paste: 'Paste',\n pasteAsPlainText: 'Paste as Plain Text',\n selectAll: 'Select All',\n delete: 'Delete',\n separator: '',\n };\n return labels[action];\n}\n\n/**\n * Get action shortcut\n */\nexport function getTextActionShortcut(action: TextContextAction): string {\n const shortcuts: Record<TextContextAction, string> = {\n cut: 'Ctrl+X',\n copy: 'Ctrl+C',\n paste: 'Ctrl+V',\n pasteAsPlainText: 'Ctrl+Shift+V',\n selectAll: 'Ctrl+A',\n delete: 'Del',\n separator: '',\n };\n return shortcuts[action];\n}\n\n/**\n * Get default menu items\n */\nexport function getDefaultTextContextMenuItems(): TextContextMenuItem[] {\n return [...DEFAULT_MENU_ITEMS];\n}\n\n/**\n * Check if action is available\n */\nexport function isTextActionAvailable(\n action: TextContextAction,\n hasSelection: boolean,\n isEditable: boolean\n): boolean {\n switch (action) {\n case 'cut':\n case 'copy':\n case 'delete':\n return hasSelection;\n case 'paste':\n case 'pasteAsPlainText':\n return isEditable;\n case 'selectAll':\n return true;\n default:\n return true;\n }\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default TextContextMenu;\n","/**\n * Print Utilities\n *\n * Provides print functionality with:\n * - Print button component for toolbar\n * - Print-specific CSS styles\n * - Browser print dialog trigger\n * - Page range utilities\n */\n\nimport React from 'react';\nimport type { CSSProperties } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Print options\n */\nexport interface PrintOptions {\n /** Whether to include headers */\n includeHeaders?: boolean;\n /** Whether to include footers */\n includeFooters?: boolean;\n /** Whether to include page numbers */\n includePageNumbers?: boolean;\n /** Page range to print (null = all) */\n pageRange?: { start: number; end: number } | null;\n /** Scale factor for printing (1.0 = 100%) */\n scale?: number;\n /** Whether to show background colors */\n printBackground?: boolean;\n /** Margins mode */\n margins?: 'default' | 'none' | 'minimum';\n}\n\n/**\n * PrintButton props\n */\nexport interface PrintButtonProps {\n /** Callback when print is triggered */\n onPrint: () => void;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Button label */\n label?: string;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Show icon */\n showIcon?: boolean;\n /** Compact mode */\n compact?: boolean;\n}\n\n// ============================================================================\n// DEFAULT VALUES\n// ============================================================================\n\nconst DEFAULT_PRINT_OPTIONS: PrintOptions = {\n includeHeaders: true,\n includeFooters: true,\n includePageNumbers: true,\n pageRange: null,\n scale: 1.0,\n printBackground: true,\n margins: 'default',\n};\n\n// ============================================================================\n// PRINT BUTTON COMPONENT\n// ============================================================================\n\n/**\n * PrintButton - Standalone print button for toolbar\n */\nexport function PrintButton({\n onPrint,\n disabled = false,\n label = 'Print',\n className = '',\n style,\n showIcon = true,\n compact = false,\n}: PrintButtonProps): React.ReactElement {\n const buttonStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: compact ? '4px' : '6px',\n padding: compact ? '4px 8px' : '6px 12px',\n fontSize: compact ? '13px' : '14px',\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: '4px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? 'var(--doc-text-muted)' : 'var(--doc-text)',\n opacity: disabled ? 0.6 : 1,\n transition: 'background-color 0.15s, border-color 0.15s',\n ...style,\n };\n\n return (\n <button\n className={`docx-print-button ${className}`.trim()}\n style={buttonStyle}\n onClick={onPrint}\n disabled={disabled}\n aria-label={label}\n title={label}\n >\n {showIcon && <PrintIcon size={compact ? 14 : 16} />}\n {!compact && <span>{label}</span>}\n </button>\n );\n}\n\n// ============================================================================\n// PRINT STYLES COMPONENT\n// ============================================================================\n\n/**\n * PrintStyles - Injects print-specific CSS\n */\nexport function PrintStyles(): React.ReactElement {\n return (\n <style>\n {`\n @media print {\n /* Hide everything except print content */\n body * {\n visibility: hidden;\n }\n\n .docx-print-pages,\n .docx-print-pages * {\n visibility: visible;\n }\n\n .docx-print-pages {\n position: absolute;\n left: 0;\n top: 0;\n }\n\n /* Remove shadows and margins in print */\n .docx-print-page {\n box-shadow: none !important;\n margin: 0 !important;\n page-break-after: always;\n page-break-inside: avoid;\n }\n\n /* Ensure images print */\n img {\n max-width: 100%;\n page-break-inside: avoid;\n }\n\n /* Ensure tables don't break badly */\n table {\n page-break-inside: avoid;\n }\n\n tr {\n page-break-inside: avoid;\n }\n\n /* Keep headings with content */\n h1, h2, h3, h4, h5, h6 {\n page-break-after: avoid;\n }\n\n /* Avoid orphan lines */\n p {\n orphans: 3;\n widows: 3;\n }\n }\n\n @page {\n margin: 0;\n size: auto;\n }\n `}\n </style>\n );\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\ninterface IconProps {\n size?: number;\n}\n\nfunction PrintIcon({ size = 18 }: IconProps): React.ReactElement {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 6 2 18 2 18 9\" />\n <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\" />\n <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\" />\n </svg>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Trigger browser print dialog for the current document\n */\nexport function triggerPrint(): void {\n window.print();\n}\n\n/**\n * Create print-optimized document view in a new window\n */\nexport function openPrintWindow(title: string = 'Document', content: string): Window | null {\n const printWindow = window.open('', '_blank');\n if (!printWindow) return null;\n\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title}</title>\n <style>\n @media print {\n body {\n margin: 0;\n padding: 0;\n }\n @page {\n margin: 0;\n }\n }\n </style>\n </head>\n <body>\n ${content}\n </body>\n </html>\n `);\n\n printWindow.document.close();\n return printWindow;\n}\n\n/**\n * Get default print options\n */\nexport function getDefaultPrintOptions(): PrintOptions {\n return { ...DEFAULT_PRINT_OPTIONS };\n}\n\n/**\n * Create page range from string (e.g., \"1-5\", \"3\", \"1,3,5\")\n */\nexport function parsePageRange(\n input: string,\n maxPages: number\n): { start: number; end: number } | null {\n if (!input || !input.trim()) return null;\n\n const trimmed = input.trim();\n\n // Single page\n if (/^\\d+$/.test(trimmed)) {\n const page = parseInt(trimmed, 10);\n if (page >= 1 && page <= maxPages) {\n return { start: page, end: page };\n }\n return null;\n }\n\n // Range (e.g., \"1-5\")\n const rangeMatch = trimmed.match(/^(\\d+)-(\\d+)$/);\n if (rangeMatch) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n if (start >= 1 && end <= maxPages && start <= end) {\n return { start, end };\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Format page range for display\n */\nexport function formatPageRange(\n range: { start: number; end: number } | null,\n totalPages: number\n): string {\n if (!range) return `All (${totalPages} pages)`;\n if (range.start === range.end) return `Page ${range.start}`;\n return `Pages ${range.start}-${range.end}`;\n}\n\n/**\n * Check if browser supports good print functionality\n */\nexport function isPrintSupported(): boolean {\n return typeof window !== 'undefined' && typeof window.print === 'function';\n}\n","/**\n * TableMergeButton - Toggle button for merge/split cells\n */\n\nimport React, { useCallback } from 'react';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\n\nexport interface TableMergeButtonProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n canMerge?: boolean;\n canSplit?: boolean;\n}\n\nexport function TableMergeButton({\n onAction,\n disabled = false,\n canMerge = false,\n canSplit = false,\n}: TableMergeButtonProps) {\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleMerge = useCallback(() => {\n if (canMerge) onAction('mergeCells');\n }, [onAction, canMerge]);\n\n const handleSplit = useCallback(() => {\n if (canSplit) onAction('splitCell');\n }, [onAction, canSplit]);\n\n const mergeButton = (\n <Tooltip content=\"Merge cells\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n (disabled || !canMerge) && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={handleMerge}\n disabled={disabled || !canMerge}\n aria-label=\"Merge cells\"\n data-testid=\"toolbar-table-merge\"\n >\n <MaterialSymbol name=\"call_merge\" size={20} />\n </Button>\n </Tooltip>\n );\n\n const splitButton = (\n <Tooltip content=\"Split cell\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n (disabled || !canSplit) && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={handleSplit}\n disabled={disabled || !canSplit}\n aria-label=\"Split cell\"\n data-testid=\"toolbar-table-split\"\n >\n <MaterialSymbol name=\"call_split\" size={20} />\n </Button>\n </Tooltip>\n );\n\n return (\n <>\n {mergeButton}\n {splitButton}\n </>\n );\n}\n\nexport default TableMergeButton;\n","/**\n * TableInsertButtons - 4 icon buttons for row/column insertion\n *\n * Insert row above, insert row below, insert column left, insert column right.\n */\n\nimport React, { useCallback } from 'react';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\n\nexport interface TableInsertButtonsProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n}\n\nconst INSERT_ACTIONS: { action: TableAction; icon: string; label: string; testId: string }[] = [\n {\n action: 'addRowAbove',\n icon: 'keyboard_arrow_up',\n label: 'Insert row above',\n testId: 'toolbar-table-add-row-above',\n },\n {\n action: 'addRowBelow',\n icon: 'keyboard_arrow_down',\n label: 'Insert row below',\n testId: 'toolbar-table-add-row-below',\n },\n {\n action: 'addColumnLeft',\n icon: 'keyboard_arrow_left',\n label: 'Insert column left',\n testId: 'toolbar-table-add-col-left',\n },\n {\n action: 'addColumnRight',\n icon: 'keyboard_arrow_right',\n label: 'Insert column right',\n testId: 'toolbar-table-add-col-right',\n },\n];\n\nexport function TableInsertButtons({ onAction, disabled = false }: TableInsertButtonsProps) {\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <>\n {INSERT_ACTIONS.map(({ action, icon, label, testId }) => (\n <Tooltip key={typeof action === 'string' ? action : action.type} content={label}>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && onAction(action)}\n disabled={disabled}\n aria-label={label}\n data-testid={testId}\n >\n <MaterialSymbol name={icon} size={20} />\n </Button>\n </Tooltip>\n ))}\n </>\n );\n}\n\nexport default TableInsertButtons;\n","/**\n * CellBackgroundPicker Component\n *\n * UI for changing table cell background/shading color.\n * Provides a color grid similar to the text highlight picker but\n * optimized for table cell backgrounds.\n */\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { ShadingProperties } from '@eigenpal/docx-core/types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Color option for the picker\n */\nexport interface CellColorOption {\n /** Hex color value */\n hex: string;\n /** Display name */\n name: string;\n}\n\n/**\n * Props for CellBackgroundPicker\n */\nexport interface CellBackgroundPickerProps {\n /** Current background color (hex) */\n value?: string | null;\n /** Callback when color is selected */\n onChange?: (color: string | null) => void;\n /** Custom color options */\n colors?: CellColorOption[];\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Show \"No Fill\" option (default: true) */\n showNoFill?: boolean;\n /** Show custom color input (default: true) */\n showCustomColor?: boolean;\n /** Compact mode for toolbar */\n compact?: boolean;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst STYLES: Record<string, CSSProperties> = {\n container: {\n position: 'relative',\n display: 'inline-block',\n },\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px 8px',\n border: '1px solid #d0d0d0',\n borderRadius: '3px',\n backgroundColor: '#fff',\n cursor: 'pointer',\n fontSize: '12px',\n gap: '4px',\n minWidth: '32px',\n height: '28px',\n transition: 'background-color 0.15s, border-color 0.15s',\n },\n buttonHover: {\n borderColor: '#1a73e8',\n backgroundColor: '#f0f7ff',\n },\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n colorIndicator: {\n width: '16px',\n height: '16px',\n border: '1px solid #ccc',\n borderRadius: '2px',\n },\n dropdown: {\n position: 'absolute',\n top: '100%',\n left: '0',\n marginTop: '4px',\n padding: '8px',\n backgroundColor: '#fff',\n border: '1px solid #e0e0e0',\n borderRadius: '4px',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n zIndex: 1000,\n minWidth: '180px',\n },\n colorGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(6, 1fr)',\n gap: '4px',\n marginBottom: '8px',\n },\n colorCell: {\n width: '24px',\n height: '24px',\n border: '1px solid #ccc',\n borderRadius: '2px',\n cursor: 'pointer',\n transition: 'transform 0.1s, box-shadow 0.1s',\n },\n colorCellHover: {\n transform: 'scale(1.1)',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n },\n colorCellSelected: {\n border: '2px solid #1a73e8',\n },\n noFillButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n padding: '6px 8px',\n border: 'none',\n borderRadius: '3px',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n fontSize: '12px',\n color: '#333',\n transition: 'background-color 0.15s',\n },\n noFillButtonHover: {\n backgroundColor: '#f0f0f0',\n },\n noFillIcon: {\n width: '16px',\n height: '16px',\n border: '1px solid #ccc',\n borderRadius: '2px',\n position: 'relative',\n backgroundColor: '#fff',\n },\n separator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '8px 0',\n },\n customColorRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n customColorInput: {\n width: '40px',\n height: '28px',\n padding: '0',\n border: '1px solid #ccc',\n borderRadius: '3px',\n cursor: 'pointer',\n },\n customColorLabel: {\n fontSize: '11px',\n color: '#666',\n },\n};\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\n/**\n * Cell Fill Icon - Paint bucket\n */\nfunction CellFillIcon(): React.ReactElement {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 12L6.5 2.5L11 7L7 11H13V13H2V12Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"13\" cy=\"10\" r=\"2\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/**\n * No Fill Icon - Diagonal line through cell\n */\nfunction NoFillIcon(): React.ReactElement {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" stroke=\"#ccc\" strokeWidth=\"1\" fill=\"none\" />\n <line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"2\" stroke=\"#d32f2f\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Default cell background colors\n * Common colors for table cell backgrounds\n */\nexport const DEFAULT_CELL_COLORS: CellColorOption[] = [\n // Row 1: Light colors\n { hex: '#FFFFFF', name: 'White' },\n { hex: '#F2F2F2', name: 'Light Gray 1' },\n { hex: '#D9D9D9', name: 'Light Gray 2' },\n { hex: '#BFBFBF', name: 'Gray' },\n { hex: '#808080', name: 'Dark Gray' },\n { hex: '#000000', name: 'Black' },\n // Row 2: Blues\n { hex: '#E6F3FF', name: 'Light Blue 1' },\n { hex: '#CCE5FF', name: 'Light Blue 2' },\n { hex: '#99CCFF', name: 'Light Blue 3' },\n { hex: '#4DA6FF', name: 'Blue' },\n { hex: '#0066CC', name: 'Dark Blue' },\n { hex: '#003366', name: 'Navy' },\n // Row 3: Greens\n { hex: '#E6FFE6', name: 'Light Green 1' },\n { hex: '#CCFFCC', name: 'Light Green 2' },\n { hex: '#99FF99', name: 'Light Green 3' },\n { hex: '#33CC33', name: 'Green' },\n { hex: '#009900', name: 'Dark Green' },\n { hex: '#006600', name: 'Forest' },\n // Row 4: Yellows/Oranges\n { hex: '#FFFFCC', name: 'Light Yellow' },\n { hex: '#FFFF99', name: 'Yellow' },\n { hex: '#FFE066', name: 'Gold' },\n { hex: '#FFCC00', name: 'Orange Yellow' },\n { hex: '#FF9900', name: 'Orange' },\n { hex: '#CC6600', name: 'Dark Orange' },\n // Row 5: Reds/Pinks\n { hex: '#FFE6E6', name: 'Light Pink' },\n { hex: '#FFCCCC', name: 'Pink' },\n { hex: '#FF9999', name: 'Light Red' },\n { hex: '#FF6666', name: 'Red' },\n { hex: '#CC0000', name: 'Dark Red' },\n { hex: '#660000', name: 'Maroon' },\n // Row 6: Purples\n { hex: '#F2E6FF', name: 'Light Purple 1' },\n { hex: '#E6CCFF', name: 'Light Purple 2' },\n { hex: '#CC99FF', name: 'Light Purple 3' },\n { hex: '#9933FF', name: 'Purple' },\n { hex: '#6600CC', name: 'Dark Purple' },\n { hex: '#330066', name: 'Indigo' },\n];\n\n// ============================================================================\n// COMPONENTS\n// ============================================================================\n\n/**\n * CellBackgroundPicker - Color picker for table cell backgrounds\n */\nexport function CellBackgroundPicker({\n value,\n onChange,\n colors = DEFAULT_CELL_COLORS,\n disabled = false,\n className,\n style: additionalStyle,\n showNoFill = true,\n showCustomColor = true,\n compact = false,\n}: CellBackgroundPickerProps): React.ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [hoveredColor, setHoveredColor] = useState<string | null>(null);\n const [noFillHovered, setNoFillHovered] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // Handle toggle\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n // Handle color selection\n const handleColorSelect = useCallback(\n (color: string) => {\n onChange?.(color);\n setIsOpen(false);\n },\n [onChange]\n );\n\n // Handle no fill\n const handleNoFill = useCallback(() => {\n onChange?.(null);\n setIsOpen(false);\n }, [onChange]);\n\n // Handle custom color\n const handleCustomColor = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n },\n [onChange]\n );\n\n // Button style\n const buttonStyle: CSSProperties = {\n ...STYLES.button,\n ...(isHovered && !disabled ? STYLES.buttonHover : {}),\n ...(disabled ? STYLES.buttonDisabled : {}),\n ...(compact ? { padding: '2px 4px', minWidth: '28px', height: '24px' } : {}),\n };\n\n // Color indicator style\n const indicatorStyle: CSSProperties = {\n ...STYLES.colorIndicator,\n backgroundColor: value || 'transparent',\n ...(value === null\n ? { background: 'repeating-linear-gradient(45deg, #fff, #fff 2px, #f0f0f0 2px, #f0f0f0 4px)' }\n : {}),\n };\n\n const classNames = ['docx-cell-background-picker'];\n if (className) classNames.push(className);\n if (compact) classNames.push('docx-cell-background-picker-compact');\n\n return (\n <div\n ref={containerRef}\n className={classNames.join(' ')}\n style={{ ...STYLES.container, ...additionalStyle }}\n >\n <button\n type=\"button\"\n style={buttonStyle}\n onClick={handleToggle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n disabled={disabled}\n title=\"Cell Background Color\"\n aria-label=\"Cell Background Color\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n <CellFillIcon />\n <div style={indicatorStyle} />\n </button>\n\n {isOpen && (\n <div style={STYLES.dropdown}>\n {/* No Fill option */}\n {showNoFill && (\n <>\n <button\n type=\"button\"\n style={{\n ...STYLES.noFillButton,\n ...(noFillHovered ? STYLES.noFillButtonHover : {}),\n }}\n onClick={handleNoFill}\n onMouseEnter={() => setNoFillHovered(true)}\n onMouseLeave={() => setNoFillHovered(false)}\n >\n <NoFillIcon />\n <span>No Fill</span>\n </button>\n <div style={STYLES.separator} />\n </>\n )}\n\n {/* Color grid */}\n <div style={STYLES.colorGrid}>\n {colors.map((color) => (\n <button\n key={color.hex}\n type=\"button\"\n style={{\n ...STYLES.colorCell,\n backgroundColor: color.hex,\n ...(hoveredColor === color.hex ? STYLES.colorCellHover : {}),\n ...(value === color.hex ? STYLES.colorCellSelected : {}),\n }}\n onClick={() => handleColorSelect(color.hex)}\n onMouseEnter={() => setHoveredColor(color.hex)}\n onMouseLeave={() => setHoveredColor(null)}\n title={color.name}\n aria-label={color.name}\n />\n ))}\n </div>\n\n {/* Custom color */}\n {showCustomColor && (\n <>\n <div style={STYLES.separator} />\n <div style={STYLES.customColorRow}>\n <input\n type=\"color\"\n value={value || '#FFFFFF'}\n onChange={handleCustomColor}\n style={STYLES.customColorInput}\n title=\"Custom Color\"\n />\n <span style={STYLES.customColorLabel}>Custom color</span>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get default cell colors\n */\nexport function getDefaultCellColors(): CellColorOption[] {\n return DEFAULT_CELL_COLORS;\n}\n\n/**\n * Create a color option\n */\nexport function createCellColorOption(hex: string, name?: string): CellColorOption {\n return {\n hex: hex.toUpperCase(),\n name: name || hex,\n };\n}\n\n/**\n * Check if color is in the default palette\n */\nexport function isDefaultCellColor(hex: string): boolean {\n return DEFAULT_CELL_COLORS.some((c) => c.hex.toUpperCase() === hex.toUpperCase());\n}\n\n/**\n * Get color name from hex\n */\nexport function getCellColorName(hex: string): string {\n const color = DEFAULT_CELL_COLORS.find((c) => c.hex.toUpperCase() === hex.toUpperCase());\n return color?.name || hex;\n}\n\n/**\n * Create ShadingProperties from color\n */\nexport function createShadingFromColor(color: string | null): ShadingProperties | undefined {\n if (!color) {\n return undefined;\n }\n return {\n fill: { rgb: color.replace('#', '') },\n pattern: 'clear',\n };\n}\n\n/**\n * Get color from ShadingProperties\n */\nexport function getColorFromShading(shading: ShadingProperties | undefined): string | null {\n if (!shading || !shading.fill) {\n return null;\n }\n if (shading.fill.rgb) {\n return `#${shading.fill.rgb}`;\n }\n return null;\n}\n\n/**\n * Parse hex color to RGB\n */\nexport function hexToRgbValues(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n}\n\n/**\n * Get contrasting text color (black or white) for a background\n */\nexport function getContrastingTextColor(bgHex: string): string {\n const rgb = hexToRgbValues(bgHex);\n if (!rgb) return '#000000';\n\n // Calculate relative luminance\n const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;\n return luminance > 0.5 ? '#000000' : '#FFFFFF';\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default CellBackgroundPicker;\n","/**\n * Unsaved Changes Indicator Component\n *\n * Visual indicator that shows when document has unsaved changes.\n * Features:\n * - Configurable appearance (dot, badge, text)\n * - Pulse animation option for visibility\n * - Hook for tracking changes\n * - Browser beforeunload warning\n */\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { Document } from '@eigenpal/docx-core/types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Indicator variant type\n */\nexport type IndicatorVariant = 'dot' | 'badge' | 'text' | 'icon';\n\n/**\n * Indicator position type\n */\nexport type IndicatorPosition = 'inline' | 'absolute-top-right' | 'absolute-top-left';\n\n/**\n * Unsaved indicator props\n */\nexport interface UnsavedIndicatorProps {\n /** Whether there are unsaved changes */\n hasUnsavedChanges: boolean;\n /** Variant of the indicator */\n variant?: IndicatorVariant;\n /** Position of the indicator */\n position?: IndicatorPosition;\n /** Whether to show pulse animation */\n showPulse?: boolean;\n /** Custom label for text variant */\n label?: string;\n /** Custom saved label for text variant */\n savedLabel?: string;\n /** Whether to show indicator when saved (always show) */\n showWhenSaved?: boolean;\n /** Custom color for unsaved state */\n unsavedColor?: string;\n /** Custom color for saved state */\n savedColor?: string;\n /** Size in pixels (for dot/icon) */\n size?: number;\n /** Additional className */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Click handler */\n onClick?: () => void;\n /** Title/tooltip text */\n title?: string;\n}\n\n/**\n * Hook options for tracking unsaved changes\n */\nexport interface UseUnsavedChangesOptions {\n /** The document to track */\n document?: Document | null;\n /** Whether to warn before leaving page */\n warnBeforeLeave?: boolean;\n /** Custom warning message */\n warningMessage?: string;\n /** Whether tracking is enabled */\n enabled?: boolean;\n /** Callback when changes status changes */\n onChangeStatusChange?: (hasChanges: boolean) => void;\n}\n\n/**\n * Hook return value\n */\nexport interface UseUnsavedChangesReturn {\n /** Whether there are unsaved changes */\n hasUnsavedChanges: boolean;\n /** Mark the document as saved (resets change tracking) */\n markAsSaved: () => void;\n /** Mark the document as changed */\n markAsChanged: () => void;\n /** Reset tracking (resets baseline) */\n resetTracking: (newDocument?: Document | null) => void;\n /** The last saved document snapshot */\n lastSavedDocument: Document | null;\n /** Number of changes since last save */\n changeCount: number;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_UNSAVED_COLOR = 'var(--doc-error)'; // Unsaved state\nconst DEFAULT_SAVED_COLOR = 'var(--doc-success)'; // Saved state\nconst DEFAULT_WARNING_MESSAGE = 'You have unsaved changes. Are you sure you want to leave?';\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst SaveIcon = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 2h8l2 2v9a1 1 0 01-1 1H3a1 1 0 01-1-1V3a1 1 0 011-1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 2v4h5V2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 14v-4h6v4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst UnsavedIcon = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 5v4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.5\" fill=\"currentColor\" />\n </svg>\n);\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst pulseKeyframes = `\n@keyframes docx-unsaved-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n}\n`;\n\nconst getIndicatorStyles = (\n variant: IndicatorVariant,\n position: IndicatorPosition,\n hasUnsavedChanges: boolean,\n showPulse: boolean,\n unsavedColor: string,\n savedColor: string,\n size: number\n): React.CSSProperties => {\n const baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n animation:\n hasUnsavedChanges && showPulse ? 'docx-unsaved-pulse 2s ease-in-out infinite' : 'none',\n };\n\n // Position styles\n if (position === 'absolute-top-right') {\n baseStyles.position = 'absolute';\n baseStyles.top = '4px';\n baseStyles.right = '4px';\n } else if (position === 'absolute-top-left') {\n baseStyles.position = 'absolute';\n baseStyles.top = '4px';\n baseStyles.left = '4px';\n }\n\n // Variant-specific styles\n switch (variant) {\n case 'dot':\n return {\n ...baseStyles,\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: '50%',\n backgroundColor: hasUnsavedChanges ? unsavedColor : savedColor,\n };\n\n case 'badge':\n return {\n ...baseStyles,\n padding: '2px 8px',\n borderRadius: '10px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor: hasUnsavedChanges ? unsavedColor : savedColor,\n color: 'white',\n };\n\n case 'text':\n return {\n ...baseStyles,\n fontSize: '12px',\n color: hasUnsavedChanges ? unsavedColor : savedColor,\n fontWeight: 500,\n };\n\n case 'icon':\n return {\n ...baseStyles,\n color: hasUnsavedChanges ? unsavedColor : savedColor,\n };\n\n default:\n return baseStyles;\n }\n};\n\n// ============================================================================\n// UNSAVED INDICATOR COMPONENT\n// ============================================================================\n\nexport const UnsavedIndicator: React.FC<UnsavedIndicatorProps> = ({\n hasUnsavedChanges,\n variant = 'dot',\n position = 'inline',\n showPulse = true,\n label = 'Unsaved',\n savedLabel = 'Saved',\n showWhenSaved = false,\n unsavedColor = DEFAULT_UNSAVED_COLOR,\n savedColor = DEFAULT_SAVED_COLOR,\n size = 8,\n className = '',\n style,\n onClick,\n title,\n}) => {\n // Inject keyframes if pulse is enabled - must be before early return\n useEffect(() => {\n if (!showPulse || !hasUnsavedChanges) return;\n\n const styleId = 'docx-unsaved-pulse-keyframes';\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = pulseKeyframes;\n document.head.appendChild(styleElement);\n }\n }, [showPulse, hasUnsavedChanges]);\n\n // Don't render if saved and showWhenSaved is false\n if (!hasUnsavedChanges && !showWhenSaved) {\n return null;\n }\n\n const indicatorStyles = getIndicatorStyles(\n variant,\n position,\n hasUnsavedChanges,\n showPulse,\n unsavedColor,\n savedColor,\n size\n );\n\n const combinedStyles: React.CSSProperties = {\n ...indicatorStyles,\n ...style,\n cursor: onClick ? 'pointer' : undefined,\n };\n\n const defaultTitle = hasUnsavedChanges ? 'Document has unsaved changes' : 'All changes saved';\n\n const renderContent = () => {\n switch (variant) {\n case 'dot':\n return null; // Just the styled element\n\n case 'badge':\n return hasUnsavedChanges ? label : savedLabel;\n\n case 'text':\n return hasUnsavedChanges ? label : savedLabel;\n\n case 'icon':\n return hasUnsavedChanges ? <UnsavedIcon size={size} /> : <SaveIcon size={size} />;\n\n default:\n return null;\n }\n };\n\n return (\n <span\n className={`docx-unsaved-indicator docx-unsaved-indicator-${variant} ${hasUnsavedChanges ? 'docx-unsaved' : 'docx-saved'} ${className}`}\n style={combinedStyles}\n onClick={onClick}\n title={title ?? defaultTitle}\n role={onClick ? 'button' : 'status'}\n aria-label={hasUnsavedChanges ? 'Unsaved changes' : 'All changes saved'}\n >\n {renderContent()}\n </span>\n );\n};\n\n// ============================================================================\n// USE UNSAVED CHANGES HOOK\n// ============================================================================\n\n/**\n * Hook to track unsaved changes in a document\n */\nexport function useUnsavedChanges(options: UseUnsavedChangesOptions = {}): UseUnsavedChangesReturn {\n const {\n document: currentDocument,\n warnBeforeLeave = true,\n warningMessage = DEFAULT_WARNING_MESSAGE,\n enabled = true,\n onChangeStatusChange,\n } = options;\n\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const [changeCount, setChangeCount] = useState(0);\n const [lastSavedDocument, setLastSavedDocument] = useState<Document | null>(null);\n const previousDocumentRef = useRef<string | null>(null);\n const initializedRef = useRef(false);\n\n /**\n * Serialize document for comparison\n * Uses JSON stringify for deep comparison\n */\n const serializeDocument = useCallback((doc: Document | null | undefined): string | null => {\n if (!doc) return null;\n try {\n // Serialize only the package content for comparison, excluding buffer\n return JSON.stringify(doc.package);\n } catch {\n return null;\n }\n }, []);\n\n /**\n * Mark document as saved\n */\n const markAsSaved = useCallback(() => {\n if (!enabled) return;\n\n setHasUnsavedChanges(false);\n setChangeCount(0);\n setLastSavedDocument(currentDocument ?? null);\n previousDocumentRef.current = serializeDocument(currentDocument);\n }, [enabled, currentDocument, serializeDocument]);\n\n /**\n * Mark document as changed\n */\n const markAsChanged = useCallback(() => {\n if (!enabled) return;\n\n if (!hasUnsavedChanges) {\n setHasUnsavedChanges(true);\n onChangeStatusChange?.(true);\n }\n setChangeCount((prev) => prev + 1);\n }, [enabled, hasUnsavedChanges, onChangeStatusChange]);\n\n /**\n * Reset tracking with optional new document\n */\n const resetTracking = useCallback(\n (newDocument?: Document | null) => {\n const docToUse = newDocument !== undefined ? newDocument : currentDocument;\n setHasUnsavedChanges(false);\n setChangeCount(0);\n setLastSavedDocument(docToUse ?? null);\n previousDocumentRef.current = serializeDocument(docToUse);\n initializedRef.current = true;\n },\n [currentDocument, serializeDocument]\n );\n\n // Initialize on first document\n useEffect(() => {\n if (!enabled || !currentDocument || initializedRef.current) return;\n resetTracking(currentDocument);\n }, [enabled, currentDocument, resetTracking]);\n\n // Track document changes\n useEffect(() => {\n if (!enabled || !currentDocument || !initializedRef.current) return;\n\n const currentSerialized = serializeDocument(currentDocument);\n const previousSerialized = previousDocumentRef.current;\n\n // If document content changed\n if (currentSerialized !== previousSerialized) {\n // Check if it's different from last saved state\n const lastSavedSerialized = serializeDocument(lastSavedDocument);\n\n if (currentSerialized !== lastSavedSerialized) {\n if (!hasUnsavedChanges) {\n setHasUnsavedChanges(true);\n onChangeStatusChange?.(true);\n }\n setChangeCount((prev) => prev + 1);\n } else {\n // Document matches saved state\n if (hasUnsavedChanges) {\n setHasUnsavedChanges(false);\n onChangeStatusChange?.(false);\n }\n }\n\n previousDocumentRef.current = currentSerialized;\n }\n }, [\n enabled,\n currentDocument,\n lastSavedDocument,\n hasUnsavedChanges,\n serializeDocument,\n onChangeStatusChange,\n ]);\n\n // Warn before leaving page\n useEffect(() => {\n if (!enabled || !warnBeforeLeave || !hasUnsavedChanges) return;\n\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n event.returnValue = warningMessage;\n return warningMessage;\n };\n\n window.addEventListener('beforeunload', handleBeforeUnload);\n return () => window.removeEventListener('beforeunload', handleBeforeUnload);\n }, [enabled, warnBeforeLeave, hasUnsavedChanges, warningMessage]);\n\n return {\n hasUnsavedChanges,\n markAsSaved,\n markAsChanged,\n resetTracking,\n lastSavedDocument,\n changeCount,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get indicator variant label\n */\nexport function getVariantLabel(variant: IndicatorVariant): string {\n const labels: Record<IndicatorVariant, string> = {\n dot: 'Dot',\n badge: 'Badge',\n text: 'Text',\n icon: 'Icon',\n };\n return labels[variant];\n}\n\n/**\n * Get all indicator variants\n */\nexport function getAllVariants(): IndicatorVariant[] {\n return ['dot', 'badge', 'text', 'icon'];\n}\n\n/**\n * Get all indicator positions\n */\nexport function getAllPositions(): IndicatorPosition[] {\n return ['inline', 'absolute-top-right', 'absolute-top-left'];\n}\n\n/**\n * Create a document change tracker\n * Simple utility for external change tracking\n */\nexport function createChangeTracker() {\n let changeCount = 0;\n let lastSaveTime: Date | null = null;\n let hasUnsavedChanges = false;\n\n return {\n markChanged: () => {\n changeCount++;\n hasUnsavedChanges = true;\n },\n markSaved: () => {\n hasUnsavedChanges = false;\n lastSaveTime = new Date();\n },\n getState: () => ({\n changeCount,\n lastSaveTime,\n hasUnsavedChanges,\n }),\n reset: () => {\n changeCount = 0;\n lastSaveTime = null;\n hasUnsavedChanges = false;\n },\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default UnsavedIndicator;\n","/**\n * Loading Indicator Component\n *\n * Displays loading states for operations with configurable appearance.\n * Features:\n * - Multiple spinner styles (spinner, dots, bar, pulse)\n * - Overlay mode for blocking UI during operations\n * - Inline mode for subtle loading indication\n * - Progress bar variant\n * - Hook for managing loading states\n */\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Loading indicator variant\n */\nexport type LoadingVariant = 'spinner' | 'dots' | 'bar' | 'pulse' | 'progress';\n\n/**\n * Loading indicator size\n */\nexport type LoadingSize = 'small' | 'medium' | 'large';\n\n/**\n * Loading indicator props\n */\nexport interface LoadingIndicatorProps {\n /** Whether loading is active */\n isLoading: boolean;\n /** Variant of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the indicator */\n size?: LoadingSize;\n /** Loading message to display */\n message?: string;\n /** Whether to show as full-screen overlay */\n overlay?: boolean;\n /** Overlay background opacity (0-1) */\n overlayOpacity?: number;\n /** Progress percentage (0-100) for progress variant */\n progress?: number;\n /** Show progress percentage text */\n showProgressText?: boolean;\n /** Custom color */\n color?: string;\n /** Additional className */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Options for useLoading hook\n */\nexport interface UseLoadingOptions {\n /** Initial loading state */\n initialLoading?: boolean;\n /** Minimum loading duration in ms (prevents flash) */\n minDuration?: number;\n /** Callback when loading starts */\n onStart?: () => void;\n /** Callback when loading ends */\n onEnd?: () => void;\n}\n\n/**\n * Return value of useLoading hook\n */\nexport interface UseLoadingReturn {\n /** Current loading state */\n isLoading: boolean;\n /** Current message */\n message: string | null;\n /** Current progress (0-100) */\n progress: number;\n /** Start loading with optional message */\n startLoading: (message?: string) => void;\n /** Stop loading */\n stopLoading: () => void;\n /** Update progress (0-100) */\n setProgress: (progress: number) => void;\n /** Update message */\n setMessage: (message: string | null) => void;\n /** Wrap an async operation with loading state */\n withLoading: <T>(operation: () => Promise<T>, message?: string) => Promise<T>;\n}\n\n/**\n * Loading operation state\n */\nexport interface LoadingOperation {\n id: string;\n message?: string;\n progress?: number;\n startTime: number;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst SIZE_CONFIG: Record<LoadingSize, { size: number; strokeWidth: number; fontSize: number }> = {\n small: { size: 16, strokeWidth: 2, fontSize: 11 },\n medium: { size: 32, strokeWidth: 3, fontSize: 13 },\n large: { size: 48, strokeWidth: 4, fontSize: 14 },\n};\n\nconst DEFAULT_COLOR = 'var(--doc-primary)';\nconst MIN_LOADING_DURATION = 300; // Minimum ms to show loading to prevent flash\n\n// ============================================================================\n// KEYFRAMES STYLES\n// ============================================================================\n\nconst spinnerKeyframes = `\n@keyframes docx-loading-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes docx-loading-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(0.95); }\n}\n\n@keyframes docx-loading-dots {\n 0%, 80%, 100% { transform: scale(0); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n}\n\n@keyframes docx-loading-bar {\n 0% { left: -35%; right: 100%; }\n 60% { left: 100%; right: -90%; }\n 100% { left: 100%; right: -90%; }\n}\n`;\n\n// ============================================================================\n// SPINNER VARIANTS\n// ============================================================================\n\nconst SpinnerVariant: React.FC<{ size: number; strokeWidth: number; color: string }> = ({\n size,\n strokeWidth,\n color,\n}) => {\n const radius = (size - strokeWidth) / 2;\n const circumference = radius * 2 * Math.PI;\n\n return (\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n style={{\n animation: 'docx-loading-spin 1s linear infinite',\n }}\n >\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.75} ${circumference}`}\n opacity={0.25}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.25} ${circumference}`}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n );\n};\n\nconst DotsVariant: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n const dotSize = size / 4;\n const gap = dotSize / 2;\n\n return (\n <div style={{ display: 'flex', gap: `${gap}px` }}>\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: '50%',\n backgroundColor: color,\n animation: `docx-loading-dots 1.4s ease-in-out ${index * 0.16}s infinite both`,\n }}\n />\n ))}\n </div>\n );\n};\n\nconst BarVariant: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n return (\n <div\n style={{\n width: size * 3,\n height: size / 4,\n backgroundColor: `${color}20`,\n borderRadius: size / 8,\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: color,\n borderRadius: size / 8,\n animation: 'docx-loading-bar 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite',\n }}\n />\n </div>\n );\n};\n\nconst PulseVariant: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: color,\n animation: 'docx-loading-pulse 1.5s ease-in-out infinite',\n }}\n />\n );\n};\n\nconst ProgressVariant: React.FC<{\n size: number;\n color: string;\n progress: number;\n showText: boolean;\n fontSize: number;\n}> = ({ size, color, progress, showText, fontSize }) => {\n const clampedProgress = Math.max(0, Math.min(100, progress));\n\n return (\n <div\n style={{\n width: size * 3,\n height: size / 4,\n backgroundColor: `${color}20`,\n borderRadius: size / 8,\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: `${clampedProgress}%`,\n backgroundColor: color,\n borderRadius: size / 8,\n transition: 'width 0.3s ease',\n }}\n />\n {showText && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize,\n fontWeight: 500,\n color: clampedProgress > 50 ? '#fff' : color,\n }}\n >\n {Math.round(clampedProgress)}%\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// LOADING INDICATOR COMPONENT\n// ============================================================================\n\nexport const LoadingIndicator: React.FC<LoadingIndicatorProps> = ({\n isLoading,\n variant = 'spinner',\n size = 'medium',\n message,\n overlay = false,\n overlayOpacity = 0.5,\n progress = 0,\n showProgressText = true,\n color = DEFAULT_COLOR,\n className = '',\n style,\n}) => {\n const sizeConfig = SIZE_CONFIG[size];\n\n // Inject keyframes\n useEffect(() => {\n const styleId = 'docx-loading-keyframes';\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = spinnerKeyframes;\n document.head.appendChild(styleElement);\n }\n }, []);\n\n if (!isLoading) return null;\n\n const renderVariant = () => {\n switch (variant) {\n case 'spinner':\n return (\n <SpinnerVariant\n size={sizeConfig.size}\n strokeWidth={sizeConfig.strokeWidth}\n color={color}\n />\n );\n case 'dots':\n return <DotsVariant size={sizeConfig.size} color={color} />;\n case 'bar':\n return <BarVariant size={sizeConfig.size} color={color} />;\n case 'pulse':\n return <PulseVariant size={sizeConfig.size} color={color} />;\n case 'progress':\n return (\n <ProgressVariant\n size={sizeConfig.size}\n color={color}\n progress={progress}\n showText={showProgressText}\n fontSize={sizeConfig.fontSize}\n />\n );\n default:\n return null;\n }\n };\n\n const content = (\n <div\n className={`docx-loading-content ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n ...style,\n }}\n >\n {renderVariant()}\n {message && (\n <div\n style={{\n fontSize: sizeConfig.fontSize,\n color: overlay ? 'white' : 'var(--doc-text-muted)',\n textAlign: 'center',\n }}\n >\n {message}\n </div>\n )}\n </div>\n );\n\n if (overlay) {\n return (\n <div\n className={`docx-loading-overlay ${className}`}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: `rgba(0, 0, 0, ${overlayOpacity})`,\n zIndex: 10000,\n ...style,\n }}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={variant === 'progress' ? progress : undefined}\n aria-busy=\"true\"\n aria-label={message || 'Loading'}\n >\n {content}\n </div>\n );\n }\n\n return (\n <div\n className={`docx-loading-inline ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={variant === 'progress' ? progress : undefined}\n aria-busy=\"true\"\n aria-label={message || 'Loading'}\n >\n {content}\n </div>\n );\n};\n\n// ============================================================================\n// USE LOADING HOOK\n// ============================================================================\n\n/**\n * Hook to manage loading states\n */\nexport function useLoading(options: UseLoadingOptions = {}): UseLoadingReturn {\n const { initialLoading = false, minDuration = MIN_LOADING_DURATION, onStart, onEnd } = options;\n\n const [isLoading, setIsLoading] = useState(initialLoading);\n const [message, setMessage] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n\n const startTimeRef = useRef<number | null>(null);\n const minDurationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Start loading\n */\n const startLoading = useCallback(\n (msg?: string) => {\n startTimeRef.current = Date.now();\n setIsLoading(true);\n setMessage(msg || null);\n setProgress(0);\n onStart?.();\n },\n [onStart]\n );\n\n /**\n * Stop loading (respects minimum duration)\n */\n const stopLoading = useCallback(() => {\n const startTime = startTimeRef.current;\n const now = Date.now();\n const elapsed = startTime ? now - startTime : 0;\n const remaining = Math.max(0, minDuration - elapsed);\n\n if (remaining > 0) {\n minDurationTimeoutRef.current = setTimeout(() => {\n setIsLoading(false);\n setMessage(null);\n setProgress(0);\n startTimeRef.current = null;\n onEnd?.();\n }, remaining);\n } else {\n setIsLoading(false);\n setMessage(null);\n setProgress(0);\n startTimeRef.current = null;\n onEnd?.();\n }\n }, [minDuration, onEnd]);\n\n /**\n * Wrap an async operation with loading state\n */\n const withLoading = useCallback(\n async <T,>(operation: () => Promise<T>, msg?: string): Promise<T> => {\n startLoading(msg);\n try {\n const result = await operation();\n stopLoading();\n return result;\n } catch (error) {\n stopLoading();\n throw error;\n }\n },\n [startLoading, stopLoading]\n );\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (minDurationTimeoutRef.current) {\n clearTimeout(minDurationTimeoutRef.current);\n }\n };\n }, []);\n\n return {\n isLoading,\n message,\n progress,\n startLoading,\n stopLoading,\n setProgress,\n setMessage,\n withLoading,\n };\n}\n\n// ============================================================================\n// MULTIPLE LOADING OPERATIONS HOOK\n// ============================================================================\n\n/**\n * Hook to manage multiple concurrent loading operations\n */\nexport function useLoadingOperations() {\n const [operations, setOperations] = useState<Map<string, LoadingOperation>>(new Map());\n\n const startOperation = useCallback((id: string, message?: string) => {\n setOperations((prev) => {\n const next = new Map(prev);\n next.set(id, {\n id,\n message,\n startTime: Date.now(),\n });\n return next;\n });\n }, []);\n\n const updateOperation = useCallback((id: string, updates: Partial<LoadingOperation>) => {\n setOperations((prev) => {\n const existing = prev.get(id);\n if (!existing) return prev;\n const next = new Map(prev);\n next.set(id, { ...existing, ...updates });\n return next;\n });\n }, []);\n\n const endOperation = useCallback((id: string) => {\n setOperations((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const isAnyLoading = operations.size > 0;\n const activeOperations = Array.from(operations.values());\n\n return {\n operations: activeOperations,\n isAnyLoading,\n startOperation,\n updateOperation,\n endOperation,\n getOperation: (id: string) => operations.get(id),\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get loading variant label\n */\nexport function getLoadingVariantLabel(variant: LoadingVariant): string {\n const labels: Record<LoadingVariant, string> = {\n spinner: 'Spinner',\n dots: 'Dots',\n bar: 'Bar',\n pulse: 'Pulse',\n progress: 'Progress',\n };\n return labels[variant];\n}\n\n/**\n * Get all loading variants\n */\nexport function getAllLoadingVariants(): LoadingVariant[] {\n return ['spinner', 'dots', 'bar', 'pulse', 'progress'];\n}\n\n/**\n * Get all loading sizes\n */\nexport function getAllLoadingSizes(): LoadingSize[] {\n return ['small', 'medium', 'large'];\n}\n\n/**\n * Create a delay promise for testing loading states\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default LoadingIndicator;\n","/**\n * Responsive Toolbar Component\n *\n * A responsive toolbar wrapper that collapses items into an overflow menu\n * when the screen is narrow.\n *\n * Features:\n * - Automatically measures available space\n * - Moves items to overflow menu when they don't fit\n * - Priority-based item ordering\n * - Configurable breakpoints\n * - ResizeObserver for dynamic resizing\n */\n\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Priority level for toolbar items\n * Lower numbers = higher priority (shown first, hidden last)\n */\nexport type ToolbarItemPriority = 1 | 2 | 3 | 4 | 5;\n\n/**\n * Toolbar item configuration\n */\nexport interface ToolbarItem {\n /** Unique identifier */\n id: string;\n /** The content to render */\n content: ReactNode;\n /** Priority level (1 = highest, 5 = lowest) */\n priority?: ToolbarItemPriority;\n /** Minimum width in pixels (for measuring) */\n minWidth?: number;\n /** Whether this item should never be hidden */\n alwaysVisible?: boolean;\n /** Whether to show separator after this item */\n separatorAfter?: boolean;\n /** Group name for keeping items together */\n group?: string;\n}\n\n/**\n * Props for ResponsiveToolbar component\n */\nexport interface ResponsiveToolbarProps {\n /** Toolbar items */\n items: ToolbarItem[];\n /** Additional items for overflow menu only */\n overflowItems?: ToolbarItem[];\n /** Whether to show overflow button even when all items fit */\n alwaysShowOverflow?: boolean;\n /** Custom overflow button renderer */\n renderOverflowButton?: (itemCount: number, isOpen: boolean, onClick: () => void) => ReactNode;\n /** Custom overflow menu renderer */\n renderOverflowMenu?: (items: ToolbarItem[], onClose: () => void) => ReactNode;\n /** Gap between items in pixels */\n itemGap?: number;\n /** Padding for the toolbar */\n padding?: number | string;\n /** Minimum width for overflow button */\n overflowButtonWidth?: number;\n /** Additional className */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n /** Height of the toolbar */\n height?: number | string;\n /** Background color */\n backgroundColor?: string;\n /** Border styles */\n borderBottom?: string;\n}\n\n/**\n * Options for useResponsiveToolbar hook\n */\nexport interface UseResponsiveToolbarOptions {\n /** Container ref */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Total items */\n items: ToolbarItem[];\n /** Gap between items */\n itemGap?: number;\n /** Width reserved for overflow button */\n overflowButtonWidth?: number;\n}\n\n/**\n * Return value of useResponsiveToolbar hook\n */\nexport interface UseResponsiveToolbarReturn {\n /** Items that fit in visible area */\n visibleItems: ToolbarItem[];\n /** Items in overflow menu */\n overflowItems: ToolbarItem[];\n /** Whether overflow menu is needed */\n hasOverflow: boolean;\n /** Force a recalculation */\n recalculate: () => void;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_ITEM_GAP = 4;\nconst DEFAULT_OVERFLOW_BUTTON_WIDTH = 36;\nconst DEFAULT_ITEM_MIN_WIDTH = 32;\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst MoreIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n);\n\n// ============================================================================\n// USE RESPONSIVE TOOLBAR HOOK\n// ============================================================================\n\n/**\n * Hook to calculate which items fit in the toolbar\n */\nexport function useResponsiveToolbar(\n options: UseResponsiveToolbarOptions\n): UseResponsiveToolbarReturn {\n const {\n containerRef,\n items,\n itemGap = DEFAULT_ITEM_GAP,\n overflowButtonWidth = DEFAULT_OVERFLOW_BUTTON_WIDTH,\n } = options;\n\n const [visibleCount, setVisibleCount] = useState(items.length);\n const itemWidthsRef = useRef<Map<string, number>>(new Map());\n\n /**\n * Calculate which items fit\n */\n const calculateVisibleItems = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n setVisibleCount(items.length);\n return;\n }\n\n const containerWidth = container.offsetWidth;\n if (containerWidth === 0) {\n return;\n }\n\n // Sort items by priority (always visible first, then by priority number)\n const sortedItems = [...items].sort((a, b) => {\n if (a.alwaysVisible && !b.alwaysVisible) return -1;\n if (!a.alwaysVisible && b.alwaysVisible) return 1;\n return (a.priority || 3) - (b.priority || 3);\n });\n\n // Calculate how many items fit\n let usedWidth = 0;\n let count = 0;\n\n for (const item of sortedItems) {\n const itemWidth =\n item.minWidth || itemWidthsRef.current.get(item.id) || DEFAULT_ITEM_MIN_WIDTH;\n const widthWithGap = itemWidth + (count > 0 ? itemGap : 0);\n\n // Reserve space for overflow button if not all items will fit\n const reservedWidth = count < items.length - 1 ? overflowButtonWidth + itemGap : 0;\n\n if (usedWidth + widthWithGap + reservedWidth <= containerWidth) {\n usedWidth += widthWithGap;\n count++;\n } else if (item.alwaysVisible) {\n // Force include always visible items\n usedWidth += widthWithGap;\n count++;\n } else {\n break;\n }\n }\n\n setVisibleCount(Math.max(0, count));\n }, [containerRef, items, itemGap, overflowButtonWidth]);\n\n /**\n * Set up ResizeObserver\n */\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // Initial calculation\n calculateVisibleItems();\n\n // Set up observer\n const resizeObserver = new ResizeObserver(() => {\n calculateVisibleItems();\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [containerRef, calculateVisibleItems]);\n\n // Recalculate when items change\n useEffect(() => {\n calculateVisibleItems();\n }, [items, calculateVisibleItems]);\n\n // Split items into visible and overflow\n const { visibleItems, overflowItems } = useMemo(() => {\n // Sort by priority for display\n const sortedItems = [...items].sort((a, b) => {\n if (a.alwaysVisible && !b.alwaysVisible) return -1;\n if (!a.alwaysVisible && b.alwaysVisible) return 1;\n return (a.priority || 3) - (b.priority || 3);\n });\n\n return {\n visibleItems: sortedItems.slice(0, visibleCount),\n overflowItems: sortedItems.slice(visibleCount),\n };\n }, [items, visibleCount]);\n\n return {\n visibleItems,\n overflowItems,\n hasOverflow: overflowItems.length > 0,\n recalculate: calculateVisibleItems,\n };\n}\n\n// ============================================================================\n// OVERFLOW MENU COMPONENT\n// ============================================================================\n\ninterface OverflowMenuProps {\n items: ToolbarItem[];\n isOpen: boolean;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\nconst OverflowMenu: React.FC<OverflowMenuProps> = ({ items, isOpen, onClose, anchorRef }) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n menuRef.current &&\n !menuRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose, anchorRef]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen || items.length === 0) return null;\n\n return (\n <div\n ref={menuRef}\n className=\"docx-responsive-toolbar-overflow-menu\"\n style={{\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: '4px',\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n padding: '8px',\n zIndex: 1000,\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n maxWidth: '300px',\n }}\n role=\"menu\"\n >\n {items.map((item) => (\n <div key={item.id} className=\"docx-responsive-toolbar-overflow-item\" role=\"menuitem\">\n {item.content}\n </div>\n ))}\n </div>\n );\n};\n\n// ============================================================================\n// RESPONSIVE TOOLBAR COMPONENT\n// ============================================================================\n\nexport const ResponsiveToolbar: React.FC<ResponsiveToolbarProps> = ({\n items,\n overflowItems: additionalOverflowItems = [],\n alwaysShowOverflow = false,\n renderOverflowButton,\n renderOverflowMenu,\n itemGap = DEFAULT_ITEM_GAP,\n padding = '8px 12px',\n overflowButtonWidth = DEFAULT_OVERFLOW_BUTTON_WIDTH,\n className = '',\n style,\n height = 44,\n backgroundColor = 'var(--doc-toolbar-bg)',\n borderBottom = '1px solid var(--doc-border)',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const overflowButtonRef = useRef<HTMLButtonElement>(null);\n const [isOverflowOpen, setIsOverflowOpen] = useState(false);\n\n const { visibleItems, overflowItems, hasOverflow } = useResponsiveToolbar({\n containerRef,\n items,\n itemGap,\n overflowButtonWidth,\n });\n\n // Combine overflow items with additional items\n const allOverflowItems = [...overflowItems, ...additionalOverflowItems];\n const showOverflow = hasOverflow || alwaysShowOverflow || additionalOverflowItems.length > 0;\n\n const toggleOverflow = useCallback(() => {\n setIsOverflowOpen((prev) => !prev);\n }, []);\n\n const closeOverflow = useCallback(() => {\n setIsOverflowOpen(false);\n }, []);\n\n // Default overflow button\n const defaultOverflowButton = (\n <button\n ref={overflowButtonRef}\n type=\"button\"\n className=\"docx-responsive-toolbar-overflow-button\"\n onClick={toggleOverflow}\n aria-label={`Show ${allOverflowItems.length} more options`}\n aria-expanded={isOverflowOpen}\n aria-haspopup=\"menu\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: `${overflowButtonWidth}px`,\n height: '32px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: isOverflowOpen ? 'var(--doc-primary-light)' : 'transparent',\n color: 'var(--doc-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease',\n }}\n >\n <MoreIcon />\n </button>\n );\n\n return (\n <div\n ref={containerRef}\n className={`docx-responsive-toolbar ${className}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${itemGap}px`,\n height: typeof height === 'number' ? `${height}px` : height,\n padding,\n backgroundColor,\n borderBottom,\n position: 'relative',\n ...style,\n }}\n >\n {/* Visible items */}\n {visibleItems.map((item) => (\n <React.Fragment key={item.id}>\n <div\n className=\"docx-responsive-toolbar-item\"\n data-item-id={item.id}\n style={{ flexShrink: 0 }}\n >\n {item.content}\n </div>\n {item.separatorAfter && (\n <div\n className=\"docx-responsive-toolbar-separator\"\n style={{\n width: '1px',\n height: '24px',\n backgroundColor: 'var(--doc-border)',\n margin: '0 4px',\n }}\n />\n )}\n </React.Fragment>\n ))}\n\n {/* Spacer to push overflow button to the right */}\n {showOverflow && <div style={{ flex: 1, minWidth: 0 }} />}\n\n {/* Overflow button */}\n {showOverflow && (\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {renderOverflowButton\n ? renderOverflowButton(allOverflowItems.length, isOverflowOpen, toggleOverflow)\n : defaultOverflowButton}\n\n {/* Overflow menu */}\n {renderOverflowMenu ? (\n isOverflowOpen && renderOverflowMenu(allOverflowItems, closeOverflow)\n ) : (\n <OverflowMenu\n items={allOverflowItems}\n isOpen={isOverflowOpen}\n onClose={closeOverflow}\n anchorRef={overflowButtonRef}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// TOOLBAR GROUP COMPONENT\n// ============================================================================\n\nexport interface ToolbarGroupProps {\n /** Group items */\n children: ReactNode;\n /** Gap between items */\n gap?: number;\n /** Whether to show separator after group */\n separatorAfter?: boolean;\n /** Additional className */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n}\n\nexport const ToolbarGroup: React.FC<ToolbarGroupProps> = ({\n children,\n gap = 2,\n separatorAfter = false,\n className = '',\n style,\n}) => {\n return (\n <>\n <div\n className={`docx-toolbar-group ${className}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${gap}px`,\n ...style,\n }}\n >\n {children}\n </div>\n {separatorAfter && (\n <div\n className=\"docx-toolbar-group-separator\"\n style={{\n width: '1px',\n height: '24px',\n backgroundColor: 'var(--doc-border)',\n margin: '0 4px',\n }}\n />\n )}\n </>\n );\n};\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Create a toolbar item\n */\nexport function createToolbarItem(\n id: string,\n content: ReactNode,\n options?: Partial<Omit<ToolbarItem, 'id' | 'content'>>\n): ToolbarItem {\n return {\n id,\n content,\n priority: 3,\n ...options,\n };\n}\n\n/**\n * Create toolbar items from an array of configs\n */\nexport function createToolbarItems(\n configs: Array<{\n id: string;\n content: ReactNode;\n priority?: ToolbarItemPriority;\n minWidth?: number;\n alwaysVisible?: boolean;\n separatorAfter?: boolean;\n group?: string;\n }>\n): ToolbarItem[] {\n return configs.map((config) => ({\n ...config,\n priority: config.priority || 3,\n }));\n}\n\n/**\n * Get recommended priority for common toolbar items\n */\nexport function getRecommendedPriority(itemType: string): ToolbarItemPriority {\n const priorities: Record<string, ToolbarItemPriority> = {\n undo: 1,\n redo: 1,\n bold: 1,\n italic: 1,\n underline: 2,\n fontFamily: 2,\n fontSize: 2,\n textColor: 3,\n highlightColor: 3,\n alignment: 3,\n lists: 4,\n indent: 4,\n lineSpacing: 5,\n styles: 5,\n };\n return priorities[itemType] || 3;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ResponsiveToolbar;\n","/**\n * Insert Table Dialog Component\n *\n * Modal dialog for inserting a new table into the document.\n * Provides a visual grid selector for choosing rows and columns.\n *\n * Features:\n * - Visual grid selector (hover to select dimensions)\n * - Manual row/column input\n * - Preview of table dimensions\n * - Quick insert with default sizes\n */\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Table configuration for insertion\n */\nexport interface TableConfig {\n /** Number of rows */\n rows: number;\n /** Number of columns */\n columns: number;\n}\n\n/**\n * Props for InsertTableDialog\n */\nexport interface InsertTableDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when table is inserted */\n onInsert: (config: TableConfig) => void;\n /** Maximum rows in grid selector (default: 8) */\n maxGridRows?: number;\n /** Maximum columns in grid selector (default: 10) */\n maxGridColumns?: number;\n /** Maximum allowed rows (default: 100) */\n maxRows?: number;\n /** Maximum allowed columns (default: 20) */\n maxColumns?: number;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst DIALOG_OVERLAY_STYLE: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n};\n\nconst DIALOG_CONTENT_STYLE: CSSProperties = {\n backgroundColor: 'white',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n minWidth: '320px',\n maxWidth: '400px',\n width: '100%',\n margin: '20px',\n};\n\nconst DIALOG_HEADER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px 20px',\n borderBottom: '1px solid var(--doc-border)',\n};\n\nconst DIALOG_TITLE_STYLE: CSSProperties = {\n margin: 0,\n fontSize: '18px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n};\n\nconst CLOSE_BUTTON_STYLE: CSSProperties = {\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: 'var(--doc-text-muted)',\n padding: '4px 8px',\n lineHeight: 1,\n};\n\nconst DIALOG_BODY_STYLE: CSSProperties = {\n padding: '20px',\n};\n\nconst GRID_CONTAINER_STYLE: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: '16px',\n};\n\nconst GRID_STYLE: CSSProperties = {\n display: 'grid',\n gap: '2px',\n padding: '4px',\n backgroundColor: 'var(--doc-bg-hover)',\n borderRadius: '4px',\n cursor: 'pointer',\n};\n\nconst GRID_CELL_STYLE: CSSProperties = {\n width: '24px',\n height: '24px',\n backgroundColor: 'white',\n border: '1px solid var(--doc-border-dark)',\n borderRadius: '2px',\n transition: 'background-color 0.1s, border-color 0.1s',\n};\n\nconst GRID_CELL_SELECTED_STYLE: CSSProperties = {\n ...GRID_CELL_STYLE,\n backgroundColor: 'var(--doc-primary)',\n borderColor: 'var(--doc-primary)',\n};\n\nconst GRID_LABEL_STYLE: CSSProperties = {\n marginTop: '8px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--doc-text)',\n};\n\nconst SEPARATOR_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n margin: '16px 0',\n color: 'var(--doc-text-muted)',\n fontSize: '12px',\n};\n\nconst SEPARATOR_LINE_STYLE: CSSProperties = {\n flex: 1,\n height: '1px',\n backgroundColor: 'var(--doc-border)',\n};\n\nconst INPUT_ROW_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '12px',\n};\n\nconst LABEL_STYLE: CSSProperties = {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--doc-text)',\n minWidth: '80px',\n};\n\nconst INPUT_STYLE: CSSProperties = {\n width: '80px',\n padding: '8px 12px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n fontSize: '14px',\n textAlign: 'center',\n};\n\nconst DIALOG_FOOTER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 20px',\n borderTop: '1px solid var(--doc-border)',\n};\n\nconst BUTTON_BASE_STYLE: CSSProperties = {\n padding: '10px 20px',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n};\n\nconst PRIMARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-primary)',\n color: 'white',\n};\n\nconst SECONDARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-bg-hover)',\n color: 'var(--doc-text)',\n border: '1px solid var(--doc-border-input)',\n};\n\nconst DISABLED_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-border-input)',\n color: 'var(--doc-text-muted)',\n cursor: 'not-allowed',\n};\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\n/**\n * Table Icon\n */\nfunction TableIcon(): React.ReactElement {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n x=\"2\"\n y=\"2\"\n width=\"16\"\n height=\"16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n rx=\"1\"\n />\n <line x1=\"2\" y1=\"7\" x2=\"18\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"2\" y1=\"12\" x2=\"18\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * InsertTableDialog - Modal for inserting tables with visual grid selector\n */\nexport function InsertTableDialog({\n isOpen,\n onClose,\n onInsert,\n maxGridRows = 8,\n maxGridColumns = 10,\n maxRows = 100,\n maxColumns = 20,\n className,\n style,\n}: InsertTableDialogProps): React.ReactElement | null {\n // State for grid hover selection\n const [hoverRows, setHoverRows] = useState(0);\n const [hoverCols, setHoverCols] = useState(0);\n\n // State for manual input\n const [inputRows, setInputRows] = useState(3);\n const [inputCols, setInputCols] = useState(3);\n\n // Refs\n const dialogRef = useRef<HTMLDivElement>(null);\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setHoverRows(0);\n setHoverCols(0);\n setInputRows(3);\n setInputCols(3);\n }\n }, [isOpen]);\n\n // Focus trap\n useEffect(() => {\n if (isOpen) {\n dialogRef.current?.focus();\n }\n }, [isOpen]);\n\n /**\n * Handle grid cell hover\n */\n const handleCellHover = useCallback((row: number, col: number) => {\n setHoverRows(row);\n setHoverCols(col);\n }, []);\n\n /**\n * Handle grid cell click - insert table with selected dimensions\n */\n const handleCellClick = useCallback(() => {\n if (hoverRows > 0 && hoverCols > 0) {\n onInsert({ rows: hoverRows, columns: hoverCols });\n }\n }, [hoverRows, hoverCols, onInsert]);\n\n /**\n * Handle manual input insert\n */\n const handleManualInsert = useCallback(() => {\n const rows = Math.min(Math.max(1, inputRows), maxRows);\n const cols = Math.min(Math.max(1, inputCols), maxColumns);\n onInsert({ rows, columns: cols });\n }, [inputRows, inputCols, maxRows, maxColumns, onInsert]);\n\n /**\n * Handle keyboard events\n */\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n } else if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleManualInsert();\n }\n },\n [onClose, handleManualInsert]\n );\n\n /**\n * Handle overlay click (close dialog)\n */\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n /**\n * Handle row input change\n */\n const handleRowsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10);\n if (!isNaN(value)) {\n setInputRows(Math.min(Math.max(1, value), maxRows));\n } else if (e.target.value === '') {\n setInputRows(1);\n }\n },\n [maxRows]\n );\n\n /**\n * Handle column input change\n */\n const handleColsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10);\n if (!isNaN(value)) {\n setInputCols(Math.min(Math.max(1, value), maxColumns));\n } else if (e.target.value === '') {\n setInputCols(1);\n }\n },\n [maxColumns]\n );\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n // Generate grid cells\n const gridCells: React.ReactElement[] = [];\n for (let row = 1; row <= maxGridRows; row++) {\n for (let col = 1; col <= maxGridColumns; col++) {\n const isSelected = row <= hoverRows && col <= hoverCols;\n gridCells.push(\n <div\n key={`${row}-${col}`}\n style={isSelected ? GRID_CELL_SELECTED_STYLE : GRID_CELL_STYLE}\n onMouseEnter={() => handleCellHover(row, col)}\n onClick={handleCellClick}\n role=\"gridcell\"\n aria-selected={isSelected}\n />\n );\n }\n }\n\n const canInsert = inputRows >= 1 && inputCols >= 1;\n const gridLabel =\n hoverRows > 0 && hoverCols > 0 ? `${hoverCols} x ${hoverRows} Table` : 'Hover to select size';\n\n return (\n <div\n className={`docx-insert-table-dialog-overlay ${className || ''}`}\n style={{ ...DIALOG_OVERLAY_STYLE, ...style }}\n onClick={handleOverlayClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"insert-table-dialog-title\"\n >\n <div\n ref={dialogRef}\n className=\"docx-insert-table-dialog\"\n style={DIALOG_CONTENT_STYLE}\n tabIndex={-1}\n >\n {/* Header */}\n <div className=\"docx-insert-table-dialog-header\" style={DIALOG_HEADER_STYLE}>\n <h2 id=\"insert-table-dialog-title\" style={DIALOG_TITLE_STYLE}>\n <span style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <TableIcon />\n Insert Table\n </span>\n </h2>\n <button\n type=\"button\"\n className=\"docx-insert-table-dialog-close\"\n style={CLOSE_BUTTON_STYLE}\n onClick={onClose}\n aria-label=\"Close dialog\"\n >\n &times;\n </button>\n </div>\n\n {/* Body */}\n <div className=\"docx-insert-table-dialog-body\" style={DIALOG_BODY_STYLE}>\n {/* Grid selector */}\n <div className=\"docx-insert-table-grid-container\" style={GRID_CONTAINER_STYLE}>\n <div\n className=\"docx-insert-table-grid\"\n style={{\n ...GRID_STYLE,\n gridTemplateColumns: `repeat(${maxGridColumns}, 1fr)`,\n }}\n onMouseLeave={() => {\n setHoverRows(0);\n setHoverCols(0);\n }}\n role=\"grid\"\n aria-label=\"Table size selector\"\n >\n {gridCells}\n </div>\n <div className=\"docx-insert-table-grid-label\" style={GRID_LABEL_STYLE}>\n {gridLabel}\n </div>\n </div>\n\n {/* Separator */}\n <div className=\"docx-insert-table-separator\" style={SEPARATOR_STYLE}>\n <div style={SEPARATOR_LINE_STYLE} />\n <span>or specify size</span>\n <div style={SEPARATOR_LINE_STYLE} />\n </div>\n\n {/* Manual input */}\n <div className=\"docx-insert-table-inputs\">\n <div style={INPUT_ROW_STYLE}>\n <label htmlFor=\"insert-table-rows\" style={LABEL_STYLE}>\n Rows:\n </label>\n <input\n id=\"insert-table-rows\"\n type=\"number\"\n min={1}\n max={maxRows}\n value={inputRows}\n onChange={handleRowsChange}\n style={INPUT_STYLE}\n />\n </div>\n <div style={INPUT_ROW_STYLE}>\n <label htmlFor=\"insert-table-cols\" style={LABEL_STYLE}>\n Columns:\n </label>\n <input\n id=\"insert-table-cols\"\n type=\"number\"\n min={1}\n max={maxColumns}\n value={inputCols}\n onChange={handleColsChange}\n style={INPUT_STYLE}\n />\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"docx-insert-table-dialog-footer\" style={DIALOG_FOOTER_STYLE}>\n <button\n type=\"button\"\n className=\"docx-insert-table-dialog-cancel\"\n style={SECONDARY_BUTTON_STYLE}\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"docx-insert-table-dialog-insert\"\n style={canInsert ? PRIMARY_BUTTON_STYLE : DISABLED_BUTTON_STYLE}\n onClick={handleManualInsert}\n disabled={!canInsert}\n >\n Insert Table\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Hook for managing Insert Table dialog state\n */\nexport function useInsertTableDialog(): {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n} {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return { isOpen, open, close, toggle };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Create a default TableConfig\n */\nexport function createDefaultTableConfig(rows = 3, columns = 3): TableConfig {\n return { rows, columns };\n}\n\n/**\n * Validate TableConfig\n */\nexport function isValidTableConfig(config: TableConfig, maxRows = 100, maxColumns = 20): boolean {\n return (\n config.rows >= 1 &&\n config.rows <= maxRows &&\n config.columns >= 1 &&\n config.columns <= maxColumns\n );\n}\n\n/**\n * Clamp TableConfig to valid range\n */\nexport function clampTableConfig(config: TableConfig, maxRows = 100, maxColumns = 20): TableConfig {\n return {\n rows: Math.min(Math.max(1, config.rows), maxRows),\n columns: Math.min(Math.max(1, config.columns), maxColumns),\n };\n}\n\n/**\n * Format table dimensions for display\n */\nexport function formatTableDimensions(config: TableConfig): string {\n return `${config.columns} x ${config.rows}`;\n}\n\n/**\n * Get common table presets\n */\nexport function getTablePresets(): { label: string; config: TableConfig }[] {\n return [\n { label: '2 x 2', config: { rows: 2, columns: 2 } },\n { label: '3 x 3', config: { rows: 3, columns: 3 } },\n { label: '4 x 4', config: { rows: 4, columns: 4 } },\n { label: '2 x 4', config: { rows: 2, columns: 4 } },\n { label: '4 x 2', config: { rows: 4, columns: 2 } },\n { label: '5 x 5', config: { rows: 5, columns: 5 } },\n ];\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default InsertTableDialog;\n","/**\n * Insert Image Dialog Component\n *\n * Modal dialog for inserting images into the document.\n * Supports file upload with preview and basic sizing options.\n *\n * Features:\n * - File input for image selection\n * - Drag and drop support\n * - Image preview\n * - Width/height controls with aspect ratio lock\n * - Alt text input\n */\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { CSSProperties, DragEvent, ChangeEvent } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Image data for insertion\n */\nexport interface ImageData {\n /** Base64 data URL or external URL */\n src: string;\n /** Image width in pixels */\n width: number;\n /** Image height in pixels */\n height: number;\n /** Alt text for accessibility */\n alt?: string;\n /** Original file name */\n fileName?: string;\n /** MIME type */\n mimeType?: string;\n}\n\n/**\n * Props for InsertImageDialog\n */\nexport interface InsertImageDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when image is inserted */\n onInsert: (data: ImageData) => void;\n /** Maximum width in pixels (default: 800) */\n maxWidth?: number;\n /** Maximum height in pixels (default: 600) */\n maxHeight?: number;\n /** Accepted file types (default: image/*) */\n accept?: string;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst DIALOG_OVERLAY_STYLE: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n};\n\nconst DIALOG_CONTENT_STYLE: CSSProperties = {\n backgroundColor: 'white',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n minWidth: '450px',\n maxWidth: '600px',\n width: '100%',\n margin: '20px',\n maxHeight: '90vh',\n overflow: 'auto',\n};\n\nconst DIALOG_HEADER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px 20px',\n borderBottom: '1px solid var(--doc-border)',\n};\n\nconst DIALOG_TITLE_STYLE: CSSProperties = {\n margin: 0,\n fontSize: '18px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n};\n\nconst CLOSE_BUTTON_STYLE: CSSProperties = {\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: 'var(--doc-text-muted)',\n padding: '4px 8px',\n lineHeight: 1,\n};\n\nconst DIALOG_BODY_STYLE: CSSProperties = {\n padding: '20px',\n};\n\nconst DROP_ZONE_STYLE: CSSProperties = {\n border: '2px dashed var(--doc-border-input)',\n borderRadius: '8px',\n padding: '40px 20px',\n textAlign: 'center',\n cursor: 'pointer',\n transition: 'border-color 0.2s, background-color 0.2s',\n marginBottom: '16px',\n};\n\nconst DROP_ZONE_ACTIVE_STYLE: CSSProperties = {\n ...DROP_ZONE_STYLE,\n borderColor: 'var(--doc-primary)',\n backgroundColor: 'var(--doc-primary-light)',\n};\n\nconst DROP_ZONE_WITH_IMAGE_STYLE: CSSProperties = {\n ...DROP_ZONE_STYLE,\n padding: '20px',\n borderStyle: 'solid',\n borderColor: 'var(--doc-primary)',\n};\n\nconst PREVIEW_CONTAINER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n maxHeight: '250px',\n overflow: 'hidden',\n};\n\nconst PREVIEW_IMAGE_STYLE: CSSProperties = {\n maxWidth: '100%',\n maxHeight: '250px',\n objectFit: 'contain',\n borderRadius: '4px',\n};\n\nconst DROP_ZONE_ICON_STYLE: CSSProperties = {\n fontSize: '48px',\n color: 'var(--doc-text-placeholder)',\n marginBottom: '12px',\n};\n\nconst DROP_ZONE_TEXT_STYLE: CSSProperties = {\n fontSize: '14px',\n color: 'var(--doc-text-muted)',\n marginBottom: '8px',\n};\n\nconst DROP_ZONE_SUBTEXT_STYLE: CSSProperties = {\n fontSize: '12px',\n color: 'var(--doc-text-placeholder)',\n};\n\nconst FORM_GROUP_STYLE: CSSProperties = {\n marginBottom: '16px',\n};\n\nconst LABEL_STYLE: CSSProperties = {\n display: 'block',\n marginBottom: '6px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--doc-text)',\n};\n\nconst INPUT_STYLE: CSSProperties = {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n fontSize: '14px',\n boxSizing: 'border-box',\n};\n\nconst SIZE_ROW_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n};\n\nconst SIZE_INPUT_STYLE: CSSProperties = {\n width: '100px',\n padding: '8px 12px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n fontSize: '14px',\n textAlign: 'center',\n};\n\nconst LOCK_BUTTON_STYLE: CSSProperties = {\n padding: '6px 10px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n backgroundColor: 'white',\n cursor: 'pointer',\n fontSize: '16px',\n};\n\nconst LOCK_BUTTON_ACTIVE_STYLE: CSSProperties = {\n ...LOCK_BUTTON_STYLE,\n backgroundColor: 'var(--doc-primary)',\n borderColor: 'var(--doc-primary)',\n color: 'white',\n};\n\nconst FILE_INFO_STYLE: CSSProperties = {\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n marginTop: '8px',\n textAlign: 'center',\n};\n\nconst DIALOG_FOOTER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 20px',\n borderTop: '1px solid var(--doc-border)',\n};\n\nconst BUTTON_BASE_STYLE: CSSProperties = {\n padding: '10px 20px',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n};\n\nconst PRIMARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-primary)',\n color: 'white',\n};\n\nconst SECONDARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-bg-subtle)',\n color: 'var(--doc-text)',\n border: '1px solid var(--doc-border-input)',\n};\n\nconst DISABLED_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-border-input)',\n color: 'var(--doc-text-muted)',\n cursor: 'not-allowed',\n};\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\n/**\n * Image Icon\n */\nfunction ImageIcon(): React.ReactElement {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n x=\"6\"\n y=\"10\"\n width=\"36\"\n height=\"28\"\n rx=\"2\"\n stroke=\"var(--doc-text-placeholder)\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n <circle\n cx=\"16\"\n cy=\"20\"\n r=\"4\"\n stroke=\"var(--doc-text-placeholder)\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n <path\n d=\"M6 32L16 24L26 34L36 22L42 28\"\n stroke=\"var(--doc-text-placeholder)\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * Lock Icon\n */\nfunction LockIcon({ locked }: { locked: boolean }): React.ReactElement {\n if (locked) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M12 6V4a4 4 0 0 0-8 0v2H3v8h10V6h-1zm-6-2a2 2 0 0 1 4 0v2H6V4zm6 8H4V8h8v4z\" />\n </svg>\n );\n }\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M10 6V4a2 2 0 0 0-4 0v2H4v8h8V6h-2zM6 4a2 2 0 0 1 4 0v2h-2V4H6v2H4v2H6V4zm4 8H6V8h4v4z\" />\n </svg>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * InsertImageDialog - Modal for inserting images with preview and sizing\n */\nexport function InsertImageDialog({\n isOpen,\n onClose,\n onInsert,\n maxWidth = 800,\n maxHeight = 600,\n accept = 'image/*',\n className,\n style,\n}: InsertImageDialogProps): React.ReactElement | null {\n // State\n const [imageData, setImageData] = useState<ImageData | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [width, setWidth] = useState(0);\n const [height, setHeight] = useState(0);\n const [altText, setAltText] = useState('');\n const [aspectLocked, setAspectLocked] = useState(true);\n const [originalAspectRatio, setOriginalAspectRatio] = useState(1);\n const [error, setError] = useState<string | null>(null);\n\n // Refs\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n // Reset state when dialog opens/closes\n useEffect(() => {\n if (isOpen) {\n setImageData(null);\n setIsDragging(false);\n setWidth(0);\n setHeight(0);\n setAltText('');\n setAspectLocked(true);\n setOriginalAspectRatio(1);\n setError(null);\n }\n }, [isOpen]);\n\n /**\n * Process a file and load image data\n */\n const processFile = useCallback(\n (file: File) => {\n // Validate file type\n if (!file.type.startsWith('image/')) {\n setError('Please select a valid image file');\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n setError('Image file is too large (max 10MB)');\n return;\n }\n\n setError(null);\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n\n // Load image to get dimensions\n const img = new Image();\n img.onload = () => {\n let w = img.width;\n let h = img.height;\n\n // Scale down if exceeds max dimensions\n if (w > maxWidth || h > maxHeight) {\n const scaleW = maxWidth / w;\n const scaleH = maxHeight / h;\n const scale = Math.min(scaleW, scaleH);\n w = Math.round(w * scale);\n h = Math.round(h * scale);\n }\n\n setWidth(w);\n setHeight(h);\n setOriginalAspectRatio(img.width / img.height);\n setImageData({\n src,\n width: w,\n height: h,\n fileName: file.name,\n mimeType: file.type,\n });\n };\n img.src = src;\n };\n\n reader.onerror = () => {\n setError('Failed to read image file');\n };\n\n reader.readAsDataURL(file);\n },\n [maxWidth, maxHeight]\n );\n\n /**\n * Handle file input change\n */\n const handleFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n processFile(file);\n }\n },\n [processFile]\n );\n\n /**\n * Handle drop zone click\n */\n const handleDropZoneClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n /**\n * Handle drag over\n */\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n }, []);\n\n /**\n * Handle drag leave\n */\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n /**\n * Handle drop\n */\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const file = e.dataTransfer.files?.[0];\n if (file) {\n processFile(file);\n }\n },\n [processFile]\n );\n\n /**\n * Handle width change\n */\n const handleWidthChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const newWidth = parseInt(e.target.value, 10) || 0;\n setWidth(newWidth);\n\n if (aspectLocked && originalAspectRatio) {\n setHeight(Math.round(newWidth / originalAspectRatio));\n }\n },\n [aspectLocked, originalAspectRatio]\n );\n\n /**\n * Handle height change\n */\n const handleHeightChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const newHeight = parseInt(e.target.value, 10) || 0;\n setHeight(newHeight);\n\n if (aspectLocked && originalAspectRatio) {\n setWidth(Math.round(newHeight * originalAspectRatio));\n }\n },\n [aspectLocked, originalAspectRatio]\n );\n\n /**\n * Handle insert\n */\n const handleInsert = useCallback(() => {\n if (imageData) {\n onInsert({\n ...imageData,\n width,\n height,\n alt: altText || undefined,\n });\n }\n }, [imageData, width, height, altText, onInsert]);\n\n /**\n * Handle keyboard events\n */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n } else if (e.key === 'Enter' && imageData && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, imageData, handleInsert]\n );\n\n /**\n * Handle overlay click\n */\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n /**\n * Clear current image\n */\n const handleClear = useCallback(() => {\n setImageData(null);\n setWidth(0);\n setHeight(0);\n setAltText('');\n setError(null);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }, []);\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n const canInsert = imageData !== null && width > 0 && height > 0;\n\n // Get drop zone style\n const getDropZoneStyle = (): CSSProperties => {\n if (imageData) return DROP_ZONE_WITH_IMAGE_STYLE;\n if (isDragging) return DROP_ZONE_ACTIVE_STYLE;\n return DROP_ZONE_STYLE;\n };\n\n return (\n <div\n className={`docx-insert-image-dialog-overlay ${className || ''}`}\n style={{ ...DIALOG_OVERLAY_STYLE, ...style }}\n onClick={handleOverlayClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"insert-image-dialog-title\"\n >\n <div\n ref={dialogRef}\n className=\"docx-insert-image-dialog\"\n style={DIALOG_CONTENT_STYLE}\n tabIndex={-1}\n >\n {/* Header */}\n <div className=\"docx-insert-image-dialog-header\" style={DIALOG_HEADER_STYLE}>\n <h2 id=\"insert-image-dialog-title\" style={DIALOG_TITLE_STYLE}>\n Insert Image\n </h2>\n <button\n type=\"button\"\n className=\"docx-insert-image-dialog-close\"\n style={CLOSE_BUTTON_STYLE}\n onClick={onClose}\n aria-label=\"Close dialog\"\n >\n &times;\n </button>\n </div>\n\n {/* Body */}\n <div className=\"docx-insert-image-dialog-body\" style={DIALOG_BODY_STYLE}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n\n {/* Drop zone / Preview */}\n <div\n className=\"docx-insert-image-dropzone\"\n style={getDropZoneStyle()}\n onClick={handleDropZoneClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Click or drag to upload image\"\n >\n {imageData ? (\n <div style={PREVIEW_CONTAINER_STYLE}>\n <img src={imageData.src} alt={altText || 'Preview'} style={PREVIEW_IMAGE_STYLE} />\n </div>\n ) : (\n <>\n <div style={DROP_ZONE_ICON_STYLE}>\n <ImageIcon />\n </div>\n <div style={DROP_ZONE_TEXT_STYLE}>Click to select or drag and drop an image</div>\n <div style={DROP_ZONE_SUBTEXT_STYLE}>PNG, JPG, GIF up to 10MB</div>\n </>\n )}\n </div>\n\n {/* File info */}\n {imageData?.fileName && (\n <div style={FILE_INFO_STYLE}>\n {imageData.fileName}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleClear();\n }}\n style={{\n marginLeft: '8px',\n background: 'none',\n border: 'none',\n color: 'var(--doc-primary)',\n cursor: 'pointer',\n fontSize: '12px',\n }}\n >\n Change\n </button>\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div\n style={{\n color: 'var(--doc-error)',\n fontSize: '14px',\n marginBottom: '16px',\n textAlign: 'center',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Size controls */}\n {imageData && (\n <>\n <div style={FORM_GROUP_STYLE}>\n <label style={LABEL_STYLE}>Dimensions</label>\n <div style={SIZE_ROW_STYLE}>\n <span style={{ fontSize: '14px', color: 'var(--doc-text-muted)' }}>Width:</span>\n <input\n type=\"number\"\n value={width}\n onChange={handleWidthChange}\n min={1}\n max={maxWidth}\n style={SIZE_INPUT_STYLE}\n />\n <span style={{ fontSize: '14px', color: 'var(--doc-text-muted)' }}>px</span>\n <button\n type=\"button\"\n onClick={() => setAspectLocked(!aspectLocked)}\n style={aspectLocked ? LOCK_BUTTON_ACTIVE_STYLE : LOCK_BUTTON_STYLE}\n title={aspectLocked ? 'Aspect ratio locked' : 'Aspect ratio unlocked'}\n >\n <LockIcon locked={aspectLocked} />\n </button>\n <span style={{ fontSize: '14px', color: 'var(--doc-text-muted)' }}>Height:</span>\n <input\n type=\"number\"\n value={height}\n onChange={handleHeightChange}\n min={1}\n max={maxHeight}\n style={SIZE_INPUT_STYLE}\n />\n <span style={{ fontSize: '14px', color: 'var(--doc-text-muted)' }}>px</span>\n </div>\n </div>\n\n <div style={FORM_GROUP_STYLE}>\n <label htmlFor=\"insert-image-alt\" style={LABEL_STYLE}>\n Alt Text (optional)\n </label>\n <input\n id=\"insert-image-alt\"\n type=\"text\"\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder=\"Describe the image for accessibility\"\n style={INPUT_STYLE}\n />\n </div>\n </>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"docx-insert-image-dialog-footer\" style={DIALOG_FOOTER_STYLE}>\n <button\n type=\"button\"\n className=\"docx-insert-image-dialog-cancel\"\n style={SECONDARY_BUTTON_STYLE}\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"docx-insert-image-dialog-insert\"\n style={canInsert ? PRIMARY_BUTTON_STYLE : DISABLED_BUTTON_STYLE}\n onClick={handleInsert}\n disabled={!canInsert}\n >\n Insert Image\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Hook for managing Insert Image dialog state\n */\nexport function useInsertImageDialog(): {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n} {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return { isOpen, open, close, toggle };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a file is a valid image\n */\nexport function isValidImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\n/**\n * Get supported image extensions\n */\nexport function getSupportedImageExtensions(): string[] {\n return ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg'];\n}\n\n/**\n * Get accept string for file input\n */\nexport function getImageAcceptString(): string {\n return 'image/png,image/jpeg,image/gif,image/webp,image/bmp,image/svg+xml';\n}\n\n/**\n * Calculate scaled dimensions to fit within bounds\n */\nexport function calculateFitDimensions(\n originalWidth: number,\n originalHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number } {\n if (originalWidth <= maxWidth && originalHeight <= maxHeight) {\n return { width: originalWidth, height: originalHeight };\n }\n\n const scaleX = maxWidth / originalWidth;\n const scaleY = maxHeight / originalHeight;\n const scale = Math.min(scaleX, scaleY);\n\n return {\n width: Math.round(originalWidth * scale),\n height: Math.round(originalHeight * scale),\n };\n}\n\n/**\n * Convert data URL to Blob\n */\nexport function dataUrlToBlob(dataUrl: string): Blob {\n const parts = dataUrl.split(',');\n const mime = parts[0].match(/:(.*?);/)?.[1] || 'image/png';\n const binaryString = atob(parts[1]);\n const bytes = new Uint8Array(binaryString.length);\n\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return new Blob([bytes], { type: mime });\n}\n\n/**\n * Get image dimensions from a data URL\n */\nexport function getImageDimensions(src: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve({ width: img.width, height: img.height });\n img.onerror = () => reject(new Error('Failed to load image'));\n img.src = src;\n });\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default InsertImageDialog;\n","/**\n * Insert Symbol Dialog Component\n *\n * Modal dialog for inserting special characters and symbols into the document.\n * Provides categorized symbol picker with search functionality.\n *\n * Features:\n * - Categorized symbol groups\n * - Recent symbols\n * - Search functionality\n * - Unicode character display\n */\n\nimport React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Symbol category\n */\nexport interface SymbolCategory {\n /** Category name */\n name: string;\n /** Display label */\n label: string;\n /** Symbols in this category */\n symbols: string[];\n}\n\n/**\n * Props for InsertSymbolDialog\n */\nexport interface InsertSymbolDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when symbol is inserted */\n onInsert: (symbol: string) => void;\n /** Recently used symbols */\n recentSymbols?: string[];\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst DIALOG_OVERLAY_STYLE: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n};\n\nconst DIALOG_CONTENT_STYLE: CSSProperties = {\n backgroundColor: 'white',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n minWidth: '450px',\n maxWidth: '550px',\n width: '100%',\n margin: '20px',\n maxHeight: '80vh',\n display: 'flex',\n flexDirection: 'column',\n};\n\nconst DIALOG_HEADER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px 20px',\n borderBottom: '1px solid var(--doc-border)',\n};\n\nconst DIALOG_TITLE_STYLE: CSSProperties = {\n margin: 0,\n fontSize: '18px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n};\n\nconst CLOSE_BUTTON_STYLE: CSSProperties = {\n background: 'none',\n border: 'none',\n fontSize: '20px',\n cursor: 'pointer',\n color: 'var(--doc-text-muted)',\n padding: '4px 8px',\n lineHeight: 1,\n};\n\nconst DIALOG_BODY_STYLE: CSSProperties = {\n padding: '20px',\n flex: 1,\n overflow: 'auto',\n};\n\nconst SEARCH_INPUT_STYLE: CSSProperties = {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n fontSize: '14px',\n marginBottom: '16px',\n boxSizing: 'border-box',\n};\n\nconst CATEGORY_TABS_STYLE: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n marginBottom: '16px',\n};\n\nconst CATEGORY_TAB_STYLE: CSSProperties = {\n padding: '6px 12px',\n border: '1px solid var(--doc-border-input)',\n borderRadius: '4px',\n backgroundColor: 'white',\n cursor: 'pointer',\n fontSize: '12px',\n transition: 'all 0.15s',\n};\n\nconst CATEGORY_TAB_ACTIVE_STYLE: CSSProperties = {\n ...CATEGORY_TAB_STYLE,\n backgroundColor: 'var(--doc-primary)',\n borderColor: 'var(--doc-primary)',\n color: 'white',\n};\n\nconst SYMBOLS_GRID_STYLE: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(10, 1fr)',\n gap: '4px',\n maxHeight: '250px',\n overflow: 'auto',\n};\n\nconst SYMBOL_BUTTON_STYLE: CSSProperties = {\n width: '36px',\n height: '36px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: '1px solid var(--doc-border)',\n borderRadius: '4px',\n backgroundColor: 'white',\n cursor: 'pointer',\n fontSize: '18px',\n transition: 'all 0.15s',\n};\n\nconst PREVIEW_SECTION_STYLE: CSSProperties = {\n marginTop: '16px',\n padding: '12px',\n backgroundColor: 'var(--doc-bg-subtle)',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n};\n\nconst PREVIEW_SYMBOL_STYLE: CSSProperties = {\n fontSize: '36px',\n width: '60px',\n height: '60px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'white',\n borderRadius: '4px',\n border: '1px solid var(--doc-border)',\n};\n\nconst PREVIEW_INFO_STYLE: CSSProperties = {\n flex: 1,\n};\n\nconst DIALOG_FOOTER_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '12px',\n padding: '16px 20px',\n borderTop: '1px solid var(--doc-border)',\n};\n\nconst BUTTON_BASE_STYLE: CSSProperties = {\n padding: '10px 20px',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n border: 'none',\n};\n\nconst PRIMARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-primary)',\n color: 'white',\n};\n\nconst SECONDARY_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-bg-subtle)',\n color: 'var(--doc-text)',\n border: '1px solid var(--doc-border-input)',\n};\n\nconst DISABLED_BUTTON_STYLE: CSSProperties = {\n ...BUTTON_BASE_STYLE,\n backgroundColor: 'var(--doc-border-input)',\n color: 'var(--doc-text-muted)',\n cursor: 'not-allowed',\n};\n\n// ============================================================================\n// SYMBOL DATA\n// ============================================================================\n\n/**\n * Default symbol categories\n */\nexport const SYMBOL_CATEGORIES: SymbolCategory[] = [\n {\n name: 'common',\n label: 'Common',\n symbols: [\n '©',\n '®',\n '™',\n '•',\n '…',\n '—',\n '–',\n '°',\n '±',\n '×',\n '÷',\n '≠',\n '≤',\n '≥',\n '∞',\n '√',\n '∑',\n '∏',\n '∫',\n 'π',\n '€',\n '£',\n '¥',\n '¢',\n '§',\n '¶',\n '†',\n '‡',\n '‰',\n '№',\n ],\n },\n {\n name: 'arrows',\n label: 'Arrows',\n symbols: [\n '←',\n '↑',\n '→',\n '↓',\n '↔',\n '↕',\n '↖',\n '↗',\n '↘',\n '↙',\n '⇐',\n '⇑',\n '⇒',\n '⇓',\n '⇔',\n '⇕',\n '⟵',\n '⟶',\n '⟷',\n '➔',\n '➜',\n '➞',\n '➡',\n '➢',\n '➣',\n '➤',\n '➥',\n '➦',\n '➧',\n '➨',\n ],\n },\n {\n name: 'math',\n label: 'Math',\n symbols: [\n '+',\n '−',\n '×',\n '÷',\n '=',\n '≠',\n '<',\n '>',\n '≤',\n '≥',\n '±',\n '∓',\n '∞',\n '√',\n '∛',\n '∜',\n '∑',\n '∏',\n '∫',\n '∂',\n '∆',\n '∇',\n '∈',\n '∉',\n '∋',\n '∅',\n '∀',\n '∃',\n '∄',\n '⊂',\n '⊃',\n '⊆',\n '⊇',\n '∪',\n '∩',\n '⊕',\n '⊗',\n '⊥',\n '∠',\n '∟',\n ],\n },\n {\n name: 'greek',\n label: 'Greek',\n symbols: [\n 'α',\n 'β',\n 'γ',\n 'δ',\n 'ε',\n 'ζ',\n 'η',\n 'θ',\n 'ι',\n 'κ',\n 'λ',\n 'μ',\n 'ν',\n 'ξ',\n 'ο',\n 'π',\n 'ρ',\n 'σ',\n 'τ',\n 'υ',\n 'φ',\n 'χ',\n 'ψ',\n 'ω',\n 'Α',\n 'Β',\n 'Γ',\n 'Δ',\n 'Ε',\n 'Ζ',\n 'Η',\n 'Θ',\n 'Ι',\n 'Κ',\n 'Λ',\n 'Μ',\n 'Ν',\n 'Ξ',\n 'Ο',\n 'Π',\n ],\n },\n {\n name: 'shapes',\n label: 'Shapes',\n symbols: [\n '■',\n '□',\n '▪',\n '▫',\n '▬',\n '▭',\n '▮',\n '▯',\n '▰',\n '▱',\n '▲',\n '△',\n '▴',\n '▵',\n '▶',\n '▷',\n '▸',\n '▹',\n '►',\n '▻',\n '▼',\n '▽',\n '▾',\n '▿',\n '◀',\n '◁',\n '◂',\n '◃',\n '◄',\n '◅',\n '●',\n '○',\n '◎',\n '◉',\n '◌',\n '◍',\n '◐',\n '◑',\n '◒',\n '◓',\n ],\n },\n {\n name: 'punctuation',\n label: 'Punctuation',\n symbols: [\n '–',\n '—',\n '\\u2018',\n '\\u2019',\n '\\u201C',\n '\\u201D',\n '«',\n '»',\n '‹',\n '›',\n '…',\n '·',\n '•',\n '‣',\n '⁃',\n '‐',\n '‑',\n '‒',\n '―',\n '‖',\n '′',\n '″',\n '‴',\n '⁗',\n '‵',\n '‶',\n '‷',\n '※',\n '‽',\n '⁂',\n ],\n },\n {\n name: 'currency',\n label: 'Currency',\n symbols: [\n '$',\n '¢',\n '£',\n '¤',\n '¥',\n '₠',\n '₡',\n '₢',\n '₣',\n '₤',\n '₥',\n '₦',\n '₧',\n '₨',\n '₩',\n '₪',\n '₫',\n '€',\n '₭',\n '₮',\n '₯',\n '₰',\n '₱',\n '₲',\n '₳',\n '₴',\n '₵',\n '₶',\n '₷',\n '₸',\n ],\n },\n {\n name: 'music',\n label: 'Music',\n symbols: [\n '♩',\n '♪',\n '♫',\n '♬',\n '♭',\n '♮',\n '♯',\n '𝄞',\n '𝄢',\n '𝄪',\n '𝄫',\n '𝅗𝅥',\n '𝅘𝅥',\n '𝅘𝅥𝅮',\n '𝅘𝅥𝅯',\n '𝅘𝅥𝅰',\n '𝆒',\n '𝆓',\n '𝄐',\n '𝄑',\n ],\n },\n {\n name: 'emoji',\n label: 'Emoji',\n symbols: [\n '😀',\n '😃',\n '😄',\n '😁',\n '😆',\n '😅',\n '🤣',\n '😂',\n '🙂',\n '🙃',\n '😉',\n '😊',\n '😇',\n '🥰',\n '😍',\n '🤩',\n '😘',\n '😗',\n '☺',\n '😚',\n '❤',\n '🧡',\n '💛',\n '💚',\n '💙',\n '💜',\n '🖤',\n '🤍',\n '💔',\n '❣',\n '👍',\n '👎',\n '👌',\n '✌',\n '🤞',\n '🤟',\n '🤘',\n '👋',\n '🙏',\n '✅',\n ],\n },\n];\n\n/**\n * Get all symbols flattened\n */\nfunction getAllSymbols(): string[] {\n return SYMBOL_CATEGORIES.flatMap((cat) => cat.symbols);\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * InsertSymbolDialog - Modal for inserting special characters\n */\nexport function InsertSymbolDialog({\n isOpen,\n onClose,\n onInsert,\n recentSymbols = [],\n className,\n style,\n}: InsertSymbolDialogProps): React.ReactElement | null {\n // State\n const [selectedCategory, setSelectedCategory] = useState('common');\n const [selectedSymbol, setSelectedSymbol] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [hoveredSymbol, setHoveredSymbol] = useState<string | null>(null);\n\n // Refs\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Reset state when dialog opens\n useEffect(() => {\n if (isOpen) {\n setSelectedSymbol(null);\n setSearchQuery('');\n setHoveredSymbol(null);\n setTimeout(() => searchInputRef.current?.focus(), 100);\n }\n }, [isOpen]);\n\n // Filter symbols based on search\n const filteredSymbols = useMemo(() => {\n if (!searchQuery.trim()) {\n if (selectedCategory === 'recent') {\n return recentSymbols;\n }\n const category = SYMBOL_CATEGORIES.find((c) => c.name === selectedCategory);\n return category?.symbols || [];\n }\n\n const query = searchQuery.toLowerCase();\n const allSymbols = getAllSymbols();\n\n // Search by character or Unicode code point\n return allSymbols.filter((symbol) => {\n const codePoint = symbol.codePointAt(0)?.toString(16).toUpperCase() || '';\n return (\n symbol.includes(query) ||\n codePoint.includes(query.toUpperCase()) ||\n `U+${codePoint}`.toLowerCase().includes(query)\n );\n });\n }, [searchQuery, selectedCategory, recentSymbols]);\n\n /**\n * Handle symbol click\n */\n const handleSymbolClick = useCallback((symbol: string) => {\n setSelectedSymbol(symbol);\n }, []);\n\n /**\n * Handle symbol double-click (insert immediately)\n */\n const handleSymbolDoubleClick = useCallback(\n (symbol: string) => {\n onInsert(symbol);\n },\n [onInsert]\n );\n\n /**\n * Handle insert\n */\n const handleInsert = useCallback(() => {\n if (selectedSymbol) {\n onInsert(selectedSymbol);\n }\n }, [selectedSymbol, onInsert]);\n\n /**\n * Handle keyboard events\n */\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n } else if (e.key === 'Enter' && selectedSymbol) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, selectedSymbol, handleInsert]\n );\n\n /**\n * Handle overlay click\n */\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n /**\n * Get symbol info\n */\n const getSymbolInfo = (symbol: string | null) => {\n if (!symbol) return null;\n const codePoint = symbol.codePointAt(0);\n return {\n character: symbol,\n codePoint: codePoint ? `U+${codePoint.toString(16).toUpperCase().padStart(4, '0')}` : '',\n decimal: codePoint || 0,\n };\n };\n\n // Don't render if not open\n if (!isOpen) {\n return null;\n }\n\n const displaySymbol = hoveredSymbol || selectedSymbol;\n const symbolInfo = getSymbolInfo(displaySymbol);\n const canInsert = selectedSymbol !== null;\n\n // Categories including recent\n const categories = [\n ...(recentSymbols.length > 0 ? [{ name: 'recent', label: 'Recent' }] : []),\n ...SYMBOL_CATEGORIES.map((c) => ({ name: c.name, label: c.label })),\n ];\n\n return (\n <div\n className={`docx-insert-symbol-dialog-overlay ${className || ''}`}\n style={{ ...DIALOG_OVERLAY_STYLE, ...style }}\n onClick={handleOverlayClick}\n onKeyDown={handleKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"insert-symbol-dialog-title\"\n >\n <div className=\"docx-insert-symbol-dialog\" style={DIALOG_CONTENT_STYLE}>\n {/* Header */}\n <div className=\"docx-insert-symbol-dialog-header\" style={DIALOG_HEADER_STYLE}>\n <h2 id=\"insert-symbol-dialog-title\" style={DIALOG_TITLE_STYLE}>\n Insert Symbol\n </h2>\n <button\n type=\"button\"\n className=\"docx-insert-symbol-dialog-close\"\n style={CLOSE_BUTTON_STYLE}\n onClick={onClose}\n aria-label=\"Close dialog\"\n >\n &times;\n </button>\n </div>\n\n {/* Body */}\n <div className=\"docx-insert-symbol-dialog-body\" style={DIALOG_BODY_STYLE}>\n {/* Search */}\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search symbols (character or Unicode)...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={SEARCH_INPUT_STYLE}\n />\n\n {/* Category tabs */}\n {!searchQuery && (\n <div className=\"docx-insert-symbol-categories\" style={CATEGORY_TABS_STYLE}>\n {categories.map((cat) => (\n <button\n key={cat.name}\n type=\"button\"\n onClick={() => setSelectedCategory(cat.name)}\n style={\n selectedCategory === cat.name ? CATEGORY_TAB_ACTIVE_STYLE : CATEGORY_TAB_STYLE\n }\n >\n {cat.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Symbols grid */}\n <div className=\"docx-insert-symbol-grid\" style={SYMBOLS_GRID_STYLE}>\n {filteredSymbols.map((symbol, index) => (\n <button\n key={`${symbol}-${index}`}\n type=\"button\"\n onClick={() => handleSymbolClick(symbol)}\n onDoubleClick={() => handleSymbolDoubleClick(symbol)}\n onMouseEnter={() => setHoveredSymbol(symbol)}\n onMouseLeave={() => setHoveredSymbol(null)}\n style={{\n ...SYMBOL_BUTTON_STYLE,\n ...(selectedSymbol === symbol\n ? {\n backgroundColor: 'var(--doc-primary-light)',\n borderColor: 'var(--doc-primary)',\n }\n : {}),\n }}\n title={`${symbol} - U+${symbol.codePointAt(0)?.toString(16).toUpperCase()}`}\n >\n {symbol}\n </button>\n ))}\n </div>\n\n {/* No results */}\n {filteredSymbols.length === 0 && (\n <div style={{ textAlign: 'center', padding: '20px', color: 'var(--doc-text-muted)' }}>\n No symbols found for \"{searchQuery}\"\n </div>\n )}\n\n {/* Preview */}\n {symbolInfo && (\n <div className=\"docx-insert-symbol-preview\" style={PREVIEW_SECTION_STYLE}>\n <div style={PREVIEW_SYMBOL_STYLE}>{symbolInfo.character}</div>\n <div style={PREVIEW_INFO_STYLE}>\n <div style={{ fontSize: '14px', fontWeight: 500, marginBottom: '4px' }}>\n {symbolInfo.codePoint}\n </div>\n <div style={{ fontSize: '12px', color: 'var(--doc-text-muted)' }}>\n Decimal: {symbolInfo.decimal}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"docx-insert-symbol-dialog-footer\" style={DIALOG_FOOTER_STYLE}>\n <button\n type=\"button\"\n className=\"docx-insert-symbol-dialog-cancel\"\n style={SECONDARY_BUTTON_STYLE}\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"docx-insert-symbol-dialog-insert\"\n style={canInsert ? PRIMARY_BUTTON_STYLE : DISABLED_BUTTON_STYLE}\n onClick={handleInsert}\n disabled={!canInsert}\n >\n Insert\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Hook for managing Insert Symbol dialog state with recent symbols\n */\nexport function useInsertSymbolDialog(maxRecent = 20): {\n isOpen: boolean;\n recentSymbols: string[];\n open: () => void;\n close: () => void;\n toggle: () => void;\n addRecent: (symbol: string) => void;\n} {\n const [isOpen, setIsOpen] = useState(false);\n const [recentSymbols, setRecentSymbols] = useState<string[]>([]);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n const addRecent = useCallback(\n (symbol: string) => {\n setRecentSymbols((prev) => {\n // Remove if already exists, then add to front\n const filtered = prev.filter((s) => s !== symbol);\n return [symbol, ...filtered].slice(0, maxRecent);\n });\n },\n [maxRecent]\n );\n\n return { isOpen, recentSymbols, open, close, toggle, addRecent };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get all symbol categories\n */\nexport function getSymbolCategories(): SymbolCategory[] {\n return SYMBOL_CATEGORIES;\n}\n\n/**\n * Get symbols by category name\n */\nexport function getSymbolsByCategory(categoryName: string): string[] {\n const category = SYMBOL_CATEGORIES.find((c) => c.name === categoryName);\n return category?.symbols || [];\n}\n\n/**\n * Get symbol Unicode info\n */\nexport function getSymbolInfo(symbol: string): {\n character: string;\n codePoint: string;\n decimal: number;\n hex: string;\n} {\n const code = symbol.codePointAt(0) || 0;\n return {\n character: symbol,\n codePoint: `U+${code.toString(16).toUpperCase().padStart(4, '0')}`,\n decimal: code,\n hex: code.toString(16).toUpperCase(),\n };\n}\n\n/**\n * Search symbols by query\n */\nexport function searchSymbols(query: string): string[] {\n if (!query.trim()) return [];\n\n const lowerQuery = query.toLowerCase();\n return getAllSymbols().filter((symbol) => {\n const code = symbol.codePointAt(0)?.toString(16).toUpperCase() || '';\n return (\n symbol.includes(query) ||\n code.includes(lowerQuery.toUpperCase()) ||\n `U+${code}`.toLowerCase().includes(lowerQuery)\n );\n });\n}\n\n/**\n * Get symbol from Unicode code point string\n */\nexport function symbolFromCodePoint(codePointStr: string): string | null {\n // Handle formats: \"U+0041\", \"0041\", \"41\"\n const cleaned = codePointStr.replace(/^U\\+/i, '').replace(/^0x/i, '');\n const code = parseInt(cleaned, 16);\n\n if (isNaN(code) || code < 0 || code > 0x10ffff) {\n return null;\n }\n\n return String.fromCodePoint(code);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default InsertSymbolDialog;\n","/**\n * Paste Special Dialog Component\n *\n * Provides paste options for pasting content with or without formatting.\n * Features:\n * - Paste with formatting (default)\n * - Paste as plain text (unformatted)\n * - Keyboard shortcut: Ctrl+Shift+V opens dialog\n */\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ParsedClipboardContent } from '@eigenpal/docx-core/utils/clipboard';\nimport { readFromClipboard } from '@eigenpal/docx-core/utils/clipboard';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Paste option type\n */\nexport type PasteOption = 'formatted' | 'plainText';\n\n/**\n * Paste special dialog props\n */\nexport interface PasteSpecialDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Callback when paste is confirmed */\n onPaste: (content: ParsedClipboardContent, asPlainText: boolean) => void;\n /** Optional custom position */\n position?: { x: number; y: number };\n /** Additional className */\n className?: string;\n}\n\n/**\n * Paste option item\n */\ninterface PasteOptionItem {\n id: PasteOption;\n label: string;\n description: string;\n shortcut: string;\n}\n\n/**\n * Hook return value for paste special\n */\nexport interface UsePasteSpecialReturn {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Open the paste special dialog */\n openDialog: () => void;\n /** Close the dialog */\n closeDialog: () => void;\n /** Handle keyboard shortcut (Ctrl+Shift+V) */\n handleKeyDown: (event: KeyboardEvent) => boolean;\n /** Paste as plain text directly */\n pasteAsPlainText: () => Promise<void>;\n}\n\n/**\n * Options for usePasteSpecial hook\n */\nexport interface UsePasteSpecialOptions {\n /** Callback when paste is confirmed */\n onPaste?: (content: ParsedClipboardContent, asPlainText: boolean) => void;\n /** Whether paste operations are enabled */\n enabled?: boolean;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Available paste options\n */\nconst PASTE_OPTIONS: PasteOptionItem[] = [\n {\n id: 'formatted',\n label: 'Keep Source Formatting',\n description: 'Paste with original formatting',\n shortcut: 'Ctrl+V',\n },\n {\n id: 'plainText',\n label: 'Paste as Plain Text',\n description: 'Paste without any formatting',\n shortcut: 'Ctrl+Shift+V',\n },\n];\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst FormattedIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 4h12v2H4V4zM4 8h8v2H4V8zM4 12h10v2H4v-2zM4 16h6v2H4v-2z\" fill=\"currentColor\" />\n <path d=\"M14 10l3 3-3 3v-2h-2v-2h2v-2z\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n);\n\nconst PlainTextIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 4h12v1H4V4zM4 7h12v1H4V7zM4 10h12v1H4v-1zM4 13h12v1H4v-1zM4 16h8v1H4v-1z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/**\n * Get icon for paste option\n */\nfunction getPasteOptionIcon(option: PasteOption): React.ReactNode {\n switch (option) {\n case 'formatted':\n return <FormattedIcon />;\n case 'plainText':\n return <PlainTextIcon />;\n default:\n return null;\n }\n}\n\n// ============================================================================\n// PASTE OPTION ITEM COMPONENT\n// ============================================================================\n\ninterface PasteOptionButtonProps {\n option: PasteOptionItem;\n isSelected: boolean;\n onClick: () => void;\n onMouseEnter: () => void;\n}\n\nconst PasteOptionButton: React.FC<PasteOptionButtonProps> = ({\n option,\n isSelected,\n onClick,\n onMouseEnter,\n}) => {\n return (\n <button\n type=\"button\"\n className={`docx-paste-special-option ${isSelected ? 'docx-paste-special-option-selected' : ''}`}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n role=\"menuitem\"\n aria-selected={isSelected}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n width: '100%',\n padding: '12px 16px',\n border: 'none',\n background: isSelected ? 'var(--doc-primary-light)' : 'transparent',\n cursor: 'pointer',\n textAlign: 'left',\n borderRadius: '4px',\n transition: 'background-color 0.15s ease',\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n borderRadius: '4px',\n background: isSelected ? 'var(--doc-primary)' : 'var(--doc-bg-hover)',\n color: isSelected ? 'white' : 'var(--doc-text-muted)',\n }}\n >\n {getPasteOptionIcon(option.id)}\n </span>\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--doc-text)',\n marginBottom: '2px',\n }}\n >\n {option.label}\n </div>\n <div\n style={{\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n }}\n >\n {option.description}\n </div>\n </div>\n <span\n style={{\n fontSize: '11px',\n color: 'var(--doc-text-subtle)',\n fontFamily: 'monospace',\n }}\n >\n {option.shortcut}\n </span>\n </button>\n );\n};\n\n// ============================================================================\n// PASTE SPECIAL DIALOG COMPONENT\n// ============================================================================\n\nexport const PasteSpecialDialog: React.FC<PasteSpecialDialogProps> = ({\n isOpen,\n onClose,\n onPaste,\n position,\n className = '',\n}) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [clipboardContent, setClipboardContent] = useState<ParsedClipboardContent | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Read clipboard content when dialog opens\n useEffect(() => {\n if (!isOpen) {\n setClipboardContent(null);\n setError(null);\n setSelectedIndex(0);\n return;\n }\n\n const loadClipboard = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const content = await readFromClipboard({ cleanWordFormatting: true });\n setClipboardContent(content);\n if (!content) {\n setError('No content available to paste');\n }\n } catch {\n setError('Unable to read clipboard. Please use Ctrl+V to paste.');\n } finally {\n setIsLoading(false);\n }\n };\n\n loadClipboard();\n }, [isOpen]);\n\n // Handle click outside to close\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (dialogRef.current && !dialogRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose]);\n\n // Handle keyboard navigation\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => (prev + 1) % PASTE_OPTIONS.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev - 1 + PASTE_OPTIONS.length) % PASTE_OPTIONS.length);\n break;\n case 'Enter':\n e.preventDefault();\n handlePaste(PASTE_OPTIONS[selectedIndex].id);\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, selectedIndex, onClose]);\n\n const handlePaste = useCallback(\n (option: PasteOption) => {\n if (!clipboardContent) {\n setError('No content available to paste');\n return;\n }\n\n const asPlainText = option === 'plainText';\n onPaste(clipboardContent, asPlainText);\n onClose();\n },\n [clipboardContent, onPaste, onClose]\n );\n\n // Calculate dialog position\n const getDialogStyle = useCallback((): React.CSSProperties => {\n const dialogWidth = 320;\n const dialogHeight = 200;\n\n let x =\n position?.x ??\n (typeof window !== 'undefined' ? window.innerWidth / 2 - dialogWidth / 2 : 100);\n let y =\n position?.y ??\n (typeof window !== 'undefined' ? window.innerHeight / 2 - dialogHeight / 2 : 100);\n\n // Adjust for viewport boundaries\n if (typeof window !== 'undefined') {\n if (x + dialogWidth > window.innerWidth) {\n x = window.innerWidth - dialogWidth - 10;\n }\n if (y + dialogHeight > window.innerHeight) {\n y = window.innerHeight - dialogHeight - 10;\n }\n if (x < 10) x = 10;\n if (y < 10) y = 10;\n }\n\n return {\n position: 'fixed',\n top: y,\n left: x,\n width: dialogWidth,\n background: 'white',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n zIndex: 10001,\n overflow: 'hidden',\n };\n }, [position]);\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={dialogRef}\n className={`docx-paste-special-dialog ${className}`}\n style={getDialogStyle()}\n role=\"dialog\"\n aria-label=\"Paste Special\"\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid var(--doc-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <span\n style={{\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n }}\n >\n Paste Special\n </span>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: 'var(--doc-text-muted)',\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '8px' }}>\n {isLoading ? (\n <div\n style={{\n padding: '20px',\n textAlign: 'center',\n color: 'var(--doc-text-muted)',\n fontSize: '13px',\n }}\n >\n Reading clipboard...\n </div>\n ) : error ? (\n <div\n style={{\n padding: '20px',\n textAlign: 'center',\n color: 'var(--doc-error)',\n fontSize: '13px',\n }}\n >\n {error}\n </div>\n ) : (\n <div role=\"menu\">\n {PASTE_OPTIONS.map((option, index) => (\n <PasteOptionButton\n key={option.id}\n option={option}\n isSelected={index === selectedIndex}\n onClick={() => handlePaste(option.id)}\n onMouseEnter={() => setSelectedIndex(index)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Clipboard preview */}\n {clipboardContent && !isLoading && !error && (\n <div\n style={{\n padding: '8px 16px 12px',\n borderTop: '1px solid var(--doc-border)',\n }}\n >\n <div\n style={{\n fontSize: '11px',\n color: 'var(--doc-text-muted)',\n marginBottom: '4px',\n }}\n >\n Preview:\n </div>\n <div\n style={{\n fontSize: '12px',\n color: 'var(--doc-text)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n padding: '6px 8px',\n background: 'var(--doc-bg)',\n borderRadius: '4px',\n }}\n >\n \"{clipboardContent.plainText.slice(0, 50)}\n {clipboardContent.plainText.length > 50 ? '...' : ''}\"\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// HOOK FOR PASTE SPECIAL\n// ============================================================================\n\n/**\n * Hook to manage paste special dialog\n */\nexport function usePasteSpecial(options: UsePasteSpecialOptions = {}): UsePasteSpecialReturn {\n const { onPaste, enabled = true } = options;\n const [isOpen, setIsOpen] = useState(false);\n\n const openDialog = useCallback(() => {\n if (enabled) {\n setIsOpen(true);\n }\n }, [enabled]);\n\n const closeDialog = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n /**\n * Paste as plain text directly (without dialog)\n */\n const pasteAsPlainText = useCallback(async () => {\n if (!enabled || !onPaste) return;\n\n try {\n const content = await readFromClipboard({ cleanWordFormatting: true });\n if (content) {\n onPaste(content, true);\n }\n } catch (error) {\n console.error('Failed to paste as plain text:', error);\n }\n }, [enabled, onPaste]);\n\n /**\n * Handle keyboard shortcuts\n * Returns true if the event was handled\n */\n const handleKeyDown = useCallback(\n (event: KeyboardEvent): boolean => {\n if (!enabled) return false;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n // Ctrl+Shift+V - Open paste special dialog OR paste as plain text\n if (isCtrlOrMeta && event.shiftKey && event.key.toLowerCase() === 'v') {\n event.preventDefault();\n openDialog();\n return true;\n }\n\n return false;\n },\n [enabled, openDialog]\n );\n\n return {\n isOpen,\n openDialog,\n closeDialog,\n handleKeyDown,\n pasteAsPlainText,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get paste option by id\n */\nexport function getPasteOption(id: PasteOption): PasteOptionItem | undefined {\n return PASTE_OPTIONS.find((option) => option.id === id);\n}\n\n/**\n * Get all paste options\n */\nexport function getAllPasteOptions(): PasteOptionItem[] {\n return [...PASTE_OPTIONS];\n}\n\n/**\n * Get default paste option\n */\nexport function getDefaultPasteOption(): PasteOption {\n return 'formatted';\n}\n\n/**\n * Check if paste special shortcut\n */\nexport function isPasteSpecialShortcut(event: KeyboardEvent): boolean {\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n return isCtrlOrMeta && event.shiftKey && event.key.toLowerCase() === 'v';\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default PasteSpecialDialog;\n","/**\n * Keyboard Shortcuts Dialog Component\n *\n * Displays all available keyboard shortcuts organized by category.\n * Features:\n * - Categorized shortcut list\n * - Search/filter functionality\n * - Platform-aware modifier keys (Ctrl/Cmd)\n * - Keyboard shortcut to open (Ctrl+/)\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Keyboard shortcut definition\n */\nexport interface KeyboardShortcut {\n /** Unique identifier */\n id: string;\n /** Display name */\n name: string;\n /** Description of what the shortcut does */\n description: string;\n /** Primary key combination (e.g., 'Ctrl+C') */\n keys: string;\n /** Alternative key combination */\n altKeys?: string;\n /** Category for grouping */\n category: ShortcutCategory;\n /** Whether this is a common/frequently used shortcut */\n common?: boolean;\n}\n\n/**\n * Shortcut category\n */\nexport type ShortcutCategory =\n | 'editing'\n | 'formatting'\n | 'navigation'\n | 'clipboard'\n | 'selection'\n | 'view'\n | 'file'\n | 'other';\n\n/**\n * Dialog props\n */\nexport interface KeyboardShortcutsDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Close callback */\n onClose: () => void;\n /** Custom shortcuts (merged with defaults) */\n customShortcuts?: KeyboardShortcut[];\n /** Whether to show search */\n showSearch?: boolean;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Hook options\n */\nexport interface UseKeyboardShortcutsDialogOptions {\n /** Whether the dialog can be opened with Ctrl+? or F1 */\n enabled?: boolean;\n /** Custom open shortcut (default: Ctrl+/) */\n openShortcut?: string;\n}\n\n/**\n * Hook return value\n */\nexport interface UseKeyboardShortcutsDialogReturn {\n /** Whether dialog is open */\n isOpen: boolean;\n /** Open the dialog */\n open: () => void;\n /** Close the dialog */\n close: () => void;\n /** Toggle the dialog */\n toggle: () => void;\n /** Keyboard event handler */\n handleKeyDown: (event: KeyboardEvent) => void;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Category labels\n */\nconst CATEGORY_LABELS: Record<ShortcutCategory, string> = {\n editing: 'Editing',\n formatting: 'Formatting',\n navigation: 'Navigation',\n clipboard: 'Clipboard',\n selection: 'Selection',\n view: 'View',\n file: 'File',\n other: 'Other',\n};\n\n/**\n * Category order for display\n */\nconst CATEGORY_ORDER: ShortcutCategory[] = [\n 'file',\n 'editing',\n 'clipboard',\n 'formatting',\n 'selection',\n 'navigation',\n 'view',\n 'other',\n];\n\n/**\n * Default keyboard shortcuts\n */\nconst DEFAULT_SHORTCUTS: KeyboardShortcut[] = [\n // File\n {\n id: 'save',\n name: 'Save',\n description: 'Save document',\n keys: 'Ctrl+S',\n category: 'file',\n common: true,\n },\n { id: 'print', name: 'Print', description: 'Print document', keys: 'Ctrl+P', category: 'file' },\n\n // Editing\n {\n id: 'undo',\n name: 'Undo',\n description: 'Undo last action',\n keys: 'Ctrl+Z',\n category: 'editing',\n common: true,\n },\n {\n id: 'redo',\n name: 'Redo',\n description: 'Redo last action',\n keys: 'Ctrl+Y',\n altKeys: 'Ctrl+Shift+Z',\n category: 'editing',\n common: true,\n },\n {\n id: 'delete',\n name: 'Delete',\n description: 'Delete selected text',\n keys: 'Del',\n altKeys: 'Backspace',\n category: 'editing',\n },\n {\n id: 'find',\n name: 'Find',\n description: 'Find text in document',\n keys: 'Ctrl+F',\n category: 'editing',\n common: true,\n },\n {\n id: 'replace',\n name: 'Find & Replace',\n description: 'Find and replace text',\n keys: 'Ctrl+H',\n category: 'editing',\n },\n\n // Clipboard\n {\n id: 'cut',\n name: 'Cut',\n description: 'Cut selected text',\n keys: 'Ctrl+X',\n category: 'clipboard',\n common: true,\n },\n {\n id: 'copy',\n name: 'Copy',\n description: 'Copy selected text',\n keys: 'Ctrl+C',\n category: 'clipboard',\n common: true,\n },\n {\n id: 'paste',\n name: 'Paste',\n description: 'Paste from clipboard',\n keys: 'Ctrl+V',\n category: 'clipboard',\n common: true,\n },\n {\n id: 'paste-plain',\n name: 'Paste as Plain Text',\n description: 'Paste without formatting',\n keys: 'Ctrl+Shift+V',\n category: 'clipboard',\n },\n\n // Formatting\n {\n id: 'bold',\n name: 'Bold',\n description: 'Toggle bold formatting',\n keys: 'Ctrl+B',\n category: 'formatting',\n common: true,\n },\n {\n id: 'italic',\n name: 'Italic',\n description: 'Toggle italic formatting',\n keys: 'Ctrl+I',\n category: 'formatting',\n common: true,\n },\n {\n id: 'underline',\n name: 'Underline',\n description: 'Toggle underline formatting',\n keys: 'Ctrl+U',\n category: 'formatting',\n common: true,\n },\n {\n id: 'strikethrough',\n name: 'Strikethrough',\n description: 'Toggle strikethrough',\n keys: 'Ctrl+Shift+X',\n category: 'formatting',\n },\n {\n id: 'subscript',\n name: 'Subscript',\n description: 'Toggle subscript',\n keys: 'Ctrl+=',\n category: 'formatting',\n },\n {\n id: 'superscript',\n name: 'Superscript',\n description: 'Toggle superscript',\n keys: 'Ctrl+Shift+=',\n category: 'formatting',\n },\n {\n id: 'align-left',\n name: 'Align Left',\n description: 'Left align paragraph',\n keys: 'Ctrl+L',\n category: 'formatting',\n },\n {\n id: 'align-center',\n name: 'Align Center',\n description: 'Center align paragraph',\n keys: 'Ctrl+E',\n category: 'formatting',\n },\n {\n id: 'align-right',\n name: 'Align Right',\n description: 'Right align paragraph',\n keys: 'Ctrl+R',\n category: 'formatting',\n },\n {\n id: 'align-justify',\n name: 'Justify',\n description: 'Justify paragraph',\n keys: 'Ctrl+J',\n category: 'formatting',\n },\n {\n id: 'indent',\n name: 'Increase Indent',\n description: 'Increase paragraph indent',\n keys: 'Tab',\n category: 'formatting',\n },\n {\n id: 'outdent',\n name: 'Decrease Indent',\n description: 'Decrease paragraph indent',\n keys: 'Shift+Tab',\n category: 'formatting',\n },\n\n // Selection\n {\n id: 'select-all',\n name: 'Select All',\n description: 'Select all content',\n keys: 'Ctrl+A',\n category: 'selection',\n common: true,\n },\n {\n id: 'select-word',\n name: 'Select Word',\n description: 'Select current word',\n keys: 'Double-click',\n category: 'selection',\n },\n {\n id: 'select-paragraph',\n name: 'Select Paragraph',\n description: 'Select current paragraph',\n keys: 'Triple-click',\n category: 'selection',\n },\n {\n id: 'extend-selection-word',\n name: 'Extend Selection by Word',\n description: 'Extend selection to next/previous word',\n keys: 'Ctrl+Shift+Arrow',\n category: 'selection',\n },\n {\n id: 'extend-selection-line',\n name: 'Extend Selection to Line Edge',\n description: 'Extend selection to line start/end',\n keys: 'Shift+Home/End',\n category: 'selection',\n },\n\n // Navigation\n {\n id: 'move-word',\n name: 'Move by Word',\n description: 'Move cursor to next/previous word',\n keys: 'Ctrl+Arrow',\n category: 'navigation',\n },\n {\n id: 'move-line-start',\n name: 'Move to Line Start',\n description: 'Move cursor to start of line',\n keys: 'Home',\n category: 'navigation',\n },\n {\n id: 'move-line-end',\n name: 'Move to Line End',\n description: 'Move cursor to end of line',\n keys: 'End',\n category: 'navigation',\n },\n {\n id: 'move-doc-start',\n name: 'Move to Document Start',\n description: 'Move cursor to start of document',\n keys: 'Ctrl+Home',\n category: 'navigation',\n },\n {\n id: 'move-doc-end',\n name: 'Move to Document End',\n description: 'Move cursor to end of document',\n keys: 'Ctrl+End',\n category: 'navigation',\n },\n {\n id: 'page-up',\n name: 'Page Up',\n description: 'Scroll up one page',\n keys: 'Page Up',\n category: 'navigation',\n },\n {\n id: 'page-down',\n name: 'Page Down',\n description: 'Scroll down one page',\n keys: 'Page Down',\n category: 'navigation',\n },\n\n // View\n {\n id: 'zoom-in',\n name: 'Zoom In',\n description: 'Increase zoom level',\n keys: 'Ctrl++',\n altKeys: 'Ctrl+Scroll Up',\n category: 'view',\n },\n {\n id: 'zoom-out',\n name: 'Zoom Out',\n description: 'Decrease zoom level',\n keys: 'Ctrl+-',\n altKeys: 'Ctrl+Scroll Down',\n category: 'view',\n },\n {\n id: 'zoom-reset',\n name: 'Reset Zoom',\n description: 'Reset zoom to 100%',\n keys: 'Ctrl+0',\n category: 'view',\n },\n {\n id: 'shortcuts',\n name: 'Keyboard Shortcuts',\n description: 'Show this help dialog',\n keys: 'Ctrl+/',\n altKeys: 'F1',\n category: 'view',\n },\n];\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Detect if running on Mac\n */\nfunction isMac(): boolean {\n return typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n}\n\n/**\n * Format key combination for current platform\n */\nfunction formatKeys(keys: string): string {\n if (isMac()) {\n return keys\n .replace(/Ctrl\\+/g, '\\u2318')\n .replace(/Alt\\+/g, '\\u2325')\n .replace(/Shift\\+/g, '\\u21E7');\n }\n return keys;\n}\n\n// ============================================================================\n// SHORTCUT ITEM COMPONENT\n// ============================================================================\n\ninterface ShortcutItemProps {\n shortcut: KeyboardShortcut;\n}\n\nconst ShortcutItem: React.FC<ShortcutItemProps> = ({ shortcut }) => {\n const formattedKeys = formatKeys(shortcut.keys);\n const formattedAltKeys = shortcut.altKeys ? formatKeys(shortcut.altKeys) : null;\n\n return (\n <div\n className=\"docx-shortcut-item\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 0',\n borderBottom: '1px solid var(--doc-border-light)',\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontSize: '13px',\n fontWeight: 500,\n color: 'var(--doc-text)',\n }}\n >\n {shortcut.name}\n </div>\n <div\n style={{\n fontSize: '11px',\n color: 'var(--doc-text-muted)',\n marginTop: '2px',\n }}\n >\n {shortcut.description}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n }}\n >\n <kbd\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '4px 8px',\n fontSize: '12px',\n fontFamily: 'monospace',\n color: 'var(--doc-text)',\n backgroundColor: 'var(--doc-bg-hover)',\n borderRadius: '4px',\n border: '1px solid var(--doc-border-light)',\n boxShadow: '0 1px 1px rgba(0,0,0,0.1)',\n }}\n >\n {formattedKeys}\n </kbd>\n {formattedAltKeys && (\n <>\n <span style={{ color: 'var(--doc-text-subtle)', fontSize: '11px' }}>or</span>\n <kbd\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '4px 8px',\n fontSize: '12px',\n fontFamily: 'monospace',\n color: 'var(--doc-text)',\n backgroundColor: 'var(--doc-bg-hover)',\n borderRadius: '4px',\n border: '1px solid var(--doc-border-light)',\n boxShadow: '0 1px 1px rgba(0,0,0,0.1)',\n }}\n >\n {formattedAltKeys}\n </kbd>\n </>\n )}\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// KEYBOARD SHORTCUTS DIALOG COMPONENT\n// ============================================================================\n\nexport const KeyboardShortcutsDialog: React.FC<KeyboardShortcutsDialogProps> = ({\n isOpen,\n onClose,\n customShortcuts = [],\n showSearch = true,\n className = '',\n}) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n // Merge custom shortcuts with defaults\n const allShortcuts = useMemo(() => {\n const merged = [...DEFAULT_SHORTCUTS];\n for (const custom of customShortcuts) {\n const existingIndex = merged.findIndex((s) => s.id === custom.id);\n if (existingIndex >= 0) {\n merged[existingIndex] = custom;\n } else {\n merged.push(custom);\n }\n }\n return merged;\n }, [customShortcuts]);\n\n // Filter shortcuts by search query\n const filteredShortcuts = useMemo(() => {\n if (!searchQuery.trim()) return allShortcuts;\n\n const query = searchQuery.toLowerCase();\n return allShortcuts.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description.toLowerCase().includes(query) ||\n s.keys.toLowerCase().includes(query) ||\n (s.altKeys && s.altKeys.toLowerCase().includes(query))\n );\n }, [allShortcuts, searchQuery]);\n\n // Group shortcuts by category\n const groupedShortcuts = useMemo(() => {\n const groups = new Map<ShortcutCategory, KeyboardShortcut[]>();\n\n for (const shortcut of filteredShortcuts) {\n const existing = groups.get(shortcut.category) || [];\n existing.push(shortcut);\n groups.set(shortcut.category, existing);\n }\n\n // Sort by category order\n const sorted: Array<{ category: ShortcutCategory; shortcuts: KeyboardShortcut[] }> = [];\n for (const category of CATEGORY_ORDER) {\n const shortcuts = groups.get(category);\n if (shortcuts && shortcuts.length > 0) {\n sorted.push({ category, shortcuts });\n }\n }\n\n return sorted;\n }, [filteredShortcuts]);\n\n // Focus search on open\n useEffect(() => {\n if (isOpen && showSearch && searchInputRef.current) {\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n }, [isOpen, showSearch]);\n\n // Reset search on close\n useEffect(() => {\n if (!isOpen) {\n setSearchQuery('');\n }\n }, [isOpen]);\n\n // Handle click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (dialogRef.current && !dialogRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose]);\n\n // Handle Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"docx-shortcuts-overlay\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10001,\n }}\n >\n <div\n ref={dialogRef}\n className={`docx-shortcuts-dialog ${className}`}\n style={{\n width: '600px',\n maxWidth: '90vw',\n maxHeight: '80vh',\n backgroundColor: 'white',\n borderRadius: '12px',\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.2)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }}\n role=\"dialog\"\n aria-label=\"Keyboard Shortcuts\"\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: '1px solid var(--doc-border)',\n }}\n >\n <h2\n style={{\n margin: 0,\n fontSize: '18px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n }}\n >\n Keyboard Shortcuts\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '50%',\n color: 'var(--doc-text-muted)',\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M5 5l10 10M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n {/* Search */}\n {showSearch && (\n <div style={{ padding: '12px 20px', borderBottom: '1px solid var(--doc-border)' }}>\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search shortcuts...\"\n style={{\n width: '100%',\n padding: '10px 12px',\n fontSize: '14px',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '6px',\n outline: 'none',\n }}\n />\n </div>\n )}\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n overflowY: 'auto',\n padding: '16px 20px',\n }}\n >\n {groupedShortcuts.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '32px',\n color: 'var(--doc-text-muted)',\n }}\n >\n No shortcuts found matching \"{searchQuery}\"\n </div>\n ) : (\n groupedShortcuts.map(({ category, shortcuts }) => (\n <div key={category} style={{ marginBottom: '24px' }}>\n <h3\n style={{\n margin: '0 0 12px 0',\n fontSize: '13px',\n fontWeight: 600,\n color: 'var(--doc-primary)',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n >\n {CATEGORY_LABELS[category]}\n </h3>\n <div>\n {shortcuts.map((shortcut) => (\n <ShortcutItem key={shortcut.id} shortcut={shortcut} />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 20px',\n borderTop: '1px solid var(--doc-border)',\n backgroundColor: 'var(--doc-bg)',\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n textAlign: 'center',\n }}\n >\n Press{' '}\n <kbd\n style={{\n padding: '2px 6px',\n backgroundColor: 'white',\n borderRadius: '4px',\n border: '1px solid var(--doc-border-light)',\n }}\n >\n Esc\n </kbd>{' '}\n to close\n </div>\n </div>\n </div>\n );\n};\n\n// ============================================================================\n// HOOK FOR KEYBOARD SHORTCUTS DIALOG\n// ============================================================================\n\n/**\n * Hook to manage keyboard shortcuts dialog\n */\nexport function useKeyboardShortcutsDialog(\n options: UseKeyboardShortcutsDialogOptions = {}\n): UseKeyboardShortcutsDialogReturn {\n const { enabled = true, openShortcut: _openShortcut = 'Ctrl+/' } = options;\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => {\n if (enabled) setIsOpen(true);\n }, [enabled]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!enabled) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n // Ctrl+/ or Ctrl+? to open\n if (isCtrlOrMeta && (event.key === '/' || event.key === '?')) {\n event.preventDefault();\n toggle();\n return;\n }\n\n // F1 to open\n if (event.key === 'F1') {\n event.preventDefault();\n open();\n return;\n }\n },\n [enabled, toggle, open]\n );\n\n // Set up global keyboard listener\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enabled, handleKeyDown]);\n\n return {\n isOpen,\n open,\n close,\n toggle,\n handleKeyDown,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get all default shortcuts\n */\nexport function getDefaultShortcuts(): KeyboardShortcut[] {\n return [...DEFAULT_SHORTCUTS];\n}\n\n/**\n * Get shortcuts by category\n */\nexport function getShortcutsByCategory(category: ShortcutCategory): KeyboardShortcut[] {\n return DEFAULT_SHORTCUTS.filter((s) => s.category === category);\n}\n\n/**\n * Get common/frequently used shortcuts\n */\nexport function getCommonShortcuts(): KeyboardShortcut[] {\n return DEFAULT_SHORTCUTS.filter((s) => s.common);\n}\n\n/**\n * Get category label\n */\nexport function getCategoryLabel(category: ShortcutCategory): string {\n return CATEGORY_LABELS[category];\n}\n\n/**\n * Get all categories\n */\nexport function getAllCategories(): ShortcutCategory[] {\n return [...CATEGORY_ORDER];\n}\n\n/**\n * Format shortcut keys for display\n */\nexport function formatShortcutKeys(keys: string): string {\n return formatKeys(keys);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default KeyboardShortcutsDialog;\n"]}