@eigenpal/docx-js-editor 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FindReplaceDialog-K4GRE4JB.cjs +2 -0
- package/dist/FindReplaceDialog-K4GRE4JB.cjs.map +1 -0
- package/dist/{FindReplaceDialog-UMXCBBST.js → FindReplaceDialog-MMDEJORP.js} +2 -1
- package/dist/FindReplaceDialog-MMDEJORP.js.map +1 -0
- package/dist/{FootnotePropertiesDialog-TYQGPWPX.js → FootnotePropertiesDialog-HG4267LR.js} +2 -1
- package/dist/FootnotePropertiesDialog-HG4267LR.js.map +1 -0
- package/dist/{FootnotePropertiesDialog-OBQXOBJE.cjs → FootnotePropertiesDialog-V3YOIJCV.cjs} +2 -1
- package/dist/FootnotePropertiesDialog-V3YOIJCV.cjs.map +1 -0
- package/dist/{HyperlinkDialog-UOERZIBM.js → HyperlinkDialog-SCSX4RP7.js} +2 -1
- package/dist/HyperlinkDialog-SCSX4RP7.js.map +1 -0
- package/dist/HyperlinkDialog-YPKURBZK.cjs +2 -0
- package/dist/HyperlinkDialog-YPKURBZK.cjs.map +1 -0
- package/dist/{ImagePositionDialog-52FDANUK.js → ImagePositionDialog-CJYJ35PI.js} +2 -1
- package/dist/ImagePositionDialog-CJYJ35PI.js.map +1 -0
- package/dist/{ImagePositionDialog-ZK5WFBRC.cjs → ImagePositionDialog-IMVI7EXA.cjs} +2 -1
- package/dist/ImagePositionDialog-IMVI7EXA.cjs.map +1 -0
- package/dist/{ImagePropertiesDialog-YPSLPSF6.js → ImagePropertiesDialog-P7WN2ALR.js} +2 -1
- package/dist/ImagePropertiesDialog-P7WN2ALR.js.map +1 -0
- package/dist/{ImagePropertiesDialog-LU44RDIY.cjs → ImagePropertiesDialog-YS4KJRN7.cjs} +2 -1
- package/dist/ImagePropertiesDialog-YS4KJRN7.cjs.map +1 -0
- package/dist/{TablePropertiesDialog-KMOYHPGF.cjs → TablePropertiesDialog-CUQXUBQN.cjs} +2 -1
- package/dist/TablePropertiesDialog-CUQXUBQN.cjs.map +1 -0
- package/dist/{TablePropertiesDialog-OUUJAA7D.js → TablePropertiesDialog-ZHAYVHPZ.js} +2 -1
- package/dist/TablePropertiesDialog-ZHAYVHPZ.js.map +1 -0
- package/dist/{clipboard-BOocwmAM.d.ts → TableToolbar-RHX9L4h9.d.cts} +2 -125
- package/dist/{clipboard-Cx7cb3kX.d.cts → TableToolbar-RHX9L4h9.d.ts} +2 -125
- package/dist/chunk-7FEY3YWC.cjs +3 -0
- package/dist/chunk-7FEY3YWC.cjs.map +1 -0
- package/dist/chunk-AL62KQYJ.js +2 -0
- package/dist/chunk-AL62KQYJ.js.map +1 -0
- package/dist/{chunk-VTAS7VZ6.cjs → chunk-DJAEBZ33.cjs} +2 -1
- package/dist/chunk-DJAEBZ33.cjs.map +1 -0
- package/dist/{chunk-CTYOM6BE.js → chunk-M2T6XKT5.js} +2 -1
- package/dist/chunk-M2T6XKT5.js.map +1 -0
- package/dist/chunk-MXGYESPA.cjs +178 -0
- package/dist/chunk-MXGYESPA.cjs.map +1 -0
- package/dist/chunk-NMYD4OJZ.js +3 -0
- package/dist/chunk-NMYD4OJZ.js.map +1 -0
- package/dist/chunk-OD33FUTO.js +178 -0
- package/dist/chunk-OD33FUTO.js.map +1 -0
- package/dist/{chunk-PJVI53AH.js → chunk-Q6HUGWO6.js} +2 -1
- package/dist/chunk-Q6HUGWO6.js.map +1 -0
- package/dist/{chunk-XS2AQFMF.cjs → chunk-S26DZVRQ.cjs} +2 -1
- package/dist/chunk-S26DZVRQ.cjs.map +1 -0
- package/dist/chunk-V3MCDVZE.cjs +2 -0
- package/dist/chunk-V3MCDVZE.cjs.map +1 -0
- package/dist/{chunk-MLSHZVL7.js → chunk-VIEW4NAF.js} +6 -5
- package/dist/chunk-VIEW4NAF.js.map +1 -0
- package/dist/{chunk-OEOUMSWH.cjs → chunk-ZX4CSEL3.cjs} +6 -5
- package/dist/chunk-ZX4CSEL3.cjs.map +1 -0
- package/dist/core-plugins-reexport.cjs +2 -0
- package/dist/core-plugins-reexport.cjs.map +1 -0
- package/dist/core-plugins-reexport.d.cts +1 -0
- package/dist/core-plugins-reexport.d.ts +1 -0
- package/dist/core-plugins-reexport.js +2 -0
- package/dist/core-plugins-reexport.js.map +1 -0
- package/dist/core-reexport.cjs +2 -0
- package/dist/core-reexport.cjs.map +1 -0
- package/dist/core-reexport.d.cts +4 -0
- package/dist/core-reexport.d.ts +4 -0
- package/dist/core-reexport.js +2 -0
- package/dist/core-reexport.js.map +1 -0
- package/dist/headless-reexport.cjs +2 -0
- package/dist/headless-reexport.cjs.map +1 -0
- package/dist/headless-reexport.d.cts +1 -0
- package/dist/headless-reexport.d.ts +1 -0
- package/dist/headless-reexport.js +2 -0
- package/dist/headless-reexport.js.map +1 -0
- package/dist/index.cjs +10 -9
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +28 -257
- package/dist/index.d.ts +28 -257
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -0
- package/dist/mcp-reexport.cjs +2 -0
- package/dist/mcp-reexport.cjs.map +1 -0
- package/dist/mcp-reexport.d.cts +1 -0
- package/dist/mcp-reexport.d.ts +1 -0
- package/dist/mcp-reexport.js +2 -0
- package/dist/mcp-reexport.js.map +1 -0
- package/dist/react.cjs +2 -1
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +860 -9
- package/dist/react.d.ts +860 -9
- package/dist/react.js +2 -1
- package/dist/react.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/ui.cjs +2 -1
- package/dist/ui.cjs.map +1 -0
- package/dist/ui.d.cts +5 -3
- package/dist/ui.d.ts +5 -3
- package/dist/ui.js +2 -1
- package/dist/ui.js.map +1 -0
- package/package.json +27 -87
- package/LICENSE +0 -21
- package/README.md +0 -171
- package/dist/DocumentAgent-Ci6_T-XM.d.ts +0 -412
- package/dist/DocumentAgent-DEGFgYEN.d.cts +0 -412
- package/dist/FindReplaceDialog-46BE7Q2G.cjs +0 -1
- package/dist/HyperlinkDialog-22NH7ZLP.cjs +0 -1
- package/dist/agentApi-CbVUCZRu.d.cts +0 -2086
- package/dist/agentApi-CbVUCZRu.d.ts +0 -2086
- package/dist/chunk-24N3L4IL.cjs +0 -258
- package/dist/chunk-2ASOEN3V.js +0 -1
- package/dist/chunk-46OFHSPJ.cjs +0 -2
- package/dist/chunk-65OFYOHF.cjs +0 -58
- package/dist/chunk-6YFGCUHU.js +0 -4
- package/dist/chunk-DYQUXFE5.cjs +0 -1
- package/dist/chunk-EMKABJPH.js +0 -1
- package/dist/chunk-ESI4BSBF.js +0 -1
- package/dist/chunk-FYAWM7MP.cjs +0 -1
- package/dist/chunk-GLFFXY2X.js +0 -258
- package/dist/chunk-ITWEFKGQ.cjs +0 -1
- package/dist/chunk-JKN7TNPA.js +0 -12
- package/dist/chunk-KESNGXGO.js +0 -1
- package/dist/chunk-L34XFLQZ.cjs +0 -1
- package/dist/chunk-NO7WUK5E.cjs +0 -12
- package/dist/chunk-NT2REEAA.cjs +0 -1
- package/dist/chunk-O7QVCJN6.cjs +0 -4
- package/dist/chunk-OW5H5DNE.cjs +0 -1
- package/dist/chunk-OWMXCVKB.js +0 -1
- package/dist/chunk-PXC7ARQB.cjs +0 -1
- package/dist/chunk-R5SKERM2.js +0 -1
- package/dist/chunk-RM3ITJ2H.cjs +0 -10
- package/dist/chunk-SF53KLDZ.cjs +0 -1
- package/dist/chunk-TOI5W3HK.js +0 -8
- package/dist/chunk-UAVOWAIF.cjs +0 -8
- package/dist/chunk-ULNHBTYA.js +0 -2
- package/dist/chunk-UXXV4GT6.js +0 -10
- package/dist/chunk-VOWKSURW.cjs +0 -1
- package/dist/chunk-WFWLPKQA.js +0 -1
- package/dist/chunk-WFYRA2TH.js +0 -1
- package/dist/chunk-YMXKVLTU.js +0 -58
- package/dist/chunk-ZDYHAYN6.js +0 -1
- package/dist/colorResolver-CIDiSPWd.d.cts +0 -618
- package/dist/colorResolver-KXbUgzWC.d.ts +0 -618
- package/dist/core-plugins.cjs +0 -1
- package/dist/core-plugins.d.cts +0 -31
- package/dist/core-plugins.d.ts +0 -31
- package/dist/core-plugins.js +0 -1
- package/dist/core.cjs +0 -1
- package/dist/core.d.cts +0 -23
- package/dist/core.d.ts +0 -23
- package/dist/core.js +0 -1
- package/dist/executor-ITYZTNSH.cjs +0 -1
- package/dist/executor-TC7CLATE.js +0 -1
- package/dist/headless.cjs +0 -4
- package/dist/headless.d.cts +0 -195
- package/dist/headless.d.ts +0 -195
- package/dist/headless.js +0 -4
- package/dist/index.css +0 -1
- package/dist/insertOperations-CzB5b-Of.d.ts +0 -176
- package/dist/insertOperations-DKVmCV32.d.cts +0 -176
- package/dist/mcp-cli.js +0 -136
- package/dist/mcp.cjs +0 -16
- package/dist/mcp.d.cts +0 -156
- package/dist/mcp.d.ts +0 -156
- package/dist/mcp.js +0 -16
- package/dist/processTemplate-525HZL4S.cjs +0 -1
- package/dist/processTemplate-RJN6452W.js +0 -1
- package/dist/react-BZxD04XV.d.ts +0 -1350
- package/dist/react-D8eAYckC.d.cts +0 -1350
- package/dist/react.css +0 -1
- package/dist/registry-D4tvj9f3.d.ts +0 -165
- package/dist/registry-ngv6Bumt.d.cts +0 -165
- package/dist/selectionRects-PQEUEW35.cjs +0 -1
- package/dist/selectionRects-QAG5RSHD.js +0 -1
- package/dist/types-D96elyJF.d.cts +0 -310
- package/dist/types-xMzSPT4i.d.ts +0 -310
- package/dist/variableDetector-CPxKo9jP.d.cts +0 -173
- package/dist/variableDetector-DeM1N-_L.d.ts +0 -173
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ErrorBoundary.tsx","../src/hooks/useTableSelection.ts","../src/components/DocumentOutline.tsx","../src/components/ui/VerticalRuler.tsx","../src/components/InlineHeaderFooterEditor.tsx","../src/components/ui/TableStyleGallery.tsx","../src/components/DocxEditorHelpers.tsx","../src/hooks/useHistory.ts","../src/paged-editor/HiddenProseMirror.tsx","../src/paged-editor/SelectionOverlay.tsx","../src/paged-editor/ImageSelectionOverlay.tsx","../src/paged-editor/LayoutSelectionGate.ts","../src/paged-editor/useVisualLineNavigation.ts","../src/plugin-api/RenderedDomContext.ts","../src/paged-editor/PagedEditor.tsx","../src/components/DocxEditor.tsx","../src/renderAsync.ts","../src/hooks/useAutoSave.ts","../src/hooks/useWheelZoom.ts","../src/hooks/useSelectionHighlight.ts","../src/hooks/useClipboard.ts","../src/plugin-api/PluginHost.tsx"],"names":["ErrorContext","createContext","useErrorNotifications","context","useContext","ErrorProvider","children","notifications","setNotifications","useState","idCounter","useRef","addNotification","useCallback","message","severity","details","id","notification","prev","dismissNotification","showError","showWarning","showInfo","n","clearNotifications","value","jsxs","jsx","NotificationContainer","onDismiss","visibleNotifications","NotificationToast","isExpanded","setIsExpanded","colors","toastStyle","headerStyle","iconStyle","contentStyle","messageStyle","detailsStyle","buttonStyle","getIcon","Fragment","ErrorBoundary","Component","props","__publicField","error","errorInfo","fallback","showDetails","DefaultErrorFallback","onReset","containerStyle","titleStyle","ParseErrorDisplay","onRetry","className","UnsupportedFeatureWarning","feature","description","isParseError","getUserFriendlyMessage","TABLE_DATA_ATTRIBUTES","getTableFromDocument","doc","tableIndex","currentTableIndex","block","updateTableInDocument","newTable","newContent","deleteTableFromDocument","shouldDelete","useTableSelection","onChange","onSelectionChange","state","setState","handleCellClick","rowIndex","columnIndex","table","createTableContext","clearSelection","handleAction","action","newDoc","newRowIndex","newColumnIndex","addRow","addColumn","deleteRow","getColumnCount","deleteColumn","newColCount","mergeCells","splitCell","isCellSelected","DocumentOutline","headings","onHeadingClick","onClose","topOffset","open","setOpen","useEffect","e","MaterialSymbol","heading","index","DEFAULT_PAGE_HEIGHT_TWIPS","DEFAULT_MARGIN_TWIPS","TWIPS_PER_INCH","TWIPS_PER_CM","RULER_WIDTH","RULER_TEXT_COLOR","RULER_TICK_COLOR","MARKER_COLOR","MARKER_HOVER_COLOR","MARKER_ACTIVE_COLOR","VerticalRuler","sectionProps","zoom","editable","onTopMarginChange","onBottomMarginChange","unit","style","dragging","setDragging","hoveredMarker","setHoveredMarker","rulerRef","pageHeightTwips","topMarginTwips","bottomMarginTwips","pageHeightPx","twipsToPixels","topMarginPx","bottomMarginPx","handleDragStart","marker","handleDrag","rect","y","positionTwips","pixelsToTwips","maxMargin","newMargin","fromBottom","handleDragEnd","ticks","generateVerticalTicks","rulerStyle","formatPx","tick","VerticalTick","VerticalMarginMarker","tickStyle","labelStyle","type","position","isDragging","isHovered","onMouseEnter","onMouseLeave","onMouseDown","color","markerStyle","triangleStyle","eighthInchTwips","totalEighths","i","twipsPos","pxPos","inches","mmTwips","totalMm","cm","separatorBarStyle","optionsButtonStyle","dropdownStyle","dropdownItemStyle","InlineHeaderFooterEditor","forwardRef","headerFooter","styles","targetElement","parentElement","onSave","onRemove","ref","editorContainerRef","viewRef","isDirty","setIsDirty","showOptions","setShowOptions","optionsRef","overlayPos","setOverlayPos","useLayoutEffect","computePosition","parentRect","targetRect","scrollParent","pmDoc","headerFooterToProseDoc","hfMgr","ExtensionManager","createStarterKit","plugins","EditorState","schema","view","EditorView","tr","newState","selState","extractSelectionState","handleSave","blocks","proseDocToBlocks","handleSaveAndClose","handleKeyDown","handleClick","useImperativeHandle","undo","redo","label","OptionsMenu","insertField","fieldType","$from","from","marks","node","border1","rgb","BUILTIN_STYLES","getBuiltinTableStyle","styleId","s","DefaultLoadingIndicator","DefaultPlaceholder","ParseError","defaultIsEqual","a","b","useHistory","initialState","options","maxEntries","groupingInterval","enableKeyboardShortcuts","isEqual","onUndo","onRedo","containerRef","undoStack","setUndoStack","redoStack","setRedoStack","lastPushTimeRef","isUndoRedoRef","push","now","newStack","newEntry","prevEntry","nextEntry","clear","reset","newInitialState","getUndoStack","getRedoStack","event","target","useDocumentHistory","document","HIDDEN_HOST_STYLES","createInitialState","manager","externalPlugins","activeSchema","toProseDoc","createEmptyDoc","stateToDocument","originalDoc","fromProseDoc","HiddenProseMirrorComponent","_theme","widthPx","readOnly","onTransaction","extensionManager","onEditorViewReady","onEditorViewDestroy","onKeyDown","hostRef","documentRef","isDestroyingRef","lastDocumentIdRef","isInitializedRef","onTransactionRef","onSelectionChangeRef","onEditorViewReadyRef","onEditorViewDestroyRef","onKeyDownRef","createView","editorProps","transaction","destroyView","currentDocId","meta","command","anchor","head","dispatch","$anchor","$head","selection","TextSelection","pos","NodeSelection","anchorCellPos","headCellPos","cellSel","CellSelection","HiddenProseMirror","memo","DEFAULT_CARET_COLOR","DEFAULT_SELECTION_COLOR","DEFAULT_CARET_WIDTH","DEFAULT_BLINK_INTERVAL","overlayStyles","caretStyles","caret","width","visible","selectionRectStyles","Caret","blinkInterval","isFocused","setVisible","blinkTimerRef","v","SelectionRectangle","SelectionOverlay","selectionRects","caretPosition","caretColor","selectionColor","caretWidth","hasRangeSelection","hasCollapsedSelection","HANDLE_SIZE","HANDLE_HALF","BORDER_WIDTH","ACCENT_COLOR","borderStyles","handleBaseStyles","dimensionStyles","HANDLE_CURSORS","calculateNewDimensions","handle","deltaX","deltaY","startWidth","startHeight","lockAspect","signX","signY","newWidth","newHeight","scale","ImageSelectionOverlay","imageInfo","onResize","onResizeStart","onResizeEnd","onDragMove","onDragStart","onDragEnd","isResizing","setIsResizing","setIsDragging","resizeWidth","setResizeWidth","resizeHeight","setResizeHeight","overlayRect","setOverlayRect","rafRef","overlayRef","onResizeRef","onResizeStartRef","onResizeEndRef","onDragMoveRef","onDragStartRef","onDragEndRef","imageInfoRef","zoomRef","updatePosition","parent","imageRect","container","handleScrollOrResize","handleResizeStart","startX","startY","finalWidth","finalHeight","handleMouseMove","moveEvent","currentZoom","dims","newRect","handleMouseUp","info","handleBodyMouseDown","DRAG_THRESHOLD","dragStarted","ghostEl","dx","dy","upEvent","left","top","height","Handle","_stateSeq","_renderSeq","_layoutUpdating","_pendingRender","_renderCallbacks","_LayoutSelectionGate_instances","tryRender_fn","executeRender_fn","LayoutSelectionGate","__privateAdd","seq","__privateSet","__privateWrapper","__privateGet","__privateMethod","callback","render","useVisualLineNavigation","pagesContainerRef","stickyXRef","lastVisualLineIndexRef","getCaretClientX","pmPos","spans","span","spanEl","pmStart","pmEnd","textNode","charIndex","ownerDoc","range","emptyRuns","emptyRun","paragraph","findLineElementAtPosition","allLines","line","lineEl","start","end","pStart","pEnd","findPositionOnLineAtClientX","clientX","mid","text","lo","hi","r","leftX","rightX","closestSpan","closestDist","dist","handlePMKeyDown","currentIndex","currentLine","targetIndex","targetLine","newPos","clampedPos","sel","$newPos","RenderedDomContextImpl","pagesContainer","containerRect","spanRect","lineHeight","rangeRect","runRect","to","elements","rects","startChar","endChar","clientRects","createRenderedDomContext","DEFAULT_PAGE_WIDTH","DEFAULT_PAGE_HEIGHT","DEFAULT_MARGINS","DEFAULT_PAGE_GAP","EMPTY_PLUGINS","containerStyles","viewportStyles","pagesContainerStyles","pluginOverlaysStyles","twips","getPageSize","getMargins","bottom","isFloatingImageRun","run","wrapType","displayMode","emuToPixels","emu","resolveTableWidthPx","widthType","contentWidth","measureTableBlock","tableBlock","columnWidths","explicitWidthPx","colCount","sum","cell","equalWidth","totalWidth","w","occupiedColumnsPerRow","rowIdx","row","colIdx","occupied","colSpan","rowSpan","occSet","c","rows","cellWidth","padLeft","padRight","cellContentWidth","measureBlock","sourceRowCells","maxHeight","cellIdx","sourceCell","h","m","padTop","padBottom","sourceRow","explicitHeight","heightRule","totalHeight","cw","extractFloatingZones","zones","blockIndex","paragraphBlock","imgRun","topY","distTop","distBottom","distLeft","distRight","bottomY","leftMargin","rightMargin","x","isMarginRelative","floating","tableMeasure","tableWidth","tableHeight","floatingZones","cumulativeY","pBlock","cached","getCachedParagraphMeasure","result","measureParagraph","setCachedParagraphMeasure","imageBlock","measureBlocks","floatingZonesWithAnchors","marginRelative","z","paragraphRelative","marginByTopY","group","adjustedZones","minAnchor","zonesByAnchor","existing","anchorIndices","activeZones","blockStart","measure","blockTime","convertDocumentRunsToFlowRuns","content","runs","item","itemObj","formatting","runFormatting","ff","runContent","rc","image","size","heightPx","fieldFormatting","firstRun","val","displayRuns","childRuns","convertHeaderFooterToContent","attrs","align","blocksForMeasure","pb","inlineRuns","measures","buildFootnoteRenderItems","pageFootnoteMap","footnoteContentMap","fnLookup","fn","pageNumber","footnoteIds","items","fnId","displayNum","getFootnoteText","PagedEditorComponent","sectionProperties","headerContent","footerContent","pageGap","onDocumentChange","onReady","onRenderedDomContextReady","pluginOverlays","onHeaderFooterDoubleClick","hfEditMode","onBodyClick","hiddenPMRef","painterRef","onDocumentChangeRef","onReadyRef","onRenderedDomContextReadyRef","layout","setLayout","setBlocks","setMeasures","setIsFocused","setSelectionRects","setCaretPosition","selectedImageInfo","setSelectedImageInfo","isImageInteractingRef","buildImageSelectionInfo","el","imgTag","isDraggingRef","dragAnchorRef","isResizingColumnRef","resizeStartXRef","resizeColumnIndexRef","resizeTablePmStartRef","resizeOrigWidthsRef","resizeHandleRef","isResizingRowRef","resizeStartYRef","resizeRowIndexRef","resizeRowTablePmStartRef","resizeRowOrigHeightRef","resizeRowHandleRef","resizeRowIsEdgeRef","isResizingRightEdgeRef","resizeRightEdgeStartXRef","resizeRightEdgeColIndexRef","resizeRightEdgePmStartRef","resizeRightEdgeOrigWidthRef","resizeRightEdgeHandleRef","isCellDraggingRef","cellDragAnchorPosRef","cellDragLastPmPosRef","cellDragOverflowXRef","CELL_SELECT_OVERFLOW_PX","syncCoordinator","useMemo","pageSize","margins","painter","LayoutPainter","runLayoutPipeline","pipelineStart","currentEpoch","stepStart","pageContentHeight","newBlocks","toFlowBlocks","stepTime","newMeasures","footnoteRefs","collectFootnoteRefs","hasFootnotes","headerContentForRender","footerContentForRender","headerDistance","footerDistance","availableHeaderSpace","availableFooterSpace","headerContentHeight","footerContentHeight","effectiveMargins","newLayout","pass1Layout","layoutDocument","mapFootnotesToPages","buildFootnoteContentMap","footnoteReservedHeights","calculateFootnoteReservedHeights","pageNum","fnIds","page","p","blockLookup","footnotesByPage","renderPages","domContext","totalTime","pendingLayoutRef","scheduleLayout","rafId","pending","getCaretFromDom","overlay","pageEl","pageIndex","updateSelectionOverlay","prevSelected","selectedRanges","allCells","cellEl","htmlEl","pmStartAttr","domCaret","firstPage","pageRect","getCaretPosition","domRects","pageOffsetX","pageOffsetY","adjustedRects","selectionToRects","handleTransaction","handleSelectionChange","imgEl","getPositionFromMouse","clientY","domPos","clickToPositionDom","pageElements","clickedPageIndex","pageX","pageY","pageHit","fragmentHit","hitTestFragment","tableCellHit","hitTestTableCell","clickToPosition","findCellPosFromPmPos","$pos","d","findImageElement","IMAGE_CONTAINER_CLASSES","isImageContainer","scrollToPositionImpl","pageContainer","targetEl","handlePagesMouseDown","colIndex","widths","rowNode","idx","child","rowEl","renderedHeight","imageEl","cellPos","endPos","delta","origLeft","deltaTwips","minWidth","newLeft","newRight","origTop","minHeight","currentCellPos","tablePos","rowOffset","cellOffset","cellColIdx","colspan","handlePagesClick","anchorEl","bookmarkName","targetPos","headerEl","footerEl","offset","absStart","absEnd","paragraphStart","paragraphEnd","handleContainerFocus","handleContainerBlur","relatedTarget","handleImageResize","handleImageResizeStart","handleImageResizeEnd","handleImageDragMove","pages","contentEl","contentRect","dropX","dropY","PIXELS_TO_EMU","hOffsetEmu","vOffsetEmu","newPosition","dropPos","adjusted","handleImageDragStart","handleImageDragEnd","handleContainerMouseDown","handleEditorViewReady","handleFontsLoaded","resetCanvasContext","clearAllCaches","headerFooterEpochRef","observer","numPages","PagedEditor","FindReplaceDialog","lazy","HyperlinkDialog","TablePropertiesDialog","ImagePositionDialog","ImagePropertiesDialog","FootnotePropertiesDialog","DocxEditor","documentBuffer","initialDocument","onError","onFontsLoadedCallback","theme","showToolbar","showZoomControl","showPageNumbers","enablePageNavigation","pageNumberPosition","pageNumberVariant","_showMarginGuides","_marginGuideColor","showRuler","rulerUnit","initialZoom","toolbarExtra","placeholder","loadingIndicator","showOutlineProp","showPrintButton","_printOptions","onPrint","_onCopy","_onCut","_onPaste","tablePropsOpen","setTablePropsOpen","imagePositionOpen","setImagePositionOpen","imagePropsOpen","setImagePropsOpen","footnotePropsOpen","setFootnotePropsOpen","hfEditPosition","setHfEditPosition","showOutline","setShowOutline","showOutlineRef","outlineHeadings","setHeadingInfos","pagedEditorRef","collectHeadings","history","mgr","hfEditorRef","agentRef","lastSelectionRef","imageInputRef","editorContentRef","toolbarWrapperRef","toolbarRoRef","toolbarHeight","setToolbarHeight","historyStateRef","borderSpecRef","toolbarRefCallback","ro","getActiveEditorView","focusActiveEditor","undoActiveEditor","redoActiveEditor","findReplace","useFindReplace","hyperlinkDialog","useHyperlinkDialog","loadDocumentFonts","err","parseDocx","DocumentAgent","onFontsLoaded","handleDocumentChange","newDocument","selectionState","pmTableCtx","getTableContext","pmImageCtx","selectedNode","textFormatting","paragraphFormatting","fontFamily","textColor","numPr","listState","tableSelection","_context","cmdOrCtrl","totalCells","selectedCells","pmDeleteTable","selectedText","getSelectedText","existingLink","getHyperlinkAttrs","handleInsertTable","columns","insertTable","handleInsertPageBreak","insertPageBreak","handleInsertTOC","generateTOC","handleToggleOutline","handleHeadingInfoClick","handleInsertImageClick","handleImageFileChange","file","reader","dataUrl","img","maxWidth","rId","imageNode","handleImageWrapType","cssFloat","handleImageTransform","currentTransform","rotateMatch","rotation","hasFlipH","hasFlipV","parts","newTransform","handleApplyImagePosition","data","handleOpenImageProperties","handleApplyImageProperties","handleApplyFootnoteProperties","footnotePr","endnotePr","handleTableAction","addRowAbove","addRowBelow","addColumnLeft","addColumnRight","pmDeleteRow","pmDeleteColumn","pmSelectTable","pmSelectRow","pmSelectColumn","pmMergeCells","pmSplitCell","setAllTableBorders","setOutsideTableBorders","setInsideTableBorders","removeTableBorders","setCellBorder","setCellFillColor","setTableBorderColor","setTableBorderWidth","setCellVerticalAlign","setCellMargins","setCellTextDirection","toggleNoWrap","setRowHeight","toggleHeaderRow","distributeColumns","autoFitContents","setTableProperties","preset","currentDocForTable","docStyle","createStyleResolver","side","bs","cond","entry","borders","bs2","applyTableStyle","handleFormat","isBodyEditor","savedSelection","toggleBold","toggleItalic","toggleUnderline","toggleStrike","toggleSuperscript","toggleSubscript","toggleBulletList","toggleNumberedList","increaseListLevel","increaseIndent","decreaseListLevel","decreaseIndent","clearFormatting","setAlignment","setTextColor","highlightName","mapHexToHighlightName","setHighlight","setFontSize","pointsToHalfPoints","setFontFamily","setLineSpacing","currentDoc","styleResolver","resolved","applyStyle","handleZoomChange","handleHyperlinkSubmit","url","tooltip","empty","insertHyperlink","setHyperlink","handleHyperlinkRemove","removeHyperlink","createMarginHandler","property","marginTwips","handleLeftMarginChange","handleRightMarginChange","handleTopMarginChange","handleBottomMarginChange","handleIndentLeftChange","setIndentLeft","handleIndentRightChange","setIndentRight","handleFirstLineIndentChange","setIndentFirstLine","handleTabStopRemove","removeTabStop","handlePageNavigate","_pageNumber","buffer","handleEditorError","handleDirectPrint","pagesEl","printWindow","fontFaceRules","sheet","rule","pagesClone","findResultRef","handleFind","searchText","matches","findInDocument","scrollToMatch","handleFindNext","newIndex","match","handleFindPrevious","handleReplace","replaceText","currentMatch","executeCommand","handleReplaceAll","sortedMatches","pkg","headers","footers","header","footer","defaultRef","handleHeaderFooterDoubleClick","emptyHf","mapKey","newMap","refKey","existingRefs","newRef","handleHeaderFooterSave","map","updated","handleBodyClick","handleRemoveHeaderFooter","refs","newRefs","getHfTargetElement","mainContentStyle","editorContainerStyle","Toolbar","HorizontalRuler","_from","_to","PageNavigator","PageNumberIndicator","parentEl","Suspense","renderAsync","input","resolve","reject","React","root","createRoot","settled","element","DEFAULT_STORAGE_KEY","DEFAULT_INTERVAL","DEFAULT_MAX_AGE","DEFAULT_DEBOUNCE_DELAY","SAVE_VERSION","isLocalStorageAvailable","testKey","serializeDocument","serializable","parseSavedData","json","isStale","savedAt","maxAge","savedTime","useAutoSave","storageKey","interval","initialEnabled","onRecoveryAvailable","saveOnChange","debounceDelay","status","setStatus","lastSaveTime","setLastSaveTime","hasRecoveryData","setHasRecoveryData","isEnabled","setIsEnabled","intervalRef","debounceRef","lastSavedJsonRef","storageAvailableRef","save","serialized","savedData","dataToSave","saveTime","clearAutoSave","getRecoveryData","savedJson","acceptRecovery","recoveryData","dismissRecovery","enable","disable","formatLastSaveTime","date","diffMs","diffSec","diffMin","diffHour","getAutoSaveStatusLabel","getAutoSaveStorageSize","formatStorageSize","bytes","isAutoSaveSupported","DEFAULT_INITIAL_ZOOM","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","DEFAULT_ZOOM_STEP","ZOOM_PRESETS","clamp","min","max","roundZoom","nearestPreset","nearest","minDiff","diff","nextPreset","prevPreset","useWheelZoom","minZoom","maxZoom","zoomStep","enabled","onZoomChange","preventDefault","setZoomState","setZoom","newZoom","clampedZoom","zoomIn","zoomOut","resetZoom","zoomTo100","zoomToFit","containerWidth","fitZoom","handleWheel","getZoomPresets","findNearestZoomPreset","getNextZoomPreset","getPreviousZoomPreset","formatZoom","parseZoom","zoomString","isZoomPreset","clampZoom","useSelectionHighlight","config","DEFAULT_SELECTION_STYLE","useOverlay","debounceMs","hasSelectionState","setHasSelectionState","setSelectedText","highlightRects","setHighlightRects","isSelectionInContainer","setIsSelectionInContainer","debounceTimeoutRef","lastUpdateRef","updateSelectionState","hasActive","hasActiveSelection","inContainer","isSelectionWithin","getMergedSelectionRects","debouncedUpdate","refresh","getOverlayStyle","areSelectionStylesInjected","injectSelectionStyles","generateOverlayElements","getSelectionRuns","containerElement","runEl","getSelectedTextFromRun","extractFormattingFromElement","runRange","startInRun","endInRun","tempRange","textDecoration","fontSize","hex","rgbToHex","bgColor","rgbMatch","g","createSelectionFromDOM","startPara","findParagraphElement","endPara","startParagraphIndex","endParagraphIndex","current","useClipboard","onCopy","onCut","onPaste","cleanWordFormatting","isProcessingRef","lastPastedContentRef","copy","success","copyRuns","cut","paste","asPlainText","html","plainText","parseClipboardContent","handleCopy","runsToClipboardContent","handleCut","handlePaste","handlePasteEvent","parseClipboardHtml","ui","DEFAULT_PANEL_CONFIG","injectStyles","pluginId","css","PLUGIN_HOST_STYLES","PluginHost","editorView","setEditorView","childrenPropsRef","renderedDomContext","setRenderedDomContext","pluginStatesRef","stateVersion","setStateVersion","forceUpdate","collapsedPanels","setCollapsedPanels","collapsed","plugin","panelSizes","sizes","cleanupFns","cleanup","updatePluginStates","anyChanged","editorDom","pendingUpdate","originalDispatch","scrollToPosition","selectRange","maxPos","safeFrom","safeTo","getPluginState","setPluginState","refreshPluginStates","externalProseMirrorPlugins","pmPlugins","togglePanelCollapsed","next","panelLeftPosition","setPanelLeftPosition","calculatePanelPosition","containerOffset","pageRightInContainer","panelLeft","handleResize","overlays","pluginState","isCollapsed","Panel","leftStyle","handleRenderedDomContextReady","originalCallback","editorElement","cloneElement","pluginsByPosition","right","renderPanel"],"mappings":"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","file":"chunk-MXGYESPA.cjs","sourcesContent":["/**\n * Error Boundary Component\n *\n * Catches render errors and displays fallback UI.\n * Also provides error toast/notification system.\n */\n\nimport React, { Component, createContext, useContext, useState, useCallback, useRef } from 'react';\nimport type { ReactNode, ErrorInfo, CSSProperties } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Error severity levels\n */\nexport type ErrorSeverity = 'error' | 'warning' | 'info';\n\n/**\n * Error notification\n */\nexport interface ErrorNotification {\n id: string;\n message: string;\n severity: ErrorSeverity;\n details?: string;\n timestamp: number;\n dismissed?: boolean;\n}\n\n/**\n * Error context value\n */\nexport interface ErrorContextValue {\n /** Current notifications */\n notifications: ErrorNotification[];\n /** Show an error notification */\n showError: (message: string, details?: string) => void;\n /** Show a warning notification */\n showWarning: (message: string, details?: string) => void;\n /** Show an info notification */\n showInfo: (message: string, details?: string) => void;\n /** Dismiss a notification */\n dismissNotification: (id: string) => void;\n /** Clear all notifications */\n clearNotifications: () => void;\n}\n\n/**\n * Error boundary props\n */\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** Callback when error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Whether to show error details */\n showDetails?: boolean;\n}\n\n/**\n * Error boundary state\n */\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst ErrorContext = createContext<ErrorContextValue | null>(null);\n\n/**\n * Hook to use error notifications\n */\nexport function useErrorNotifications(): ErrorContextValue {\n const context = useContext(ErrorContext);\n if (!context) {\n throw new Error('useErrorNotifications must be used within an ErrorProvider');\n }\n return context;\n}\n\n// ============================================================================\n// ERROR PROVIDER\n// ============================================================================\n\n/**\n * Error notification provider\n */\nexport function ErrorProvider({ children }: { children: ReactNode }) {\n const [notifications, setNotifications] = useState<ErrorNotification[]>([]);\n const idCounter = useRef(0);\n\n const addNotification = useCallback(\n (message: string, severity: ErrorSeverity, details?: string) => {\n const id = `error-${++idCounter.current}-${Date.now()}`;\n const notification: ErrorNotification = {\n id,\n message,\n severity,\n details,\n timestamp: Date.now(),\n };\n\n setNotifications((prev) => [...prev, notification]);\n\n // Auto-dismiss after 5 seconds for info/warning\n if (severity !== 'error') {\n setTimeout(() => {\n dismissNotification(id);\n }, 5000);\n }\n\n return id;\n },\n []\n );\n\n const showError = useCallback(\n (message: string, details?: string) => {\n addNotification(message, 'error', details);\n },\n [addNotification]\n );\n\n const showWarning = useCallback(\n (message: string, details?: string) => {\n addNotification(message, 'warning', details);\n },\n [addNotification]\n );\n\n const showInfo = useCallback(\n (message: string, details?: string) => {\n addNotification(message, 'info', details);\n },\n [addNotification]\n );\n\n const dismissNotification = useCallback((id: string) => {\n setNotifications((prev) => prev.map((n) => (n.id === id ? { ...n, dismissed: true } : n)));\n\n // Remove from list after animation\n setTimeout(() => {\n setNotifications((prev) => prev.filter((n) => n.id !== id));\n }, 300);\n }, []);\n\n const clearNotifications = useCallback(() => {\n setNotifications([]);\n }, []);\n\n const value: ErrorContextValue = {\n notifications,\n showError,\n showWarning,\n showInfo,\n dismissNotification,\n clearNotifications,\n };\n\n return (\n <ErrorContext.Provider value={value}>\n {children}\n <NotificationContainer notifications={notifications} onDismiss={dismissNotification} />\n </ErrorContext.Provider>\n );\n}\n\n// ============================================================================\n// NOTIFICATION CONTAINER\n// ============================================================================\n\ninterface NotificationContainerProps {\n notifications: ErrorNotification[];\n onDismiss: (id: string) => void;\n}\n\nfunction NotificationContainer({ notifications, onDismiss }: NotificationContainerProps) {\n const visibleNotifications = notifications.filter((n) => !n.dismissed);\n\n if (visibleNotifications.length === 0) {\n return null;\n }\n\n const containerStyle: CSSProperties = {\n position: 'fixed',\n top: '16px',\n right: '16px',\n zIndex: 10001,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n maxWidth: '400px',\n };\n\n return (\n <div className=\"docx-notification-container\" style={containerStyle}>\n {visibleNotifications.map((notification) => (\n <NotificationToast\n key={notification.id}\n notification={notification}\n onDismiss={() => onDismiss(notification.id)}\n />\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// NOTIFICATION TOAST\n// ============================================================================\n\ninterface NotificationToastProps {\n notification: ErrorNotification;\n onDismiss: () => void;\n}\n\nfunction NotificationToast({ notification, onDismiss }: NotificationToastProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const getColors = (severity: ErrorSeverity) => {\n switch (severity) {\n case 'error':\n return {\n bg: 'var(--doc-error-bg)',\n border: '#f5c6cb',\n text: 'var(--doc-error)',\n icon: 'var(--doc-error)',\n };\n case 'warning':\n return {\n bg: 'var(--doc-warning-bg)',\n border: '#ffeeba',\n text: '#856404',\n icon: 'var(--doc-warning)',\n };\n case 'info':\n return { bg: '#e8f4fd', border: '#b8daff', text: '#0c5460', icon: 'var(--doc-primary)' };\n }\n };\n\n const colors = getColors(notification.severity);\n\n const toastStyle: CSSProperties = {\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n borderRadius: '8px',\n padding: '12px 16px',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n animation: 'slideIn 0.3s ease-out',\n };\n\n const headerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n };\n\n const iconStyle: CSSProperties = {\n color: colors.icon,\n flexShrink: 0,\n };\n\n const contentStyle: CSSProperties = {\n flex: 1,\n minWidth: 0,\n };\n\n const messageStyle: CSSProperties = {\n color: colors.text,\n fontSize: '14px',\n fontWeight: 500,\n wordBreak: 'break-word',\n };\n\n const detailsStyle: CSSProperties = {\n marginTop: '8px',\n padding: '8px',\n background: 'rgba(0, 0, 0, 0.05)',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n color: colors.text,\n maxHeight: '200px',\n overflow: 'auto',\n };\n\n const buttonStyle: CSSProperties = {\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: colors.text,\n };\n\n const getIcon = (severity: ErrorSeverity) => {\n switch (severity) {\n case 'error':\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M10 6v5M10 13v1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case 'warning':\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M10 3L18 17H2L10 3z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 8v4M10 14v1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case 'info':\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M10 9v5M10 6v1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n };\n\n return (\n <div\n className={`docx-notification-toast docx-notification-${notification.severity}`}\n style={toastStyle}\n >\n <style>\n {`\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(100%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n `}\n </style>\n <div style={headerStyle}>\n <span style={iconStyle}>{getIcon(notification.severity)}</span>\n <div style={contentStyle}>\n <div style={messageStyle}>{notification.message}</div>\n {notification.details && (\n <>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n ...buttonStyle,\n marginTop: '4px',\n fontSize: '12px',\n padding: '2px 8px',\n }}\n >\n {isExpanded ? 'Hide details' : 'Show details'}\n </button>\n {isExpanded && <div style={detailsStyle}>{notification.details}</div>}\n </>\n )}\n </div>\n <button type=\"button\" onClick={onDismiss} style={buttonStyle} title=\"Dismiss\">\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 </div>\n );\n}\n\n// ============================================================================\n// ERROR BOUNDARY\n// ============================================================================\n\n/**\n * Error Boundary class component\n *\n * Catches render errors in child components and displays fallback UI.\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.setState({ errorInfo });\n\n // Log error\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n\n // Call callback\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n resetError = (): void => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback, showDetails = true } = this.props;\n const { error, errorInfo } = this.state;\n\n // Custom fallback\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error!, this.resetError);\n }\n return fallback;\n }\n\n // Default fallback UI\n return (\n <DefaultErrorFallback\n error={error!}\n errorInfo={errorInfo}\n showDetails={showDetails}\n onReset={this.resetError}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\n// ============================================================================\n// DEFAULT ERROR FALLBACK\n// ============================================================================\n\ninterface DefaultErrorFallbackProps {\n error: Error;\n errorInfo: ErrorInfo | null;\n showDetails: boolean;\n onReset: () => void;\n}\n\nfunction DefaultErrorFallback({\n error,\n errorInfo,\n showDetails,\n onReset,\n}: DefaultErrorFallbackProps): React.ReactElement {\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '40px',\n textAlign: 'center',\n minHeight: '200px',\n background: 'white',\n borderRadius: '8px',\n border: '1px solid var(--doc-border)',\n margin: '20px',\n };\n\n const iconStyle: CSSProperties = {\n color: 'var(--doc-error)',\n marginBottom: '16px',\n };\n\n const titleStyle: CSSProperties = {\n fontSize: '18px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n marginBottom: '8px',\n };\n\n const messageStyle: CSSProperties = {\n fontSize: '14px',\n color: 'var(--doc-text-muted)',\n marginBottom: '16px',\n maxWidth: '400px',\n };\n\n const detailsStyle: CSSProperties = {\n width: '100%',\n maxWidth: '600px',\n marginBottom: '16px',\n padding: '12px',\n background: 'var(--doc-error-bg)',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: '200px',\n overflow: 'auto',\n };\n\n const buttonStyle: CSSProperties = {\n padding: '10px 20px',\n background: 'var(--doc-primary)',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n cursor: 'pointer',\n };\n\n return (\n <div className=\"docx-error-fallback\" style={containerStyle}>\n <div style={iconStyle}>\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n <circle cx=\"24\" cy=\"24\" r=\"20\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 14v12M24 30v2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </div>\n <h2 style={titleStyle}>Something went wrong</h2>\n <p style={messageStyle}>\n An error occurred while rendering this component. Please try again or contact support if the\n problem persists.\n </p>\n {showDetails && (\n <div style={detailsStyle}>\n <strong>Error:</strong> {error.message}\n {errorInfo && (\n <>\n {'\\n\\n'}\n <strong>Component Stack:</strong>\n {errorInfo.componentStack}\n </>\n )}\n </div>\n )}\n <button type=\"button\" onClick={onReset} style={buttonStyle}>\n Try Again\n </button>\n </div>\n );\n}\n\n// ============================================================================\n// PARSE ERROR DISPLAY\n// ============================================================================\n\nexport interface ParseErrorDisplayProps {\n message: string;\n details?: string;\n onRetry?: () => void;\n className?: string;\n}\n\n/**\n * Parse error display component\n *\n * Shows a helpful message for DOCX parsing errors.\n */\nexport function ParseErrorDisplay({\n message,\n details,\n onRetry,\n className = '',\n}: ParseErrorDisplayProps): React.ReactElement {\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '40px',\n textAlign: 'center',\n background: 'white',\n borderRadius: '8px',\n border: '1px solid var(--doc-border-light)',\n };\n\n const iconStyle: CSSProperties = {\n color: 'var(--doc-error)',\n marginBottom: '16px',\n };\n\n const titleStyle: CSSProperties = {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--doc-text)',\n marginBottom: '8px',\n };\n\n const messageStyle: CSSProperties = {\n fontSize: '14px',\n color: 'var(--doc-text-muted)',\n marginBottom: '16px',\n maxWidth: '400px',\n };\n\n const detailsStyle: CSSProperties = {\n marginBottom: '16px',\n padding: '12px',\n background: 'var(--doc-bg)',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n };\n\n const buttonStyle: CSSProperties = {\n padding: '8px 16px',\n background: 'var(--doc-primary)',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontSize: '13px',\n cursor: 'pointer',\n };\n\n return (\n <div className={`docx-parse-error ${className}`} style={containerStyle}>\n <div style={iconStyle}>\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\n <path d=\"M10 10h20v20H10z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path\n d=\"M25 10l-10 20M15 10l10 20\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n <h3 style={titleStyle}>Unable to Parse Document</h3>\n <p style={messageStyle}>{message}</p>\n {details && <div style={detailsStyle}>{details}</div>}\n {onRetry && (\n <button type=\"button\" onClick={onRetry} style={buttonStyle}>\n Try Again\n </button>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// UNSUPPORTED FEATURE WARNING\n// ============================================================================\n\nexport interface UnsupportedFeatureWarningProps {\n feature: string;\n description?: string;\n className?: string;\n}\n\n/**\n * Unsupported feature warning component\n *\n * Shows a non-blocking warning for unsupported features.\n */\nexport function UnsupportedFeatureWarning({\n feature,\n description,\n className = '',\n}: UnsupportedFeatureWarningProps): React.ReactElement {\n const containerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n background: 'var(--doc-warning-bg)',\n border: '1px solid #ffeeba',\n borderRadius: '4px',\n fontSize: '12px',\n color: '#856404',\n };\n\n const iconStyle: CSSProperties = {\n flexShrink: 0,\n color: 'var(--doc-warning)',\n };\n\n return (\n <div className={`docx-unsupported-warning ${className}`} style={containerStyle}>\n <span style={iconStyle}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 2l7 12H1L8 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M8 6v4M8 12v1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span>\n <strong>{feature}</strong>\n {description && `: ${description}`}\n </span>\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if an error is a parse error\n */\nexport function isParseError(error: Error): boolean {\n return (\n error.message.includes('parse') ||\n error.message.includes('Parse') ||\n error.message.includes('XML') ||\n error.message.includes('DOCX') ||\n error.message.includes('Invalid')\n );\n}\n\n/**\n * Get user-friendly error message\n */\nexport function getUserFriendlyMessage(error: Error): string {\n const message = error.message.toLowerCase();\n\n if (message.includes('network') || message.includes('fetch')) {\n return 'Network error. Please check your internet connection and try again.';\n }\n\n if (message.includes('parse') || message.includes('xml') || message.includes('invalid')) {\n return 'The document could not be parsed. It may be corrupted or in an unsupported format.';\n }\n\n if (message.includes('permission') || message.includes('access')) {\n return 'Access denied. You may not have permission to access this file.';\n }\n\n if (message.includes('not found') || message.includes('404')) {\n return 'The requested file was not found.';\n }\n\n if (message.includes('timeout')) {\n return 'The operation timed out. Please try again.';\n }\n\n return 'An unexpected error occurred. Please try again.';\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ErrorBoundary;\n","/**\n * useTableSelection Hook\n *\n * Tracks table selection state based on user clicks.\n * Provides:\n * - Current table context when clicking in a table cell\n * - Methods to handle table actions (add row, delete column, etc.)\n * - Clears selection when clicking outside tables\n */\n\nimport { useState, useCallback } from 'react';\nimport type { Document, Table } from '@eigenpal/docx-core/types/document';\nimport type { TableContext, TableSelection, TableAction } from '../components/ui/TableToolbar';\nimport {\n createTableContext,\n addRow,\n deleteRow,\n addColumn,\n deleteColumn,\n mergeCells,\n splitCell,\n getColumnCount,\n} from '../components/ui/TableToolbar';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Table selection state\n */\nexport interface TableSelectionState {\n /** Current table context (null if not in a table) */\n context: TableContext | null;\n /** The selected table */\n table: Table | null;\n /** Index of the table in the document */\n tableIndex: number | null;\n /** Row index */\n rowIndex: number | null;\n /** Column index */\n columnIndex: number | null;\n}\n\n/**\n * Return type for useTableSelection hook\n */\nexport interface UseTableSelectionReturn {\n /** Current table selection state */\n state: TableSelectionState;\n /** Handle click on a table cell */\n handleCellClick: (tableIndex: number, rowIndex: number, columnIndex: number) => void;\n /** Handle table action */\n handleAction: (action: TableAction) => void;\n /** Clear the selection */\n clearSelection: () => void;\n /** Check if a cell is selected */\n isCellSelected: (tableIndex: number, rowIndex: number, columnIndex: number) => boolean;\n /** The table context for the TableToolbar */\n tableContext: TableContext | null;\n}\n\n/**\n * Options for useTableSelection\n */\nexport interface UseTableSelectionOptions {\n /** The document being edited */\n document: Document | null;\n /** Callback when document changes */\n onChange?: (document: Document) => void;\n /** Callback when table selection changes */\n onSelectionChange?: (context: TableContext | null) => void;\n}\n\n// ============================================================================\n// DATA ATTRIBUTES\n// ============================================================================\n\n/**\n * Data attributes for table elements\n */\nexport const TABLE_DATA_ATTRIBUTES = {\n /** Attribute for table index */\n TABLE_INDEX: 'data-table-index',\n /** Attribute for row index */\n ROW_INDEX: 'data-row',\n /** Attribute for column index */\n COLUMN_INDEX: 'data-col',\n /** Attribute marking a table cell */\n TABLE_CELL: 'data-table-cell',\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Find the table element and indices from a click event target\n */\nexport function findTableFromClick(\n target: EventTarget | null,\n containerRef?: React.RefObject<HTMLElement>\n): { tableIndex: number; rowIndex: number; columnIndex: number } | null {\n if (!(target instanceof Element)) return null;\n\n // Find the cell (td or th)\n let current: Element | null = target;\n while (current && current !== containerRef?.current) {\n if (current.tagName === 'TD' || current.tagName === 'TH') {\n const rowAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.ROW_INDEX);\n const colAttr = current.getAttribute(TABLE_DATA_ATTRIBUTES.COLUMN_INDEX);\n\n if (rowAttr !== null && colAttr !== null) {\n // Find the parent table\n let tableElement: Element | null = current;\n while (tableElement && tableElement !== containerRef?.current) {\n if (tableElement.tagName === 'TABLE') {\n const tableIndexAttr = tableElement.getAttribute(TABLE_DATA_ATTRIBUTES.TABLE_INDEX);\n if (tableIndexAttr !== null) {\n return {\n tableIndex: parseInt(tableIndexAttr, 10),\n rowIndex: parseInt(rowAttr, 10),\n columnIndex: parseInt(colAttr, 10),\n };\n }\n break;\n }\n tableElement = tableElement.parentElement;\n }\n }\n break;\n }\n current = current.parentElement;\n }\n\n return null;\n}\n\n/**\n * Get a table from the document by index\n */\nexport function getTableFromDocument(doc: Document, tableIndex: number): Table | null {\n if (!doc.package?.document?.content) return null;\n\n let currentTableIndex = 0;\n for (const block of doc.package.document.content) {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n return block;\n }\n currentTableIndex++;\n }\n }\n\n return null;\n}\n\n/**\n * Update a table in the document\n */\nexport function updateTableInDocument(\n doc: Document,\n tableIndex: number,\n newTable: Table\n): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.map((block) => {\n if (block.type === 'table') {\n if (currentTableIndex === tableIndex) {\n currentTableIndex++;\n return newTable;\n }\n currentTableIndex++;\n }\n return block;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n/**\n * Delete a table from the document\n */\nexport function deleteTableFromDocument(doc: Document, tableIndex: number): Document {\n if (!doc.package?.document?.content) return doc;\n\n let currentTableIndex = 0;\n const newContent = doc.package.document.content.filter((block) => {\n if (block.type === 'table') {\n const shouldDelete = currentTableIndex === tableIndex;\n currentTableIndex++;\n return !shouldDelete;\n }\n return true;\n });\n\n return {\n ...doc,\n package: {\n ...doc.package,\n document: {\n ...doc.package.document,\n content: newContent,\n },\n },\n };\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * Hook for tracking and managing table selection\n */\nexport function useTableSelection({\n document: doc,\n onChange,\n onSelectionChange,\n}: UseTableSelectionOptions): UseTableSelectionReturn {\n // State\n const [state, setState] = useState<TableSelectionState>({\n context: null,\n table: null,\n tableIndex: null,\n rowIndex: null,\n columnIndex: null,\n });\n\n /**\n * Handle click on a table cell\n */\n const handleCellClick = useCallback(\n (tableIndex: number, rowIndex: number, columnIndex: number) => {\n if (!doc) return;\n\n const table = getTableFromDocument(doc, tableIndex);\n if (!table) {\n setState({\n context: null,\n table: null,\n tableIndex: null,\n rowIndex: null,\n columnIndex: null,\n });\n return;\n }\n\n const selection: TableSelection = {\n tableIndex,\n rowIndex,\n columnIndex,\n };\n\n const context = createTableContext(table, selection);\n\n setState({\n context,\n table,\n tableIndex,\n rowIndex,\n columnIndex,\n });\n\n onSelectionChange?.(context);\n },\n [doc, onSelectionChange]\n );\n\n /**\n * Clear the selection\n */\n const clearSelection = useCallback(() => {\n setState({\n context: null,\n table: null,\n tableIndex: null,\n rowIndex: null,\n columnIndex: null,\n });\n onSelectionChange?.(null);\n }, [onSelectionChange]);\n\n /**\n * Handle table action\n */\n const handleAction = useCallback(\n (action: TableAction) => {\n if (\n !doc ||\n !state.context ||\n state.tableIndex === null ||\n state.rowIndex === null ||\n state.columnIndex === null\n ) {\n return;\n }\n\n const table = state.table;\n if (!table) return;\n\n let newTable: Table | null = null;\n let newDoc: Document | null = null;\n let newRowIndex = state.rowIndex;\n let newColumnIndex = state.columnIndex;\n\n switch (action) {\n case 'addRowAbove':\n newTable = addRow(table, state.rowIndex, 'before');\n // Adjust row index since we added above\n newRowIndex = state.rowIndex + 1;\n break;\n\n case 'addRowBelow':\n newTable = addRow(table, state.rowIndex, 'after');\n break;\n\n case 'addColumnLeft':\n newTable = addColumn(table, state.columnIndex, 'before');\n // Adjust column index since we added to the left\n newColumnIndex = state.columnIndex + 1;\n break;\n\n case 'addColumnRight':\n newTable = addColumn(table, state.columnIndex, 'after');\n break;\n\n case 'deleteRow':\n if (table.rows.length > 1) {\n newTable = deleteRow(table, state.rowIndex);\n // Adjust row index if we deleted the last row\n if (newRowIndex >= newTable.rows.length) {\n newRowIndex = newTable.rows.length - 1;\n }\n }\n break;\n\n case 'deleteColumn': {\n const colCount = getColumnCount(table);\n if (colCount > 1) {\n newTable = deleteColumn(table, state.columnIndex);\n // Adjust column index if we deleted the last column\n const newColCount = getColumnCount(newTable);\n if (newColumnIndex >= newColCount) {\n newColumnIndex = newColCount - 1;\n }\n }\n break;\n }\n\n case 'mergeCells':\n if (state.context.selection.selectedCells) {\n newTable = mergeCells(table, state.context.selection);\n }\n break;\n\n case 'splitCell':\n if (state.context.canSplitCell) {\n newTable = splitCell(table, state.rowIndex, state.columnIndex);\n }\n break;\n\n case 'deleteTable':\n newDoc = deleteTableFromDocument(doc, state.tableIndex);\n clearSelection();\n onChange?.(newDoc);\n return;\n }\n\n if (newTable) {\n newDoc = updateTableInDocument(doc, state.tableIndex, newTable);\n onChange?.(newDoc);\n\n // Update selection with new position\n if (newDoc) {\n handleCellClick(state.tableIndex, newRowIndex, newColumnIndex);\n }\n }\n },\n [doc, state, onChange, clearSelection, handleCellClick]\n );\n\n /**\n * Check if a cell is selected\n */\n const isCellSelected = useCallback(\n (tableIndex: number, rowIndex: number, columnIndex: number): boolean => {\n return (\n state.tableIndex === tableIndex &&\n state.rowIndex === rowIndex &&\n state.columnIndex === columnIndex\n );\n },\n [state]\n );\n\n return {\n state,\n handleCellClick,\n handleAction,\n clearSelection,\n isCellSelected,\n tableContext: state.context,\n };\n}\n\nexport default useTableSelection;\n","import React, { useEffect, useState } from 'react';\nimport type { HeadingInfo } from '@eigenpal/docx-core/utils/headingCollector';\nimport { MaterialSymbol } from './ui/Icons';\n\n/** @deprecated Use HeadingInfo from utils/headingCollector instead */\nexport type OutlineHeading = HeadingInfo;\n\ninterface DocumentOutlineProps {\n headings: HeadingInfo[];\n onHeadingClick: (pmPos: number) => void;\n onClose: () => void;\n topOffset?: number;\n}\n\nexport const DocumentOutline: React.FC<DocumentOutlineProps> = ({\n headings,\n onHeadingClick,\n onClose,\n topOffset = 0,\n}) => {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n // Trigger slide-in on next frame\n requestAnimationFrame(() => setOpen(true));\n }, []);\n\n return (\n <nav\n className=\"docx-outline-nav\"\n role=\"navigation\"\n aria-label=\"Document outline\"\n style={{\n position: 'absolute',\n top: topOffset,\n left: 30,\n bottom: 0,\n width: 240,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n fontFamily: \"'Google Sans', Roboto, Arial, sans-serif\",\n zIndex: 40,\n // Slide-in animation\n transform: open ? 'translateX(0)' : 'translateX(-270px)',\n transition: 'transform 0.15s ease-out',\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Header — back arrow + title */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '16px 16px 12px',\n }}\n >\n <button\n onClick={onClose}\n aria-label=\"Close outline\"\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 4,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n color: '#444746',\n }}\n title=\"Close outline\"\n >\n <MaterialSymbol name=\"arrow_back\" size={20} />\n </button>\n <span style={{ fontWeight: 400, fontSize: 14, color: '#1f1f1f', letterSpacing: '0.01em' }}>\n Outline\n </span>\n </div>\n\n {/* Heading list */}\n <div style={{ overflowY: 'auto', flex: 1, paddingLeft: 20 }}>\n {headings.length === 0 ? (\n <div style={{ padding: '8px 16px', color: '#80868b', fontSize: 13, lineHeight: '20px' }}>\n No headings found. Add headings to your document to see them here.\n </div>\n ) : (\n headings.map((heading, index) => (\n <div\n key={`${heading.pmPos}-${index}`}\n style={{\n marginLeft: heading.level * 12,\n }}\n >\n <button\n className=\"docx-outline-heading-btn\"\n onClick={() => onHeadingClick(heading.pmPos)}\n style={{\n display: 'block',\n width: '100%',\n textAlign: 'left',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '5px 12px',\n fontSize: 13,\n fontWeight: 400,\n color: '#1f1f1f',\n lineHeight: '18px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n borderRadius: 0,\n letterSpacing: '0.01em',\n }}\n title={heading.text}\n >\n {heading.text}\n </button>\n </div>\n ))\n )}\n </div>\n </nav>\n );\n};\n","/**\n * VerticalRuler Component\n *\n * A vertical ruler that displays alongside the document with:\n * - Page height scale with tick marks\n * - Top and bottom margin indicators\n * - Optional dragging to adjust margins\n * - Support for zoom levels\n *\n * Similar to Google Docs' vertical ruler.\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { SectionProperties } from '@eigenpal/docx-core/types/document';\nimport { twipsToPixels, pixelsToTwips, formatPx } from '@eigenpal/docx-core/utils/units';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface VerticalRulerProps {\n /** Section properties for page layout */\n sectionProps?: SectionProperties | null;\n /** Zoom level (1.0 = 100%) */\n zoom?: number;\n /** Whether margins can be dragged to adjust */\n editable?: boolean;\n /** Callback when top margin changes (in twips) */\n onTopMarginChange?: (marginTwips: number) => void;\n /** Callback when bottom margin changes (in twips) */\n onBottomMarginChange?: (marginTwips: number) => void;\n /** Unit to display (inches or cm) */\n unit?: 'inch' | 'cm';\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\ntype MarkerType = 'topMargin' | 'bottomMargin';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_PAGE_HEIGHT_TWIPS = 15840; // 11 inches\nconst DEFAULT_MARGIN_TWIPS = 1440; // 1 inch\nconst TWIPS_PER_INCH = 1440;\nconst TWIPS_PER_CM = 567;\n\n// Ruler styling - Google Docs style\nconst RULER_WIDTH = 20;\nconst RULER_TEXT_COLOR = 'var(--doc-text-muted)';\nconst RULER_TICK_COLOR = 'var(--doc-text-subtle)';\nconst MARKER_COLOR = 'var(--doc-primary)';\nconst MARKER_HOVER_COLOR = 'var(--doc-primary)';\nconst MARKER_ACTIVE_COLOR = 'var(--doc-primary-hover)';\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function VerticalRuler({\n sectionProps,\n zoom = 1,\n editable = false,\n onTopMarginChange,\n onBottomMarginChange,\n unit = 'inch',\n className = '',\n style,\n}: VerticalRulerProps): React.ReactElement {\n const [dragging, setDragging] = useState<MarkerType | null>(null);\n const [hoveredMarker, setHoveredMarker] = useState<MarkerType | null>(null);\n const rulerRef = useRef<HTMLDivElement>(null);\n\n // Get page dimensions\n const pageHeightTwips = sectionProps?.pageHeight ?? DEFAULT_PAGE_HEIGHT_TWIPS;\n const topMarginTwips = sectionProps?.marginTop ?? DEFAULT_MARGIN_TWIPS;\n const bottomMarginTwips = sectionProps?.marginBottom ?? DEFAULT_MARGIN_TWIPS;\n\n // Convert to pixels with zoom\n const pageHeightPx = twipsToPixels(pageHeightTwips) * zoom;\n const topMarginPx = twipsToPixels(topMarginTwips) * zoom;\n const bottomMarginPx = twipsToPixels(bottomMarginTwips) * zoom;\n\n // Handle drag start\n const handleDragStart = useCallback(\n (e: React.MouseEvent, marker: MarkerType) => {\n if (!editable) return;\n e.preventDefault();\n setDragging(marker);\n },\n [editable]\n );\n\n // Handle drag\n const handleDrag = useCallback(\n (e: MouseEvent) => {\n if (!dragging || !rulerRef.current) return;\n\n const rect = rulerRef.current.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n const positionTwips = pixelsToTwips(y / zoom);\n\n if (dragging === 'topMargin') {\n const maxMargin = pageHeightTwips - bottomMarginTwips - 720;\n const newMargin = Math.max(0, Math.min(positionTwips, maxMargin));\n onTopMarginChange?.(Math.round(newMargin));\n } else if (dragging === 'bottomMargin') {\n const fromBottom = pageHeightTwips - positionTwips;\n const maxMargin = pageHeightTwips - topMarginTwips - 720;\n const newMargin = Math.max(0, Math.min(fromBottom, maxMargin));\n onBottomMarginChange?.(Math.round(newMargin));\n }\n },\n [\n dragging,\n zoom,\n pageHeightTwips,\n topMarginTwips,\n bottomMarginTwips,\n onTopMarginChange,\n onBottomMarginChange,\n ]\n );\n\n // Handle drag end\n const handleDragEnd = useCallback(() => {\n setDragging(null);\n }, []);\n\n // Add/remove document event listeners\n useEffect(() => {\n if (dragging) {\n document.addEventListener('mousemove', handleDrag);\n document.addEventListener('mouseup', handleDragEnd);\n return () => {\n document.removeEventListener('mousemove', handleDrag);\n document.removeEventListener('mouseup', handleDragEnd);\n };\n }\n }, [dragging, handleDrag, handleDragEnd]);\n\n // Generate tick marks\n const ticks = generateVerticalTicks(pageHeightTwips, zoom, unit);\n\n const rulerStyle: CSSProperties = {\n position: 'relative',\n width: RULER_WIDTH,\n height: formatPx(pageHeightPx),\n backgroundColor: 'transparent',\n overflow: 'visible',\n userSelect: 'none',\n cursor: dragging ? 'ns-resize' : 'default',\n ...style,\n };\n\n return (\n <div\n ref={rulerRef}\n className={`docx-vertical-ruler ${className}`}\n style={rulerStyle}\n role=\"slider\"\n aria-label=\"Vertical ruler\"\n aria-orientation=\"vertical\"\n >\n {/* Tick marks */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n }}\n >\n {ticks.map((tick, index) => (\n <VerticalTick key={index} tick={tick} />\n ))}\n </div>\n\n {/* Top margin marker */}\n <VerticalMarginMarker\n type=\"topMargin\"\n position={topMarginPx}\n editable={editable}\n isDragging={dragging === 'topMargin'}\n isHovered={hoveredMarker === 'topMargin'}\n onMouseEnter={() => setHoveredMarker('topMargin')}\n onMouseLeave={() => setHoveredMarker(null)}\n onMouseDown={(e) => handleDragStart(e, 'topMargin')}\n />\n\n {/* Bottom margin marker */}\n <VerticalMarginMarker\n type=\"bottomMargin\"\n position={pageHeightPx - bottomMarginPx}\n editable={editable}\n isDragging={dragging === 'bottomMargin'}\n isHovered={hoveredMarker === 'bottomMargin'}\n onMouseEnter={() => setHoveredMarker('bottomMargin')}\n onMouseLeave={() => setHoveredMarker(null)}\n onMouseDown={(e) => handleDragStart(e, 'bottomMargin')}\n />\n </div>\n );\n}\n\n// ============================================================================\n// SUB-COMPONENTS\n// ============================================================================\n\ninterface VerticalTickData {\n position: number;\n width: number;\n label?: string;\n}\n\nfunction VerticalTick({ tick }: { tick: VerticalTickData }): React.ReactElement {\n const tickStyle: CSSProperties = {\n position: 'absolute',\n top: formatPx(tick.position),\n right: 0,\n height: 1,\n width: tick.width,\n backgroundColor: RULER_TICK_COLOR,\n };\n\n const labelStyle: CSSProperties = {\n position: 'absolute',\n top: formatPx(tick.position),\n left: 2,\n transform: 'translateY(-50%)',\n fontSize: '9px',\n color: RULER_TEXT_COLOR,\n fontFamily: 'sans-serif',\n whiteSpace: 'nowrap',\n };\n\n return (\n <>\n <div style={tickStyle} />\n {tick.label && <div style={labelStyle}>{tick.label}</div>}\n </>\n );\n}\n\ninterface VerticalMarginMarkerProps {\n type: 'topMargin' | 'bottomMargin';\n position: number;\n editable: boolean;\n isDragging: boolean;\n isHovered: boolean;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n onMouseDown: (e: React.MouseEvent) => void;\n}\n\nfunction VerticalMarginMarker({\n type,\n position,\n editable,\n isDragging,\n isHovered,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n}: VerticalMarginMarkerProps): React.ReactElement {\n const color = isDragging ? MARKER_ACTIVE_COLOR : isHovered ? MARKER_HOVER_COLOR : MARKER_COLOR;\n\n const markerStyle: CSSProperties = {\n position: 'absolute',\n top: formatPx(position - 5),\n right: 0,\n width: RULER_WIDTH,\n height: 10,\n cursor: editable ? 'ns-resize' : 'default',\n zIndex: isDragging ? 10 : 1,\n };\n\n // Triangle pointing left (for top) or right (for bottom)\n const triangleStyle: CSSProperties = {\n position: 'absolute',\n top: 0,\n right: 2,\n width: 0,\n height: 0,\n borderTop: '5px solid transparent',\n borderBottom: '5px solid transparent',\n borderRight: `8px solid ${color}`,\n transition: 'border-right-color 0.1s',\n };\n\n return (\n <div\n className={`docx-ruler-marker docx-ruler-marker-${type}`}\n style={markerStyle}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n role=\"slider\"\n aria-label={type === 'topMargin' ? 'Top margin' : 'Bottom margin'}\n aria-orientation=\"vertical\"\n tabIndex={editable ? 0 : -1}\n >\n <div style={triangleStyle} />\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\nfunction generateVerticalTicks(\n pageHeightTwips: number,\n zoom: number,\n unit: 'inch' | 'cm'\n): VerticalTickData[] {\n const ticks: VerticalTickData[] = [];\n\n if (unit === 'inch') {\n const eighthInchTwips = TWIPS_PER_INCH / 8;\n const totalEighths = Math.ceil(pageHeightTwips / eighthInchTwips);\n\n for (let i = 0; i <= totalEighths; i++) {\n const twipsPos = i * eighthInchTwips;\n if (twipsPos > pageHeightTwips) break;\n\n const pxPos = twipsToPixels(twipsPos) * zoom;\n\n if (i % 8 === 0) {\n const inches = i / 8;\n ticks.push({\n position: pxPos,\n width: 10,\n label: inches > 0 ? String(inches) : undefined,\n });\n } else if (i % 4 === 0) {\n ticks.push({ position: pxPos, width: 6 });\n } else if (i % 2 === 0) {\n ticks.push({ position: pxPos, width: 4 });\n } else {\n ticks.push({ position: pxPos, width: 2 });\n }\n }\n } else {\n const mmTwips = TWIPS_PER_CM / 10;\n const totalMm = Math.ceil(pageHeightTwips / mmTwips);\n\n for (let i = 0; i <= totalMm; i++) {\n const twipsPos = i * mmTwips;\n if (twipsPos > pageHeightTwips) break;\n\n const pxPos = twipsToPixels(twipsPos) * zoom;\n\n if (i % 10 === 0) {\n const cm = i / 10;\n ticks.push({\n position: pxPos,\n width: 10,\n label: cm > 0 ? String(cm) : undefined,\n });\n } else if (i % 5 === 0) {\n ticks.push({ position: pxPos, width: 6 });\n } else {\n ticks.push({ position: pxPos, width: 3 });\n }\n }\n }\n\n return ticks;\n}\n\nexport default VerticalRuler;\n","/**\n * InlineHeaderFooterEditor — inline overlay editor for header/footer content\n *\n * Renders a ProseMirror EditorView positioned over the header/footer area\n * on the page, Google Docs style. The main body is dimmed and the toolbar\n * routes formatting commands to this editor while it's active.\n */\n\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useState,\n useImperativeHandle,\n useLayoutEffect,\n forwardRef,\n} from 'react';\nimport type { CSSProperties } from 'react';\nimport { EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\n\nimport { schema } from '@eigenpal/docx-core/prosemirror/schema';\nimport { headerFooterToProseDoc } from '@eigenpal/docx-core/prosemirror/conversion/toProseDoc';\nimport { proseDocToBlocks } from '@eigenpal/docx-core/prosemirror/conversion/fromProseDoc';\nimport { extractSelectionState, type SelectionState } from '@eigenpal/docx-core/prosemirror';\nimport { createStarterKit } from '@eigenpal/docx-core/prosemirror/extensions/StarterKit';\nimport { ExtensionManager } from '@eigenpal/docx-core/prosemirror/extensions/ExtensionManager';\nimport type { HeaderFooter, Paragraph, Table, StyleDefinitions } from '@eigenpal/docx-core/types/document';\n\nimport 'prosemirror-view/style/prosemirror.css';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface InlineHeaderFooterEditorProps {\n /** The header or footer being edited */\n headerFooter: HeaderFooter;\n /** Whether editing header or footer */\n position: 'header' | 'footer';\n /** Document styles for style resolution */\n styles?: StyleDefinitions | null;\n /** The DOM element to overlay (the .layout-page-header / .layout-page-footer) */\n targetElement: HTMLElement;\n /** The positioning parent element (the div wrapping PagedEditor) */\n parentElement: HTMLElement;\n /** Callback when editing is complete — receives updated content blocks */\n onSave: (content: Array<Paragraph | Table>) => void;\n /** Callback when editing is cancelled */\n onClose: () => void;\n /** Callback when selection changes in the HF editor (for toolbar sync) */\n onSelectionChange?: (state: SelectionState | null) => void;\n /** Callback to remove the header/footer entirely */\n onRemove?: () => void;\n}\n\nexport interface InlineHeaderFooterEditorRef {\n /** Get the ProseMirror EditorView */\n getView(): EditorView | null;\n /** Focus the editor */\n focus(): void;\n /** Undo */\n undo(): boolean;\n /** Redo */\n redo(): boolean;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst separatorBarStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '2px 0',\n fontSize: 11,\n color: '#4285f4',\n userSelect: 'none',\n};\n\nconst labelStyle: CSSProperties = {\n fontWeight: 500,\n letterSpacing: 0.3,\n};\n\nconst optionsButtonStyle: CSSProperties = {\n background: 'none',\n border: 'none',\n color: '#4285f4',\n cursor: 'pointer',\n fontSize: 11,\n padding: '2px 6px',\n borderRadius: 3,\n};\n\nconst dropdownStyle: CSSProperties = {\n position: 'absolute',\n right: 0,\n top: '100%',\n background: 'white',\n border: '1px solid #dadce0',\n borderRadius: 4,\n boxShadow: '0 2px 6px rgba(0,0,0,0.15)',\n zIndex: 100,\n minWidth: 160,\n padding: '4px 0',\n};\n\nconst dropdownItemStyle: CSSProperties = {\n display: 'block',\n width: '100%',\n padding: '6px 12px',\n border: 'none',\n background: 'none',\n textAlign: 'left',\n cursor: 'pointer',\n fontSize: 12,\n color: '#3c4043',\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport const InlineHeaderFooterEditor = forwardRef<\n InlineHeaderFooterEditorRef,\n InlineHeaderFooterEditorProps\n>(function InlineHeaderFooterEditor(\n {\n headerFooter,\n position,\n styles,\n targetElement,\n parentElement,\n onSave,\n onClose,\n onSelectionChange,\n onRemove,\n },\n ref\n) {\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const [isDirty, setIsDirty] = useState(false);\n const [showOptions, setShowOptions] = useState(false);\n const optionsRef = useRef<HTMLDivElement>(null);\n\n // Compute overlay position relative to the parent element\n const [overlayPos, setOverlayPos] = useState<{\n top: number;\n left: number;\n width: number;\n } | null>(null);\n\n useLayoutEffect(() => {\n const computePosition = () => {\n const parentRect = parentElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n setOverlayPos({\n top: targetRect.top - parentRect.top + parentElement.scrollTop,\n left: targetRect.left - parentRect.left + parentElement.scrollLeft,\n width: targetRect.width,\n });\n };\n computePosition();\n\n // Recompute on scroll/resize\n const scrollParent = parentElement.closest('[style*=\"overflow\"]') || parentElement;\n scrollParent.addEventListener('scroll', computePosition);\n window.addEventListener('resize', computePosition);\n return () => {\n scrollParent.removeEventListener('scroll', computePosition);\n window.removeEventListener('resize', computePosition);\n };\n }, [targetElement, parentElement]);\n\n // Create ProseMirror editor when the container is available\n // (overlayPos starts null → first render returns null → container ref not set)\n useEffect(() => {\n if (!editorContainerRef.current || viewRef.current) return;\n\n // Convert header/footer content to PM document\n const pmDoc = headerFooterToProseDoc(headerFooter.content, {\n styles: styles || undefined,\n });\n\n // Create a fresh ExtensionManager to get independent plugin instances\n // (keyed plugins like history$ can't be shared across EditorViews)\n const hfMgr = new ExtensionManager(createStarterKit());\n hfMgr.buildSchema();\n hfMgr.initializeRuntime();\n const plugins = hfMgr.getPlugins();\n\n const state = EditorState.create({\n doc: pmDoc,\n schema,\n plugins,\n });\n\n const view = new EditorView(editorContainerRef.current, {\n state,\n dispatchTransaction(tr) {\n const newState = view.state.apply(tr);\n view.updateState(newState);\n if (tr.docChanged) {\n setIsDirty(true);\n }\n // Report selection changes for toolbar sync\n if (tr.selectionSet || tr.docChanged) {\n const selState = extractSelectionState(newState);\n onSelectionChange?.(selState);\n }\n },\n });\n\n viewRef.current = view;\n\n // Auto-focus\n requestAnimationFrame(() => {\n view.focus();\n // Report initial selection state\n const selState = extractSelectionState(view.state);\n onSelectionChange?.(selState);\n });\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [overlayPos]); // Re-run when position is computed (container becomes available)\n\n // Save current content\n const handleSave = useCallback(() => {\n if (!viewRef.current) return;\n const blocks = proseDocToBlocks(viewRef.current.state.doc);\n onSave(blocks);\n }, [onSave]);\n\n // Save + close\n const handleSaveAndClose = useCallback(() => {\n if (isDirty) {\n handleSave();\n } else {\n onClose();\n }\n }, [isDirty, handleSave, onClose]);\n\n // Handle Escape key — save + close\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n handleSaveAndClose();\n }\n }\n document.addEventListener('keydown', handleKeyDown, true);\n return () => document.removeEventListener('keydown', handleKeyDown, true);\n }, [handleSaveAndClose]);\n\n // Close options dropdown when clicking outside\n useEffect(() => {\n if (!showOptions) return;\n function handleClick(e: MouseEvent) {\n if (optionsRef.current && !optionsRef.current.contains(e.target as Node)) {\n setShowOptions(false);\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [showOptions]);\n\n // Expose ref\n useImperativeHandle(ref, () => ({\n getView: () => viewRef.current,\n focus: () => viewRef.current?.focus(),\n undo: () => {\n const view = viewRef.current;\n if (!view) return false;\n return undo(view.state, view.dispatch);\n },\n redo: () => {\n const view = viewRef.current;\n if (!view) return false;\n return redo(view.state, view.dispatch);\n },\n }));\n\n const label = position === 'header' ? 'Header' : 'Footer';\n\n if (!overlayPos) return null;\n\n const containerStyle: CSSProperties = {\n position: 'absolute',\n top: overlayPos.top,\n left: overlayPos.left,\n width: overlayPos.width,\n zIndex: 10,\n };\n\n return (\n <div\n className=\"hf-inline-editor\"\n style={containerStyle}\n onMouseDown={(e) => {\n // Prevent clicks from bubbling to pages container / body click handler\n e.stopPropagation();\n }}\n >\n {/* Separator bar — shown below for header, above for footer */}\n {position === 'footer' && (\n <div className=\"hf-separator-bar\" style={separatorBarStyle}>\n <span style={labelStyle}>{label}</span>\n <OptionsMenu\n label={label}\n showOptions={showOptions}\n setShowOptions={setShowOptions}\n optionsRef={optionsRef}\n onRemove={onRemove}\n onClose={handleSaveAndClose}\n viewRef={viewRef}\n />\n </div>\n )}\n\n {/* ProseMirror editor area */}\n <div\n ref={editorContainerRef}\n className=\"hf-editor-pm\"\n style={{\n minHeight: 40,\n outline: 'none',\n }}\n />\n\n {/* Separator bar — shown below for header */}\n {position === 'header' && (\n <div className=\"hf-separator-bar\" style={separatorBarStyle}>\n <span style={labelStyle}>{label}</span>\n <OptionsMenu\n label={label}\n showOptions={showOptions}\n setShowOptions={setShowOptions}\n optionsRef={optionsRef}\n onRemove={onRemove}\n onClose={handleSaveAndClose}\n viewRef={viewRef}\n />\n </div>\n )}\n </div>\n );\n});\n\n// ============================================================================\n// OPTIONS MENU SUB-COMPONENT\n// ============================================================================\n\nfunction OptionsMenu({\n label,\n showOptions,\n setShowOptions,\n optionsRef,\n onRemove,\n onClose,\n viewRef,\n}: {\n label: string;\n showOptions: boolean;\n setShowOptions: (v: boolean | ((prev: boolean) => boolean)) => void;\n optionsRef: React.RefObject<HTMLDivElement | null>;\n onRemove?: () => void;\n onClose: () => void;\n viewRef: React.RefObject<EditorView | null>;\n}) {\n const insertField = (fieldType: 'PAGE' | 'NUMPAGES') => {\n const view = viewRef.current;\n if (!view) return;\n // Get marks at the current cursor position so the field inherits surrounding styling\n const { $from, from } = view.state.selection;\n const marks = view.state.storedMarks || $from.marks();\n const node = schema.nodes.field.create({\n fieldType,\n instruction: ` ${fieldType} \\\\* MERGEFORMAT `,\n fieldKind: 'simple',\n dirty: true,\n });\n const tr = view.state.tr.insert(from, node.mark(marks));\n view.dispatch(tr);\n view.focus();\n };\n\n return (\n <div style={{ position: 'relative' }} ref={optionsRef}>\n <button\n type=\"button\"\n style={optionsButtonStyle}\n onClick={(e) => {\n e.stopPropagation();\n setShowOptions((prev) => !prev);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n Options ▾\n </button>\n {showOptions && (\n <div style={dropdownStyle}>\n <button\n type=\"button\"\n style={dropdownItemStyle}\n onClick={() => {\n setShowOptions(false);\n insertField('PAGE');\n }}\n onMouseOver={(e) => {\n (e.target as HTMLElement).style.backgroundColor = '#f1f3f4';\n }}\n onMouseOut={(e) => {\n (e.target as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n Insert current page number\n </button>\n <button\n type=\"button\"\n style={dropdownItemStyle}\n onClick={() => {\n setShowOptions(false);\n insertField('NUMPAGES');\n }}\n onMouseOver={(e) => {\n (e.target as HTMLElement).style.backgroundColor = '#f1f3f4';\n }}\n onMouseOut={(e) => {\n (e.target as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n Insert total page count\n </button>\n <div style={{ borderTop: '1px solid #e8eaed', margin: '4px 0' }} />\n {onRemove && (\n <button\n type=\"button\"\n style={dropdownItemStyle}\n onClick={() => {\n setShowOptions(false);\n onRemove();\n }}\n onMouseOver={(e) => {\n (e.target as HTMLElement).style.backgroundColor = '#f1f3f4';\n }}\n onMouseOut={(e) => {\n (e.target as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n Remove {label.toLowerCase()}\n </button>\n )}\n <button\n type=\"button\"\n style={dropdownItemStyle}\n onClick={() => {\n setShowOptions(false);\n onClose();\n }}\n onMouseOver={(e) => {\n (e.target as HTMLElement).style.backgroundColor = '#f1f3f4';\n }}\n onMouseOut={(e) => {\n (e.target as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n Close {label.toLowerCase()} editing\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Table Style Gallery\n *\n * Visual gallery of predefined table styles. Each style shows a small\n * preview grid with the styling applied. Clicking a style applies it\n * to the current table via applyTableStyle command.\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { Style } from '@eigenpal/docx-core/types/document';\nimport type { TableAction } from './TableToolbar';\nimport { MaterialSymbol } from './MaterialSymbol';\n\n// ============================================================================\n// PREDEFINED TABLE STYLES\n// ============================================================================\n\nexport interface TableStylePreset {\n id: string;\n name: string;\n /** Table-level borders */\n tableBorders?: {\n top?: { style: string; size?: number; color?: { rgb: string } };\n bottom?: { style: string; size?: number; color?: { rgb: string } };\n left?: { style: string; size?: number; color?: { rgb: string } };\n right?: { style: string; size?: number; color?: { rgb: string } };\n insideH?: { style: string; size?: number; color?: { rgb: string } };\n insideV?: { style: string; size?: number; color?: { rgb: string } };\n };\n /** Conditional formatting per cell position */\n conditionals?: Record<\n string,\n {\n backgroundColor?: string;\n borders?: {\n top?: { style: string; size?: number; color?: { rgb: string } } | null;\n bottom?: { style: string; size?: number; color?: { rgb: string } } | null;\n left?: { style: string; size?: number; color?: { rgb: string } } | null;\n right?: { style: string; size?: number; color?: { rgb: string } } | null;\n };\n bold?: boolean;\n color?: string;\n }\n >;\n /** Which conditional formatting is active by default */\n look?: {\n firstRow?: boolean;\n lastRow?: boolean;\n firstCol?: boolean;\n lastCol?: boolean;\n noHBand?: boolean;\n noVBand?: boolean;\n };\n}\n\nconst border1 = (rgb: string) => ({ style: 'single' as const, size: 4, color: { rgb } });\n\n/**\n * Built-in table style presets (matching common Word styles)\n */\nconst BUILTIN_STYLES: TableStylePreset[] = [\n {\n id: 'TableNormal',\n name: 'Normal Table',\n look: { firstRow: false, lastRow: false, noHBand: true, noVBand: true },\n },\n {\n id: 'TableGrid',\n name: 'Table Grid',\n tableBorders: {\n top: border1('000000'),\n bottom: border1('000000'),\n left: border1('000000'),\n right: border1('000000'),\n insideH: border1('000000'),\n insideV: border1('000000'),\n },\n look: { firstRow: false, lastRow: false, noHBand: true, noVBand: true },\n },\n {\n id: 'TableGridLight',\n name: 'Grid Table Light',\n tableBorders: {\n top: border1('BFBFBF'),\n bottom: border1('BFBFBF'),\n left: border1('BFBFBF'),\n right: border1('BFBFBF'),\n insideH: border1('BFBFBF'),\n insideV: border1('BFBFBF'),\n },\n look: { firstRow: true, lastRow: false, noHBand: true, noVBand: true },\n conditionals: {\n firstRow: { bold: true, borders: { bottom: border1('000000') } },\n },\n },\n {\n id: 'PlainTable1',\n name: 'Plain Table 1',\n tableBorders: {\n top: border1('BFBFBF'),\n bottom: border1('BFBFBF'),\n insideH: border1('BFBFBF'),\n },\n look: { firstRow: true, lastRow: false, noHBand: true, noVBand: true },\n conditionals: {\n firstRow: { bold: true },\n },\n },\n {\n id: 'PlainTable2',\n name: 'Plain Table 2',\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, borders: { bottom: border1('7F7F7F') } },\n band1Horz: { backgroundColor: '#F2F2F2' },\n },\n },\n {\n id: 'PlainTable3',\n name: 'Plain Table 3',\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#A5A5A5' },\n band1Horz: { backgroundColor: '#E7E7E7' },\n },\n },\n {\n id: 'PlainTable4',\n name: 'Plain Table 4',\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#000000' },\n band1Horz: { backgroundColor: '#F2F2F2' },\n },\n },\n {\n id: 'GridTable1Light-Accent1',\n name: 'Grid Table 1 Light',\n tableBorders: {\n top: border1('B4C6E7'),\n bottom: border1('B4C6E7'),\n left: border1('B4C6E7'),\n right: border1('B4C6E7'),\n insideH: border1('B4C6E7'),\n insideV: border1('B4C6E7'),\n },\n look: { firstRow: true, lastRow: false, noHBand: true, noVBand: true },\n conditionals: {\n firstRow: { bold: true, borders: { bottom: border1('4472C4') } },\n },\n },\n {\n id: 'GridTable4-Accent1',\n name: 'Grid Table 4 Accent 1',\n tableBorders: {\n top: border1('4472C4'),\n bottom: border1('4472C4'),\n left: border1('4472C4'),\n right: border1('4472C4'),\n insideH: border1('4472C4'),\n insideV: border1('4472C4'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#4472C4' },\n band1Horz: { backgroundColor: '#D6E4F0' },\n },\n },\n {\n id: 'GridTable5Dark-Accent1',\n name: 'Grid Table 5 Dark',\n tableBorders: {\n top: border1('FFFFFF'),\n bottom: border1('FFFFFF'),\n left: border1('FFFFFF'),\n right: border1('FFFFFF'),\n insideH: border1('FFFFFF'),\n insideV: border1('FFFFFF'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#4472C4' },\n band1Horz: { backgroundColor: '#D6E4F0' },\n band2Horz: { backgroundColor: '#B4C6E7' },\n },\n },\n {\n id: 'ListTable3-Accent2',\n name: 'List Table 3 Accent 2',\n tableBorders: {\n top: border1('ED7D31'),\n bottom: border1('ED7D31'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#ED7D31' },\n band1Horz: { backgroundColor: '#FBE4D5' },\n },\n },\n {\n id: 'ListTable4-Accent3',\n name: 'List Table 4 Accent 3',\n tableBorders: {\n top: border1('A5A5A5'),\n bottom: border1('A5A5A5'),\n insideH: border1('A5A5A5'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#A5A5A5' },\n band1Horz: { backgroundColor: '#EDEDED' },\n },\n },\n {\n id: 'GridTable4-Accent5',\n name: 'Grid Table 4 Accent 5',\n tableBorders: {\n top: border1('5B9BD5'),\n bottom: border1('5B9BD5'),\n left: border1('5B9BD5'),\n right: border1('5B9BD5'),\n insideH: border1('5B9BD5'),\n insideV: border1('5B9BD5'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#5B9BD5' },\n band1Horz: { backgroundColor: '#DEEAF6' },\n },\n },\n {\n id: 'GridTable4-Accent6',\n name: 'Grid Table 4 Accent 6',\n tableBorders: {\n top: border1('70AD47'),\n bottom: border1('70AD47'),\n left: border1('70AD47'),\n right: border1('70AD47'),\n insideH: border1('70AD47'),\n insideV: border1('70AD47'),\n },\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n conditionals: {\n firstRow: { bold: true, color: '#FFFFFF', backgroundColor: '#70AD47' },\n band1Horz: { backgroundColor: '#E2EFDA' },\n },\n },\n];\n\n// ============================================================================\n// STYLE PREVIEW COMPONENT\n// ============================================================================\n\nconst PREVIEW_ROWS = 4;\nconst PREVIEW_COLS = 3;\n\nfunction borderToCSS(\n border?: { style: string; size?: number; color?: { rgb: string } } | null\n): string {\n if (!border || border.style === 'none') return 'none';\n const width = border.size ? Math.max(1, Math.round(border.size / 8)) : 1;\n const color = border.color?.rgb ? `#${border.color.rgb}` : '#000';\n return `${width}px solid ${color}`;\n}\n\nfunction StylePreview({\n preset,\n isSelected,\n onClick,\n}: {\n preset: TableStylePreset;\n isSelected: boolean;\n onClick: () => void;\n}) {\n const look = preset.look ?? {};\n const conditionals = preset.conditionals ?? {};\n const tb = preset.tableBorders;\n\n const cells: React.ReactNode[] = [];\n let dataRowIdx = 0;\n\n for (let r = 0; r < PREVIEW_ROWS; r++) {\n const isFirstRow = r === 0 && !!look.firstRow;\n const isLastRow = r === PREVIEW_ROWS - 1 && !!look.lastRow;\n const bandingEnabled = look.noHBand !== true;\n\n let condType: string | undefined;\n if (isFirstRow) {\n condType = 'firstRow';\n } else if (isLastRow) {\n condType = 'lastRow';\n } else if (bandingEnabled) {\n condType = dataRowIdx % 2 === 0 ? 'band1Horz' : 'band2Horz';\n dataRowIdx++;\n } else {\n dataRowIdx++;\n }\n\n for (let c = 0; c < PREVIEW_COLS; c++) {\n let cellCond = condType;\n const isFirstCol = c === 0 && !!look.firstCol;\n const isLastCol = c === PREVIEW_COLS - 1 && !!look.lastCol;\n\n if (isFirstRow && isFirstCol && conditionals['nwCell']) cellCond = 'nwCell';\n else if (isFirstRow && isLastCol && conditionals['neCell']) cellCond = 'neCell';\n else if (isLastRow && isFirstCol && conditionals['swCell']) cellCond = 'swCell';\n else if (isLastRow && isLastCol && conditionals['seCell']) cellCond = 'seCell';\n else if (isFirstCol) cellCond = 'firstCol';\n else if (isLastCol) cellCond = 'lastCol';\n\n const cond = cellCond ? conditionals[cellCond] : undefined;\n\n const style: CSSProperties = {\n width: 20,\n height: 10,\n backgroundColor: cond?.backgroundColor ?? 'transparent',\n };\n\n // Apply borders\n const sides = ['top', 'bottom', 'left', 'right'] as const;\n const cssSides = ['borderTop', 'borderBottom', 'borderLeft', 'borderRight'] as const;\n for (let i = 0; i < 4; i++) {\n const side = sides[i];\n if (cond?.borders && cond.borders[side] !== undefined) {\n (style as Record<string, unknown>)[cssSides[i]] = borderToCSS(cond.borders[side]);\n } else if (tb) {\n if ((side === 'top' && r > 0) || (side === 'bottom' && r < PREVIEW_ROWS - 1)) {\n (style as Record<string, unknown>)[cssSides[i]] = borderToCSS(tb.insideH ?? tb[side]);\n } else if ((side === 'left' && c > 0) || (side === 'right' && c < PREVIEW_COLS - 1)) {\n (style as Record<string, unknown>)[cssSides[i]] = borderToCSS(tb.insideV ?? tb[side]);\n } else {\n (style as Record<string, unknown>)[cssSides[i]] = borderToCSS(tb[side]);\n }\n }\n }\n\n cells.push(<div key={`${r}-${c}`} style={style} />);\n }\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={preset.name}\n style={{\n display: 'inline-grid',\n gridTemplateColumns: `repeat(${PREVIEW_COLS}, 20px)`,\n gridTemplateRows: `repeat(${PREVIEW_ROWS}, 10px)`,\n gap: 0,\n padding: 3,\n border: isSelected ? '2px solid var(--doc-primary)' : '2px solid transparent',\n borderRadius: 3,\n cursor: 'pointer',\n background: 'var(--doc-bg)',\n }}\n >\n {cells}\n </button>\n );\n}\n\n// ============================================================================\n// GALLERY COMPONENT\n// ============================================================================\n\ninterface TableStyleGalleryProps {\n currentStyleId?: string | null;\n documentStyles?: Style[];\n onAction: (action: TableAction) => void;\n}\n\nexport function TableStyleGallery({\n currentStyleId,\n documentStyles,\n onAction,\n}: TableStyleGalleryProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredBtn, setHoveredBtn] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n function handleClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n const handleApply = useCallback(\n (styleId: string) => {\n onAction({ type: 'applyTableStyle', styleId });\n setIsOpen(false);\n },\n [onAction]\n );\n\n // Merge built-in styles with document styles (document styles override built-in by ID)\n const allPresets = [...BUILTIN_STYLES];\n if (documentStyles) {\n for (const ds of documentStyles) {\n if (ds.type !== 'table') continue;\n const existing = allPresets.findIndex((p) => p.id === ds.styleId);\n if (existing === -1) {\n // Convert document style to preset format\n allPresets.push(documentStyleToPreset(ds));\n }\n }\n }\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n onMouseEnter={() => setHoveredBtn(true)}\n onMouseLeave={() => setHoveredBtn(false)}\n title=\"Table Styles\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n border: '1px solid var(--doc-border)',\n borderRadius: 4,\n cursor: 'pointer',\n backgroundColor: hoveredBtn ? 'var(--doc-bg-hover)' : 'var(--doc-bg)',\n fontSize: 12,\n color: 'var(--doc-text)',\n }}\n >\n <MaterialSymbol name=\"format_paint\" size={16} />\n <span>Styles</span>\n <MaterialSymbol name=\"expand_more\" size={14} />\n </button>\n\n {isOpen && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n zIndex: 1000,\n backgroundColor: 'var(--doc-bg)',\n border: '1px solid var(--doc-border)',\n borderRadius: 6,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n padding: 8,\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n maxWidth: 340,\n maxHeight: 300,\n overflowY: 'auto',\n }}\n >\n {allPresets.map((preset) => (\n <StylePreview\n key={preset.id}\n preset={preset}\n isSelected={currentStyleId === preset.id}\n onClick={() => handleApply(preset.id)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Convert a document Style (from styles.xml) to a TableStylePreset\n */\nfunction documentStyleToPreset(style: Style): TableStylePreset {\n const preset: TableStylePreset = {\n id: style.styleId,\n name: style.name ?? style.styleId,\n look: { firstRow: true, lastRow: false, noHBand: false, noVBand: true },\n };\n\n // Convert table borders from style\n if (style.tblPr?.borders) {\n const b = style.tblPr.borders;\n preset.tableBorders = {};\n for (const side of ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'] as const) {\n const bs = b[side];\n if (bs) {\n preset.tableBorders[side] = {\n style: bs.style,\n size: bs.size,\n color: bs.color?.rgb ? { rgb: bs.color.rgb } : undefined,\n };\n }\n }\n }\n\n // Convert conditional styles\n if (style.tblStylePr) {\n preset.conditionals = {};\n for (const cond of style.tblStylePr) {\n const entry: NonNullable<TableStylePreset['conditionals']>[string] = {};\n if (cond.tcPr?.shading?.fill) {\n entry.backgroundColor = `#${cond.tcPr.shading.fill}`;\n }\n if (cond.tcPr?.borders) {\n entry.borders = {};\n for (const side of ['top', 'bottom', 'left', 'right'] as const) {\n const bs = cond.tcPr.borders[side];\n if (bs) {\n entry.borders[side] = {\n style: bs.style,\n size: bs.size,\n color: bs.color?.rgb ? { rgb: bs.color.rgb } : undefined,\n };\n }\n }\n }\n if (cond.rPr?.bold) entry.bold = true;\n if (cond.rPr?.color?.rgb) entry.color = `#${cond.rPr.color.rgb}`;\n preset.conditionals[cond.type] = entry;\n }\n }\n\n return preset;\n}\n\n/**\n * Get a built-in style preset by ID (for resolving in DocxEditor)\n */\nexport function getBuiltinTableStyle(styleId: string): TableStylePreset | undefined {\n return BUILTIN_STYLES.find((s) => s.id === styleId);\n}\n\n/**\n * Get all built-in presets\n */\nexport function getBuiltinTableStyles(): TableStylePreset[] {\n return BUILTIN_STYLES;\n}\n","/**\n * DocxEditor Helper Components\n *\n * Small presentational components used by DocxEditor for\n * loading, placeholder, and error states.\n */\n\nimport React from 'react';\n\n// ============================================================================\n// HELPER COMPONENTS\n// ============================================================================\n\n/**\n * Default loading indicator\n */\nexport function DefaultLoadingIndicator(): React.ReactElement {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n gap: '20px',\n color: 'var(--doc-text-muted)',\n }}\n >\n <div\n style={{\n width: '36px',\n height: '36px',\n border: '3px solid var(--doc-border)',\n borderTopColor: 'var(--doc-primary)',\n borderRadius: '50%',\n animation: 'docx-spin 0.8s linear infinite',\n }}\n />\n <style>\n {`\n @keyframes docx-spin {\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div style={{ fontSize: '14px' }}>Loading document...</div>\n </div>\n );\n}\n\n/**\n * Default placeholder\n */\nexport function DefaultPlaceholder(): React.ReactElement {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'var(--doc-text-placeholder)',\n }}\n >\n <svg\n width=\"64\"\n height=\"64\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n <div style={{ marginTop: '16px' }}>No document loaded</div>\n </div>\n );\n}\n\n/**\n * Parse error display\n */\nexport function ParseError({ message }: { message: string }): React.ReactElement {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: '20px',\n textAlign: 'center',\n }}\n >\n <div style={{ color: 'var(--doc-error)', marginBottom: '16px' }}>\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16v.01\" />\n </svg>\n </div>\n <h3 style={{ color: 'var(--doc-error)', marginBottom: '8px' }}>Failed to Load Document</h3>\n <p style={{ color: 'var(--doc-text-muted)', maxWidth: '400px' }}>{message}</p>\n </div>\n );\n}\n","/**\n * History hook for undo/redo functionality\n *\n * Maintains undo/redo stacks with support for:\n * - undo() and redo() operations\n * - canUndo and canRedo state\n * - Keyboard shortcuts (Ctrl+Z, Ctrl+Y, Ctrl+Shift+Z)\n * - Grouping rapid changes to avoid cluttering history\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * History entry containing state and metadata\n */\nexport interface HistoryEntry<T> {\n /** The state at this point */\n state: T;\n /** Timestamp when this entry was created */\n timestamp: number;\n /** Optional description of what changed */\n description?: string;\n}\n\n/**\n * Options for the useHistory hook\n */\nexport interface UseHistoryOptions<T> {\n /** Maximum number of entries in history (default: 100) */\n maxEntries?: number;\n /** Time in ms to group rapid changes (default: 500) */\n groupingInterval?: number;\n /** Whether to enable keyboard shortcuts (default: true) */\n enableKeyboardShortcuts?: boolean;\n /** Custom comparison function for detecting changes */\n isEqual?: (a: T, b: T) => boolean;\n /** Callback when undo is triggered */\n onUndo?: (state: T) => void;\n /** Callback when redo is triggered */\n onRedo?: (state: T) => void;\n /** Ref to the container element for keyboard events */\n containerRef?: React.RefObject<HTMLElement>;\n}\n\n/**\n * Return type of the useHistory hook\n */\nexport interface UseHistoryReturn<T> {\n /** Current state */\n state: T;\n /** Whether undo is available */\n canUndo: boolean;\n /** Whether redo is available */\n canRedo: boolean;\n /** Number of entries in undo stack */\n undoCount: number;\n /** Number of entries in redo stack */\n redoCount: number;\n /** Push a new state to history */\n push: (newState: T, description?: string) => void;\n /** Undo to previous state */\n undo: () => T | undefined;\n /** Redo to next state */\n redo: () => T | undefined;\n /** Clear all history */\n clear: () => void;\n /** Reset to initial state and clear history */\n reset: (newInitialState?: T) => void;\n /** Get all undo entries (for debugging/display) */\n getUndoStack: () => HistoryEntry<T>[];\n /** Get all redo entries (for debugging/display) */\n getRedoStack: () => HistoryEntry<T>[];\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Default equality check using JSON stringify\n */\nfunction defaultIsEqual<T>(a: T, b: T): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n// ============================================================================\n// HOOK IMPLEMENTATION\n// ============================================================================\n\n/**\n * Custom hook for managing undo/redo history\n */\nexport function useHistory<T>(\n initialState: T,\n options: UseHistoryOptions<T> = {}\n): UseHistoryReturn<T> {\n const {\n maxEntries = 100,\n groupingInterval = 500,\n enableKeyboardShortcuts = true,\n isEqual = defaultIsEqual,\n onUndo,\n onRedo,\n containerRef,\n } = options;\n\n // Current state\n const [state, setState] = useState<T>(initialState);\n\n // History stacks\n const [undoStack, setUndoStack] = useState<HistoryEntry<T>[]>([]);\n const [redoStack, setRedoStack] = useState<HistoryEntry<T>[]>([]);\n\n // Track last push time for grouping\n const lastPushTimeRef = useRef<number>(0);\n\n // Track if we're currently in an undo/redo operation\n const isUndoRedoRef = useRef<boolean>(false);\n\n /**\n * Push a new state to history\n */\n const push = useCallback(\n (newState: T, description?: string) => {\n // Skip if state hasn't changed\n if (isEqual(state, newState)) {\n return;\n }\n\n // If this is an undo/redo operation, don't push\n if (isUndoRedoRef.current) {\n setState(newState);\n return;\n }\n\n const now = Date.now();\n const timeSinceLastPush = now - lastPushTimeRef.current;\n\n // Check if we should group with previous entry\n if (timeSinceLastPush < groupingInterval && undoStack.length > 0) {\n // Update the most recent entry instead of creating new one\n setUndoStack((prev) => {\n const newStack = [...prev];\n newStack[newStack.length - 1] = {\n state: state, // Keep the state before the grouped changes\n timestamp: now,\n description: description || newStack[newStack.length - 1].description,\n };\n return newStack;\n });\n } else {\n // Push current state to undo stack\n setUndoStack((prev) => {\n const newEntry: HistoryEntry<T> = {\n state,\n timestamp: now,\n description,\n };\n\n // Limit stack size\n const newStack = [...prev, newEntry];\n if (newStack.length > maxEntries) {\n return newStack.slice(newStack.length - maxEntries);\n }\n return newStack;\n });\n }\n\n // Clear redo stack on new change\n setRedoStack([]);\n\n // Update current state\n setState(newState);\n\n // Update last push time\n lastPushTimeRef.current = now;\n },\n [state, isEqual, groupingInterval, maxEntries, undoStack.length]\n );\n\n /**\n * Undo to previous state\n */\n const undo = useCallback((): T | undefined => {\n if (undoStack.length === 0) {\n return undefined;\n }\n\n isUndoRedoRef.current = true;\n\n // Pop from undo stack\n const prevEntry = undoStack[undoStack.length - 1];\n setUndoStack((prev) => prev.slice(0, -1));\n\n // Push current state to redo stack\n setRedoStack((prev) => [\n ...prev,\n {\n state,\n timestamp: Date.now(),\n },\n ]);\n\n // Restore previous state\n setState(prevEntry.state);\n\n // Reset flag after state update\n setTimeout(() => {\n isUndoRedoRef.current = false;\n }, 0);\n\n // Call callback\n onUndo?.(prevEntry.state);\n\n return prevEntry.state;\n }, [undoStack, state, onUndo]);\n\n /**\n * Redo to next state\n */\n const redo = useCallback((): T | undefined => {\n if (redoStack.length === 0) {\n return undefined;\n }\n\n isUndoRedoRef.current = true;\n\n // Pop from redo stack\n const nextEntry = redoStack[redoStack.length - 1];\n setRedoStack((prev) => prev.slice(0, -1));\n\n // Push current state to undo stack\n setUndoStack((prev) => [\n ...prev,\n {\n state,\n timestamp: Date.now(),\n },\n ]);\n\n // Restore next state\n setState(nextEntry.state);\n\n // Reset flag after state update\n setTimeout(() => {\n isUndoRedoRef.current = false;\n }, 0);\n\n // Call callback\n onRedo?.(nextEntry.state);\n\n return nextEntry.state;\n }, [redoStack, state, onRedo]);\n\n /**\n * Clear all history\n */\n const clear = useCallback(() => {\n setUndoStack([]);\n setRedoStack([]);\n }, []);\n\n /**\n * Reset to initial state and clear history\n */\n const reset = useCallback(\n (newInitialState?: T) => {\n setState(newInitialState ?? initialState);\n setUndoStack([]);\n setRedoStack([]);\n lastPushTimeRef.current = 0;\n },\n [initialState]\n );\n\n /**\n * Get undo stack (for debugging)\n */\n const getUndoStack = useCallback((): HistoryEntry<T>[] => {\n return [...undoStack];\n }, [undoStack]);\n\n /**\n * Get redo stack (for debugging)\n */\n const getRedoStack = useCallback((): HistoryEntry<T>[] => {\n return [...redoStack];\n }, [redoStack]);\n\n /**\n * Handle keyboard shortcuts\n */\n useEffect(() => {\n if (!enableKeyboardShortcuts) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Ctrl+Z or Cmd+Z for undo\n if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n undo();\n return;\n }\n\n // Ctrl+Y or Cmd+Shift+Z for redo\n if (\n ((event.ctrlKey || event.metaKey) && event.key === 'y') ||\n ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)\n ) {\n event.preventDefault();\n redo();\n return;\n }\n };\n\n // Add listener to container or document\n const target = containerRef?.current || document;\n target.addEventListener('keydown', handleKeyDown as EventListener);\n\n return () => {\n target.removeEventListener('keydown', handleKeyDown as EventListener);\n };\n }, [enableKeyboardShortcuts, undo, redo, containerRef]);\n\n return {\n state,\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n undoCount: undoStack.length,\n redoCount: redoStack.length,\n push,\n undo,\n redo,\n clear,\n reset,\n getUndoStack,\n getRedoStack,\n };\n}\n\n// ============================================================================\n// CONVENIENCE HOOKS\n// ============================================================================\n\n/**\n * Simplified hook that just tracks state changes automatically\n */\nexport function useAutoHistory<T>(\n value: T,\n options: UseHistoryOptions<T> = {}\n): Omit<UseHistoryReturn<T>, 'push'> {\n const history = useHistory(value, options);\n\n // Automatically push when value changes\n useEffect(() => {\n history.push(value);\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return history;\n}\n\n/**\n * Hook for document history with specialized comparison\n */\nexport function useDocumentHistory<\n T extends {\n package?: { document?: unknown; headers?: unknown; footers?: unknown } | null;\n } | null,\n>(document: T, options: Omit<UseHistoryOptions<T>, 'isEqual'> = {}): UseHistoryReturn<T> {\n // Compare document content, headers, and footers for detecting changes\n const isEqual = useCallback((a: T, b: T): boolean => {\n if (a?.package?.document !== b?.package?.document) {\n if (JSON.stringify(a?.package?.document) !== JSON.stringify(b?.package?.document)) {\n return false;\n }\n }\n // Also compare headers/footers (stored as Maps, use reference equality first)\n if (a?.package?.headers !== b?.package?.headers) return false;\n if (a?.package?.footers !== b?.package?.footers) return false;\n return true;\n }, []);\n\n return useHistory(document, { ...options, isEqual });\n}\n\n// ============================================================================\n// UTILITY EXPORTS\n// ============================================================================\n\n/**\n * Create a history manager for non-React usage\n */\nexport class HistoryManager<T> {\n private undoStack: HistoryEntry<T>[] = [];\n private redoStack: HistoryEntry<T>[] = [];\n private currentState: T;\n private maxEntries: number;\n private groupingInterval: number;\n private lastPushTime: number = 0;\n private isEqual: (a: T, b: T) => boolean;\n\n constructor(\n initialState: T,\n options: {\n maxEntries?: number;\n groupingInterval?: number;\n isEqual?: (a: T, b: T) => boolean;\n } = {}\n ) {\n this.currentState = initialState;\n this.maxEntries = options.maxEntries ?? 100;\n this.groupingInterval = options.groupingInterval ?? 500;\n this.isEqual = options.isEqual ?? defaultIsEqual;\n }\n\n get state(): T {\n return this.currentState;\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n push(newState: T, description?: string): void {\n if (this.isEqual(this.currentState, newState)) {\n return;\n }\n\n const now = Date.now();\n const timeSinceLastPush = now - this.lastPushTime;\n\n if (timeSinceLastPush < this.groupingInterval && this.undoStack.length > 0) {\n // Group with previous entry\n this.undoStack[this.undoStack.length - 1].timestamp = now;\n } else {\n // Push new entry\n this.undoStack.push({\n state: this.currentState,\n timestamp: now,\n description,\n });\n\n // Limit stack size\n if (this.undoStack.length > this.maxEntries) {\n this.undoStack = this.undoStack.slice(-this.maxEntries);\n }\n }\n\n // Clear redo stack\n this.redoStack = [];\n\n // Update state\n this.currentState = newState;\n this.lastPushTime = now;\n }\n\n undo(): T | undefined {\n if (this.undoStack.length === 0) {\n return undefined;\n }\n\n const prevEntry = this.undoStack.pop()!;\n\n this.redoStack.push({\n state: this.currentState,\n timestamp: Date.now(),\n });\n\n this.currentState = prevEntry.state;\n return prevEntry.state;\n }\n\n redo(): T | undefined {\n if (this.redoStack.length === 0) {\n return undefined;\n }\n\n const nextEntry = this.redoStack.pop()!;\n\n this.undoStack.push({\n state: this.currentState,\n timestamp: Date.now(),\n });\n\n this.currentState = nextEntry.state;\n return nextEntry.state;\n }\n\n clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n\n reset(newInitialState?: T): void {\n this.currentState = newInitialState ?? this.currentState;\n this.undoStack = [];\n this.redoStack = [];\n this.lastPushTime = 0;\n }\n}\n\nexport default useHistory;\n","/**\n * HiddenProseMirror Component\n *\n * Off-screen ProseMirror instance that owns all keyboard input and state\n * while the paginated layout engine handles visual output. Responsibilities:\n *\n * - Keyboard input handling\n * - Selection state management\n * - Accessibility (semantic document structure for screen readers)\n * - ProseMirror transaction processing\n *\n * Visibility approach: The editor is moved off-viewport with position:fixed\n * and rendered transparent so it can still receive focus and remain part of\n * the accessibility tree. Content width is kept in sync with the document\n * so that ProseMirror's internal measurements stay valid.\n */\n\nimport { useRef, useEffect, useCallback, useImperativeHandle, forwardRef, memo } from 'react';\nimport type { CSSProperties } from 'react';\nimport {\n EditorState,\n Transaction,\n TextSelection,\n NodeSelection,\n type Command,\n type Plugin,\n} from 'prosemirror-state';\nimport { CellSelection } from 'prosemirror-tables';\nimport { EditorView, type DirectEditorProps } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\n\nimport { schema } from '@eigenpal/docx-core/prosemirror/schema';\nimport { toProseDoc, createEmptyDoc } from '@eigenpal/docx-core/prosemirror/conversion';\nimport { fromProseDoc } from '@eigenpal/docx-core/prosemirror/conversion/fromProseDoc';\nimport type { ExtensionManager } from '@eigenpal/docx-core/prosemirror/extensions/ExtensionManager';\nimport type { Document, Theme, StyleDefinitions } from '@eigenpal/docx-core/types/document';\n\n// Import ProseMirror CSS\nimport 'prosemirror-view/style/prosemirror.css';\nimport '@eigenpal/docx-core/prosemirror/editor.css';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface HiddenProseMirrorProps {\n /** The document to edit */\n document: Document | null;\n /** Document styles for style resolution */\n styles?: StyleDefinitions | null;\n /** Theme for styling */\n theme?: Theme | null;\n /** Width in pixels (should match document content width) */\n widthPx?: number;\n /** Whether the editor is read-only */\n readOnly?: boolean;\n /** Callback when document changes via transaction */\n onTransaction?: (transaction: Transaction, newState: EditorState) => void;\n /** Callback when selection changes */\n onSelectionChange?: (state: EditorState) => void;\n /** External ProseMirror plugins */\n externalPlugins?: Plugin[];\n /** Extension manager for plugins/schema/commands (optional — falls back to default) */\n extensionManager?: ExtensionManager;\n /** Callback when EditorView is ready */\n onEditorViewReady?: (view: EditorView) => void;\n /** Callback when EditorView is destroyed */\n onEditorViewDestroy?: () => void;\n /** Intercept key events before ProseMirror processes them. Return true to prevent PM handling. */\n onKeyDown?: (view: EditorView, event: KeyboardEvent) => boolean;\n}\n\nexport interface HiddenProseMirrorRef {\n /** Get the ProseMirror EditorState */\n getState(): EditorState | null;\n /** Get the ProseMirror EditorView */\n getView(): EditorView | null;\n /** Get the current Document from PM state */\n getDocument(): Document | null;\n /** Focus the hidden editor */\n focus(): void;\n /** Blur the hidden editor */\n blur(): void;\n /** Check if focused */\n isFocused(): boolean;\n /** Dispatch a transaction */\n dispatch(tr: Transaction): void;\n /** Execute a ProseMirror command */\n executeCommand(command: Command): boolean;\n /** Undo */\n undo(): boolean;\n /** Redo */\n redo(): boolean;\n /** Check if undo is available */\n canUndo(): boolean;\n /** Check if redo is available */\n canRedo(): boolean;\n /** Set selection by PM position */\n setSelection(anchor: number, head?: number): void;\n /** Set node selection at a PM position (for images, etc.) */\n setNodeSelection(pos: number): void;\n /** Set cell selection between two positions inside table cells */\n setCellSelection(anchorCellPos: number, headCellPos: number): void;\n /** Scroll the PM view to selection (no-op since hidden) */\n scrollToSelection(): void;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\n/**\n * Hidden host styles - visually hidden but focusable\n */\nconst HIDDEN_HOST_STYLES: CSSProperties = {\n // Position off-screen but in document flow for accessibility\n position: 'fixed',\n left: '-9999px',\n top: '0',\n // Hide visually but keep focusable (NOT visibility:hidden!)\n opacity: 0,\n zIndex: -1,\n // Prevent interaction with visual layer\n pointerEvents: 'none',\n // Prevent text selection in hidden area\n userSelect: 'none',\n // Prevent scroll anchoring issues\n overflowAnchor: 'none',\n // Don't set aria-hidden - editor must remain accessible to screen readers\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Create ProseMirror state from document\n *\n * When an ExtensionManager is provided, it supplies the schema and plugins.\n * Otherwise falls back to the default singleton schema with no extension plugins.\n */\nfunction createInitialState(\n document: Document | null,\n styles: StyleDefinitions | null | undefined,\n manager?: ExtensionManager,\n externalPlugins: Plugin[] = []\n): EditorState {\n const activeSchema = manager?.getSchema() ?? schema;\n const doc = document ? toProseDoc(document, { styles: styles ?? undefined }) : createEmptyDoc();\n\n const plugins: Plugin[] = [...(manager?.getPlugins() ?? []), ...externalPlugins];\n\n return EditorState.create({\n doc,\n schema: activeSchema,\n plugins,\n });\n}\n\n/**\n * Convert PM state to Document\n */\nfunction stateToDocument(state: EditorState, originalDoc: Document | null): Document | null {\n if (!originalDoc) return null;\n\n // fromProseDoc preserves the base document structure when provided\n return fromProseDoc(state.doc, originalDoc);\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * HiddenProseMirror - Off-screen ProseMirror editor for keyboard input\n */\nconst HiddenProseMirrorComponent = forwardRef<HiddenProseMirrorRef, HiddenProseMirrorProps>(\n function HiddenProseMirror(props, ref) {\n const {\n document,\n styles,\n theme: _theme,\n widthPx = 612, // Default Letter width at 72dpi\n readOnly = false,\n onTransaction,\n onSelectionChange,\n externalPlugins = [],\n extensionManager,\n onEditorViewReady,\n onEditorViewDestroy,\n onKeyDown,\n } = props;\n\n // Refs\n const hostRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const documentRef = useRef<Document | null>(document);\n const isDestroyingRef = useRef(false);\n // Track the document identity to detect truly external changes\n // vs changes that originated from editing (which get passed back through props)\n const lastDocumentIdRef = useRef<string | null>(null);\n // Track if we've initialized - first render needs to set up state\n const isInitializedRef = useRef(false);\n\n // Store callbacks in refs to avoid dependency array issues that cause infinite loops\n // when the parent component passes unstable callback references\n const onTransactionRef = useRef(onTransaction);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onEditorViewReadyRef = useRef(onEditorViewReady);\n const onEditorViewDestroyRef = useRef(onEditorViewDestroy);\n const onKeyDownRef = useRef(onKeyDown);\n\n // Keep refs in sync\n onTransactionRef.current = onTransaction;\n onSelectionChangeRef.current = onSelectionChange;\n onEditorViewReadyRef.current = onEditorViewReady;\n onEditorViewDestroyRef.current = onEditorViewDestroy;\n onKeyDownRef.current = onKeyDown;\n\n // Keep document ref in sync\n documentRef.current = document;\n\n // ========================================================================\n // EditorView Lifecycle\n // ========================================================================\n\n /**\n * Create EditorView with proper dispatch handling\n * Uses refs for callbacks to avoid infinite re-render loops\n */\n const createView = useCallback(() => {\n if (!hostRef.current || isDestroyingRef.current) return;\n\n const initialState = createInitialState(document, styles, extensionManager, externalPlugins);\n\n const editorProps: DirectEditorProps = {\n state: initialState,\n editable: () => !readOnly,\n dispatchTransaction: (transaction: Transaction) => {\n if (!viewRef.current || isDestroyingRef.current) return;\n\n const newState = viewRef.current.state.apply(transaction);\n viewRef.current.updateState(newState);\n\n // Notify about transaction (use ref to avoid dependency issues)\n onTransactionRef.current?.(transaction, newState);\n\n // Notify about selection changes (use ref to avoid dependency issues)\n if (transaction.selectionSet || transaction.docChanged) {\n onSelectionChangeRef.current?.(newState);\n }\n },\n // Intercept key events before ProseMirror processes them\n handleKeyDown: (view: EditorView, event: KeyboardEvent): boolean => {\n return onKeyDownRef.current?.(view, event) ?? false;\n },\n // Prevent focus handling from interfering with visual layer\n handleDOMEvents: {\n focus: () => {\n // Let focus happen normally\n return false;\n },\n blur: () => {\n // Let blur happen normally\n return false;\n },\n },\n };\n\n viewRef.current = new EditorView(hostRef.current, editorProps);\n\n // Notify that view is ready (use ref to avoid dependency issues)\n onEditorViewReadyRef.current?.(viewRef.current);\n }, [\n document,\n styles,\n externalPlugins,\n extensionManager,\n readOnly,\n // Callbacks removed from dependencies - accessed via refs\n ]);\n\n /**\n * Destroy EditorView\n */\n const destroyView = useCallback(() => {\n if (viewRef.current && !isDestroyingRef.current) {\n isDestroyingRef.current = true;\n\n // Use ref to avoid dependency issues\n onEditorViewDestroyRef.current?.();\n\n viewRef.current.destroy();\n viewRef.current = null;\n isDestroyingRef.current = false;\n }\n }, []);\n\n // Mount/unmount\n useEffect(() => {\n createView();\n return () => destroyView();\n }, []); // Only on mount/unmount\n\n // Update state when document changes externally (e.g., loading a new file)\n // This should NOT run when the document prop changes due to internal edits\n // being passed back through the parent component's state\n useEffect(() => {\n if (!viewRef.current || isDestroyingRef.current) return;\n\n // Generate a simple document identity based on its structure\n // This helps detect truly different documents vs the same doc passed back after editing\n const getDocumentId = (doc: Document | null): string => {\n if (!doc) return 'empty';\n // Use the document's package id or a hash of its structure\n // For simplicity, we compare based on whether it's a different document object\n // and whether it has different metadata\n const meta = doc.package?.properties;\n return `${meta?.created || ''}-${meta?.modified || ''}-${meta?.title || ''}`;\n };\n\n const currentDocId = getDocumentId(document);\n\n // Skip if this is the same document (likely passed back after internal edit)\n // Only reset state if:\n // 1. Not yet initialized (first mount)\n // 2. Document identity changed (truly external change like loading a new file)\n if (isInitializedRef.current && currentDocId === lastDocumentIdRef.current) {\n return;\n }\n\n // Update tracking refs\n isInitializedRef.current = true;\n lastDocumentIdRef.current = currentDocId;\n\n // Create new state from document\n const newState = createInitialState(document, styles, extensionManager, externalPlugins);\n viewRef.current.updateState(newState);\n\n // Use ref to avoid infinite loop when callback is unstable\n onSelectionChangeRef.current?.(newState);\n }, [document, styles, extensionManager, externalPlugins]);\n // NOTE: onSelectionChange removed from dependencies - accessed via ref to prevent infinite loops\n\n // Update editable state\n useEffect(() => {\n if (!viewRef.current) return;\n // EditorView will call editable() on each check, so we don't need to update\n }, [readOnly]);\n\n // ========================================================================\n // Imperative Handle\n // ========================================================================\n\n useImperativeHandle(\n ref,\n () => ({\n getState() {\n return viewRef.current?.state ?? null;\n },\n\n getView() {\n return viewRef.current ?? null;\n },\n\n getDocument() {\n if (!viewRef.current) return null;\n return stateToDocument(viewRef.current.state, documentRef.current);\n },\n\n focus() {\n viewRef.current?.focus();\n },\n\n blur() {\n if (viewRef.current?.hasFocus()) {\n (viewRef.current.dom as HTMLElement).blur();\n }\n },\n\n isFocused() {\n return viewRef.current?.hasFocus() ?? false;\n },\n\n dispatch(tr: Transaction) {\n if (viewRef.current && !isDestroyingRef.current) {\n viewRef.current.dispatch(tr);\n }\n },\n\n executeCommand(command: Command) {\n if (!viewRef.current) return false;\n return command(viewRef.current.state, viewRef.current.dispatch, viewRef.current);\n },\n\n undo() {\n if (!viewRef.current) return false;\n return undo(viewRef.current.state, viewRef.current.dispatch);\n },\n\n redo() {\n if (!viewRef.current) return false;\n return redo(viewRef.current.state, viewRef.current.dispatch);\n },\n\n canUndo() {\n if (!viewRef.current) return false;\n return undo(viewRef.current.state);\n },\n\n canRedo() {\n if (!viewRef.current) return false;\n return redo(viewRef.current.state);\n },\n\n setSelection(anchor: number, head?: number) {\n if (!viewRef.current) return;\n const { state, dispatch } = viewRef.current;\n const $anchor = state.doc.resolve(anchor);\n const $head = head !== undefined ? state.doc.resolve(head) : $anchor;\n const selection = TextSelection.between($anchor, $head);\n dispatch(state.tr.setSelection(selection));\n },\n\n setNodeSelection(pos: number) {\n if (!viewRef.current) return;\n const { state, dispatch } = viewRef.current;\n try {\n const selection = NodeSelection.create(state.doc, pos);\n dispatch(state.tr.setSelection(selection));\n } catch {\n // Fallback to text selection if NodeSelection fails\n this.setSelection(pos);\n }\n },\n\n setCellSelection(anchorCellPos: number, headCellPos: number) {\n if (!viewRef.current) return;\n const { state, dispatch } = viewRef.current;\n try {\n const cellSel = CellSelection.create(state.doc, anchorCellPos, headCellPos);\n dispatch(state.tr.setSelection(cellSel));\n } catch {\n // Fallback to text selection if positions aren't valid for CellSelection\n this.setSelection(anchorCellPos, headCellPos);\n }\n },\n\n scrollToSelection() {\n // No-op for hidden editor - visual scrolling handled by PagedEditor\n },\n }),\n []\n );\n\n // ========================================================================\n // Render\n // ========================================================================\n\n return (\n <div\n ref={hostRef}\n className=\"paged-editor__hidden-pm\"\n style={{\n ...HIDDEN_HOST_STYLES,\n width: widthPx > 0 ? `${widthPx}px` : undefined,\n }}\n // DO NOT set aria-hidden - this editor provides semantic structure\n />\n );\n }\n);\n\nexport const HiddenProseMirror = memo(HiddenProseMirrorComponent);\n\nexport default HiddenProseMirror;\n","/**\n * Selection Overlay Component\n *\n * Renders the selection overlay for the paged editor, including:\n * - Caret cursor (blinking vertical line for collapsed selection)\n * - Selection highlights (blue rectangles for range selection)\n *\n * The overlay is positioned absolutely over the pages container and\n * renders selection rectangles in container-relative coordinates.\n */\n\nimport React, { useEffect, useState, useRef } from 'react';\nimport type { SelectionRect, CaretPosition } from '@eigenpal/docx-core/layout-bridge/selectionRects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SelectionOverlayProps {\n /** Selection rectangles for range selection. */\n selectionRects: SelectionRect[];\n /** Caret position for collapsed selection. */\n caretPosition: CaretPosition | null;\n /** Whether the editor is focused. */\n isFocused: boolean;\n /** Hide caret/selection when in read-only mode. */\n readOnly?: boolean;\n /** Gap between pages (for coordinate adjustment). */\n pageGap?: number;\n /** Custom caret color. */\n caretColor?: string;\n /** Custom selection background color. */\n selectionColor?: string;\n /** Caret width in pixels. */\n caretWidth?: number;\n /** Blink interval in milliseconds (0 to disable). */\n blinkInterval?: number;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst DEFAULT_CARET_COLOR = '#000';\nconst DEFAULT_SELECTION_COLOR = 'rgba(66, 133, 244, 0.3)'; // Google Docs style blue\nconst DEFAULT_CARET_WIDTH = 2;\nconst DEFAULT_BLINK_INTERVAL = 530; // Standard cursor blink rate\n\n// =============================================================================\n// STYLES\n// =============================================================================\n\nconst overlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 10,\n overflow: 'hidden',\n};\n\nconst caretStyles = (\n caret: CaretPosition,\n color: string,\n width: number,\n visible: boolean\n): React.CSSProperties => ({\n position: 'absolute',\n left: caret.x,\n top: caret.y,\n width: width,\n height: caret.height,\n backgroundColor: color,\n opacity: visible ? 1 : 0,\n transition: 'opacity 0.05s ease-out',\n pointerEvents: 'none',\n});\n\nconst selectionRectStyles = (rect: SelectionRect, color: string): React.CSSProperties => ({\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: rect.width,\n height: rect.height,\n backgroundColor: color,\n pointerEvents: 'none',\n});\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Caret component with blinking animation.\n */\nconst Caret: React.FC<{\n position: CaretPosition;\n color: string;\n width: number;\n blinkInterval: number;\n isFocused: boolean;\n}> = ({ position, color, width, blinkInterval, isFocused }) => {\n const [visible, setVisible] = useState(isFocused);\n const blinkTimerRef = useRef<number | null>(null);\n\n useEffect(() => {\n // Clear any existing timer\n if (blinkTimerRef.current) {\n window.clearInterval(blinkTimerRef.current);\n blinkTimerRef.current = null;\n }\n\n // Only blink when focused and interval is set\n if (isFocused && blinkInterval > 0) {\n setVisible(true);\n blinkTimerRef.current = window.setInterval(() => {\n setVisible((v) => !v);\n }, blinkInterval);\n } else {\n // Hide caret when not focused\n setVisible(false);\n }\n\n return () => {\n if (blinkTimerRef.current) {\n window.clearInterval(blinkTimerRef.current);\n }\n };\n }, [isFocused, blinkInterval]);\n\n // Reset blink cycle when position changes (show immediately after typing/navigation)\n useEffect(() => {\n if (!isFocused) return;\n\n setVisible(true);\n\n // Restart blink timer from this moment\n if (blinkTimerRef.current) {\n window.clearInterval(blinkTimerRef.current);\n }\n if (blinkInterval > 0) {\n blinkTimerRef.current = window.setInterval(() => {\n setVisible((v) => !v);\n }, blinkInterval);\n }\n\n return () => {\n if (blinkTimerRef.current) {\n window.clearInterval(blinkTimerRef.current);\n }\n };\n }, [position.x, position.y, isFocused, blinkInterval]);\n\n return <div style={caretStyles(position, color, width, visible)} data-testid=\"caret\" />;\n};\n\n/**\n * Selection rectangle component.\n */\nconst SelectionRectangle: React.FC<{\n rect: SelectionRect;\n color: string;\n index: number;\n}> = ({ rect, color, index }) => {\n return (\n <div\n style={selectionRectStyles(rect, color)}\n data-testid={`selection-rect-${index}`}\n data-page-index={rect.pageIndex}\n />\n );\n};\n\n/**\n * Selection overlay component.\n *\n * Renders selection highlights and caret cursor over the paginated document.\n * Should be positioned as a child of the pages container with relative positioning.\n */\nexport const SelectionOverlay: React.FC<SelectionOverlayProps> = ({\n selectionRects,\n caretPosition,\n isFocused,\n readOnly = false,\n caretColor = DEFAULT_CARET_COLOR,\n selectionColor = DEFAULT_SELECTION_COLOR,\n caretWidth = DEFAULT_CARET_WIDTH,\n blinkInterval = DEFAULT_BLINK_INTERVAL,\n}) => {\n if (readOnly) {\n return null;\n }\n // Determine if we have a range selection or collapsed selection\n const hasRangeSelection = selectionRects.length > 0;\n const hasCollapsedSelection = caretPosition !== null && !hasRangeSelection;\n\n return (\n <div style={overlayStyles} data-testid=\"selection-overlay\">\n {/* Render selection rectangles for range selection */}\n {hasRangeSelection &&\n selectionRects.map((rect, index) => (\n <SelectionRectangle\n key={`sel-${rect.pageIndex}-${rect.x}-${rect.y}-${index}`}\n rect={rect}\n color={selectionColor}\n index={index}\n />\n ))}\n\n {/* Render caret for collapsed selection */}\n {hasCollapsedSelection && caretPosition && (\n <Caret\n position={caretPosition}\n color={caretColor}\n width={caretWidth}\n blinkInterval={blinkInterval}\n isFocused={isFocused}\n />\n )}\n </div>\n );\n};\n\n// =============================================================================\n// HELPER HOOKS\n// =============================================================================\n\n/**\n * Hook to manage selection overlay state.\n *\n * @param pmSelection - ProseMirror selection {from, to}.\n * @param layout - Document layout.\n * @param blocks - Flow blocks.\n * @param measures - Measurements.\n * @returns Selection overlay props.\n */\nexport function useSelectionOverlay(\n pmSelection: { from: number; to: number } | null,\n layout: import('@eigenpal/docx-core/layout-engine/types').Layout | null,\n blocks: import('@eigenpal/docx-core/layout-engine/types').FlowBlock[],\n measures: import('@eigenpal/docx-core/layout-engine/types').Measure[]\n): {\n selectionRects: SelectionRect[];\n caretPosition: CaretPosition | null;\n} {\n const [selectionRects, setSelectionRects] = useState<SelectionRect[]>([]);\n const [caretPosition, setCaretPosition] = useState<CaretPosition | null>(null);\n\n useEffect(() => {\n if (!layout || !pmSelection) {\n setSelectionRects([]);\n setCaretPosition(null);\n return;\n }\n\n // Import dynamically to avoid circular dependencies\n import('@eigenpal/docx-core/layout-bridge/selectionRects').then(({ selectionToRects, getCaretPosition }) => {\n const { from, to } = pmSelection;\n\n if (from === to) {\n // Collapsed selection - show caret\n const caret = getCaretPosition(layout, blocks, measures, from);\n setCaretPosition(caret);\n setSelectionRects([]);\n } else {\n // Range selection - show highlight\n const rects = selectionToRects(layout, blocks, measures, from, to);\n setSelectionRects(rects);\n setCaretPosition(null);\n }\n });\n }, [pmSelection, layout, blocks, measures]);\n\n return { selectionRects, caretPosition };\n}\n\nexport default SelectionOverlay;\n","/**\n * ImageSelectionOverlay Component\n *\n * Renders a selection overlay with resize handles over a selected image\n * in the visible pages. Handles:\n * - Blue selection border\n * - 4 corner resize handles\n * - Drag-to-resize with aspect ratio lock\n * - Dimension tooltip during resize\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ResizeHandle = 'nw' | 'ne' | 'se' | 'sw';\n\nexport interface ImageSelectionInfo {\n /** The DOM element of the selected image in the pages container */\n element: HTMLElement;\n /** ProseMirror position of the image node */\n pmPos: number;\n /** Current width in pixels */\n width: number;\n /** Current height in pixels */\n height: number;\n}\n\nexport interface ImageSelectionOverlayProps {\n /** Info about the currently selected image, or null if no image selected */\n imageInfo: ImageSelectionInfo | null;\n /** Zoom level */\n zoom: number;\n /** Whether the editor is focused */\n isFocused: boolean;\n /** Callback when image is resized */\n onResize?: (pmPos: number, newWidth: number, newHeight: number) => void;\n /** Callback when resize starts (to prevent other interactions) */\n onResizeStart?: () => void;\n /** Callback when resize ends */\n onResizeEnd?: () => void;\n /** Callback when image drag-move completes. Receives drop clientX/clientY. */\n onDragMove?: (pmPos: number, clientX: number, clientY: number) => void;\n /** Callback when drag starts */\n onDragStart?: () => void;\n /** Callback when drag ends (cancelled or completed) */\n onDragEnd?: () => void;\n}\n\n// =============================================================================\n// STYLES\n// =============================================================================\n\nconst HANDLE_SIZE = 10;\nconst HANDLE_HALF = HANDLE_SIZE / 2;\nconst BORDER_WIDTH = 2;\nconst ACCENT_COLOR = '#2563eb'; // Blue-600\n\nconst overlayStyles: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 15,\n overflow: 'visible',\n};\n\nconst borderStyles: CSSProperties = {\n position: 'absolute',\n border: `${BORDER_WIDTH}px solid ${ACCENT_COLOR}`,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n};\n\nconst handleBaseStyles: CSSProperties = {\n position: 'absolute',\n width: `${HANDLE_SIZE}px`,\n height: `${HANDLE_SIZE}px`,\n backgroundColor: ACCENT_COLOR,\n border: '1px solid white',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.3)',\n boxSizing: 'border-box',\n pointerEvents: 'auto',\n zIndex: 16,\n};\n\nconst dimensionStyles: CSSProperties = {\n position: 'absolute',\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: 'white',\n fontSize: '11px',\n fontFamily: 'system-ui, sans-serif',\n padding: '2px 8px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n zIndex: 20,\n transform: 'translateX(-50%)',\n};\n\nconst HANDLE_CURSORS: Record<ResizeHandle, string> = {\n nw: 'nw-resize',\n ne: 'ne-resize',\n se: 'se-resize',\n sw: 'sw-resize',\n};\n\n// =============================================================================\n// RESIZE CALCULATION\n// =============================================================================\n\nfunction calculateNewDimensions(\n handle: ResizeHandle,\n deltaX: number,\n deltaY: number,\n startWidth: number,\n startHeight: number,\n lockAspect: boolean\n): { width: number; height: number } {\n const signX = handle.includes('w') ? -1 : 1;\n const signY = handle.includes('n') ? -1 : 1;\n\n let newWidth = startWidth + deltaX * signX;\n let newHeight = startHeight + deltaY * signY;\n\n if (lockAspect) {\n const scale = Math.max(newWidth / startWidth, newHeight / startHeight);\n newWidth = startWidth * scale;\n newHeight = startHeight * scale;\n }\n\n return {\n width: Math.max(20, Math.min(2000, newWidth)),\n height: Math.max(20, Math.min(2000, newHeight)),\n };\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function ImageSelectionOverlay({\n imageInfo,\n zoom,\n isFocused,\n onResize,\n onResizeStart,\n onResizeEnd,\n onDragMove,\n onDragStart,\n onDragEnd,\n}: ImageSelectionOverlayProps): React.ReactElement | null {\n const [isResizing, setIsResizing] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [resizeWidth, setResizeWidth] = useState(0);\n const [resizeHeight, setResizeHeight] = useState(0);\n const [overlayRect, setOverlayRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const rafRef = useRef<number | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // Store callbacks in refs so imperative handlers always have latest values\n const onResizeRef = useRef(onResize);\n const onResizeStartRef = useRef(onResizeStart);\n const onResizeEndRef = useRef(onResizeEnd);\n const onDragMoveRef = useRef(onDragMove);\n const onDragStartRef = useRef(onDragStart);\n const onDragEndRef = useRef(onDragEnd);\n onResizeRef.current = onResize;\n onResizeStartRef.current = onResizeStart;\n onResizeEndRef.current = onResizeEnd;\n onDragMoveRef.current = onDragMove;\n onDragStartRef.current = onDragStart;\n onDragEndRef.current = onDragEnd;\n\n // Store imageInfo and zoom in refs for the imperative mousemove/mouseup handlers\n const imageInfoRef = useRef(imageInfo);\n const zoomRef = useRef(zoom);\n imageInfoRef.current = imageInfo;\n zoomRef.current = zoom;\n\n // Update overlay position when imageInfo or layout changes\n const updatePosition = useCallback(() => {\n if (!imageInfo || !overlayRef.current) {\n setOverlayRect(null);\n return;\n }\n\n // Use the overlay's own offsetParent (the viewport div) for correct coordinates\n const parent = overlayRef.current.offsetParent as HTMLElement | null;\n if (!parent) {\n setOverlayRect(null);\n return;\n }\n\n const parentRect = parent.getBoundingClientRect();\n const imageRect = imageInfo.element.getBoundingClientRect();\n\n // Calculate position relative to the overlay's positioning parent\n setOverlayRect({\n left: (imageRect.left - parentRect.left) / zoom,\n top: (imageRect.top - parentRect.top) / zoom,\n width: imageRect.width / zoom,\n height: imageRect.height / zoom,\n });\n }, [imageInfo, zoom]);\n\n // Update position on mount and when dependencies change\n useEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n // Also update on scroll/resize\n useEffect(() => {\n if (!imageInfo) return;\n\n const container =\n overlayRef.current?.closest('[style*=\"overflow\"]') ??\n overlayRef.current?.closest('.paged-editor__container');\n if (!container) return;\n\n const handleScrollOrResize = () => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(updatePosition);\n };\n\n container.addEventListener('scroll', handleScrollOrResize, { passive: true });\n window.addEventListener('resize', handleScrollOrResize, { passive: true });\n\n return () => {\n container.removeEventListener('scroll', handleScrollOrResize);\n window.removeEventListener('resize', handleScrollOrResize);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [imageInfo, updatePosition]);\n\n // Handle resize start - registers window listeners IMMEDIATELY (not via useEffect)\n // This is critical because browser automation and fast interactions fire\n // mousedown/mousemove/mouseup synchronously before React can re-render.\n const handleResizeStart = useCallback(\n (handle: ResizeHandle, e: React.MouseEvent) => {\n if (!imageInfo || !overlayRect) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const startWidth = overlayRect.width;\n const startHeight = overlayRect.height;\n const startX = e.clientX;\n const startY = e.clientY;\n\n // Track final dimensions in local variables (no stale closure issues)\n let finalWidth = Math.round(startWidth);\n let finalHeight = Math.round(startHeight);\n\n setIsResizing(true);\n setResizeWidth(finalWidth);\n setResizeHeight(finalHeight);\n onResizeStartRef.current?.();\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const currentZoom = zoomRef.current;\n const deltaX = (moveEvent.clientX - startX) / currentZoom;\n const deltaY = (moveEvent.clientY - startY) / currentZoom;\n const lockAspect = !moveEvent.shiftKey;\n\n const dims = calculateNewDimensions(\n handle,\n deltaX,\n deltaY,\n startWidth,\n startHeight,\n lockAspect\n );\n\n finalWidth = Math.round(dims.width);\n finalHeight = Math.round(dims.height);\n setResizeWidth(finalWidth);\n setResizeHeight(finalHeight);\n\n // Update overlay rect for live preview\n setOverlayRect((prev) => {\n if (!prev) return prev;\n const newRect = { ...prev };\n if (handle.includes('w')) {\n newRect.left = prev.left + (prev.width - dims.width);\n }\n if (handle.includes('n')) {\n newRect.top = prev.top + (prev.height - dims.height);\n }\n newRect.width = dims.width;\n newRect.height = dims.height;\n return newRect;\n });\n };\n\n const handleMouseUp = () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n\n setIsResizing(false);\n\n // Use the locally tracked final dimensions (always up to date)\n const info = imageInfoRef.current;\n if (info) {\n onResizeRef.current?.(info.pmPos, finalWidth, finalHeight);\n }\n onResizeEndRef.current?.();\n };\n\n // Register listeners IMMEDIATELY - not in a useEffect\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n },\n [imageInfo, overlayRect]\n );\n\n // Handle drag-to-move: mousedown on image body (not a handle) starts a move drag\n const handleBodyMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!imageInfo || !overlayRect) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const DRAG_THRESHOLD = 4; // px before considering it a drag\n const startX = e.clientX;\n const startY = e.clientY;\n let dragStarted = false;\n let ghostEl: HTMLElement | null = null;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const dx = moveEvent.clientX - startX;\n const dy = moveEvent.clientY - startY;\n\n if (!dragStarted && Math.sqrt(dx * dx + dy * dy) < DRAG_THRESHOLD) {\n return; // Haven't moved enough to start dragging\n }\n\n if (!dragStarted) {\n dragStarted = true;\n setIsDragging(true);\n onDragStartRef.current?.();\n\n // Create ghost element\n ghostEl = document.createElement('div');\n ghostEl.style.cssText =\n 'position: fixed; pointer-events: none; z-index: 10000; ' +\n 'opacity: 0.5; border: 2px dashed #2563eb; border-radius: 4px; ' +\n 'background: rgba(37, 99, 235, 0.1);';\n ghostEl.style.width = `${overlayRect.width}px`;\n ghostEl.style.height = `${overlayRect.height}px`;\n document.body.appendChild(ghostEl);\n }\n\n if (ghostEl) {\n ghostEl.style.left = `${moveEvent.clientX - overlayRect.width / 2}px`;\n ghostEl.style.top = `${moveEvent.clientY - overlayRect.height / 2}px`;\n }\n };\n\n const handleMouseUp = (upEvent: MouseEvent) => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n\n if (ghostEl) {\n ghostEl.remove();\n ghostEl = null;\n }\n\n setIsDragging(false);\n\n if (dragStarted) {\n const info = imageInfoRef.current;\n if (info) {\n onDragMoveRef.current?.(info.pmPos, upEvent.clientX, upEvent.clientY);\n }\n onDragEndRef.current?.();\n }\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n },\n [imageInfo, overlayRect]\n );\n\n // Always render the container div so the ref is available for position calculation.\n // Use visibility:hidden when not active (keeps offsetParent accessible).\n const showOverlay = !!(imageInfo && overlayRect && isFocused);\n\n if (!showOverlay) {\n return (\n <div\n ref={overlayRef}\n style={{ ...overlayStyles, visibility: 'hidden' }}\n className=\"image-selection-overlay\"\n />\n );\n }\n\n const { left, top, width, height } = overlayRect;\n\n return (\n <div ref={overlayRef} style={overlayStyles} className=\"image-selection-overlay\">\n {/* Selection border */}\n <div\n style={{\n ...borderStyles,\n left: left - BORDER_WIDTH,\n top: top - BORDER_WIDTH,\n width: width + BORDER_WIDTH * 2,\n height: height + BORDER_WIDTH * 2,\n }}\n />\n\n {/* Draggable body area - click and drag to move */}\n <div\n style={{\n position: 'absolute',\n left,\n top,\n width,\n height,\n cursor: isDragging ? 'grabbing' : 'grab',\n pointerEvents: 'auto',\n zIndex: 15,\n }}\n onMouseDown={handleBodyMouseDown}\n />\n\n {/* Corner resize handles */}\n <Handle\n handle=\"nw\"\n style={{ left: left - HANDLE_HALF, top: top - HANDLE_HALF }}\n onMouseDown={handleResizeStart}\n />\n <Handle\n handle=\"ne\"\n style={{ left: left + width - HANDLE_HALF, top: top - HANDLE_HALF }}\n onMouseDown={handleResizeStart}\n />\n <Handle\n handle=\"se\"\n style={{ left: left + width - HANDLE_HALF, top: top + height - HANDLE_HALF }}\n onMouseDown={handleResizeStart}\n />\n <Handle\n handle=\"sw\"\n style={{ left: left - HANDLE_HALF, top: top + height - HANDLE_HALF }}\n onMouseDown={handleResizeStart}\n />\n\n {/* Dimension indicator during resize */}\n {isResizing && (\n <div\n style={{\n ...dimensionStyles,\n left: left + width / 2,\n top: top + height + 12,\n }}\n >\n {resizeWidth} × {resizeHeight}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// HANDLE SUB-COMPONENT\n// =============================================================================\n\ninterface HandleProps {\n handle: ResizeHandle;\n style: CSSProperties;\n onMouseDown: (handle: ResizeHandle, e: React.MouseEvent) => void;\n}\n\nfunction Handle({ handle, style, onMouseDown }: HandleProps): React.ReactElement {\n return (\n <div\n style={{\n ...handleBaseStyles,\n ...style,\n cursor: HANDLE_CURSORS[handle],\n }}\n onMouseDown={(e) => onMouseDown(handle, e)}\n data-handle={handle}\n />\n );\n}\n\nexport default ImageSelectionOverlay;\n","/**\n * Layout Selection Gate\n *\n * Guards selection rendering until layout is up-to-date.\n * Uses sequenced versioning to prevent stale cursor positions.\n */\n\ntype RenderCallback = () => void;\n\n/**\n * LayoutSelectionGate coordinates the timing between document edits and\n * layout reflow so that selection overlays are only painted against\n * current DOM geometry.\n *\n * Workflow:\n * 1. Document changes → setStateSeq(++seq)\n * 2. Layout starts → onLayoutStart()\n * 3. Layout completes → onLayoutComplete(seq)\n * 4. Selection update requested → requestRender()\n * 5. If safe → callback is called\n */\nexport class LayoutSelectionGate {\n /** Current document state sequence */\n #stateSeq = 0;\n\n /** Last painted layout sequence */\n #renderSeq = 0;\n\n /** Whether layout is currently being computed/painted */\n #layoutUpdating = false;\n\n /** Pending render callback */\n #pendingRender: RenderCallback | null = null;\n\n /** Registered render callbacks */\n #renderCallbacks: Set<RenderCallback> = new Set();\n\n /**\n * Set the document state sequence (call when document changes).\n * This should be called on every ProseMirror transaction that changes the doc.\n */\n setStateSeq(seq: number): void {\n this.#stateSeq = seq;\n }\n\n /**\n * Increment document state sequence (convenience method).\n * Returns the new sequence value.\n */\n incrementStateSeq(): number {\n return ++this.#stateSeq;\n }\n\n /**\n * Get current document state sequence.\n */\n getStateSeq(): number {\n return this.#stateSeq;\n }\n\n /**\n * Get current layout render sequence.\n */\n getRenderSeq(): number {\n return this.#renderSeq;\n }\n\n /**\n * Called when layout computation starts.\n */\n onLayoutStart(): void {\n this.#layoutUpdating = true;\n }\n\n /**\n * Called when layout computation and DOM painting completes.\n * @param seq - The document state sequence that was just painted\n */\n onLayoutComplete(seq: number): void {\n this.#renderSeq = seq;\n this.#layoutUpdating = false;\n\n // If there's a pending render and it's now safe, execute it\n this.#tryRender();\n }\n\n /**\n * Check if it's safe to render selection.\n * Safe when: layout is not updating AND render sequence >= state sequence\n */\n isSafeToRender(): boolean {\n return !this.#layoutUpdating && this.#renderSeq >= this.#stateSeq;\n }\n\n /**\n * Request a selection render. Will be executed when safe.\n * If already safe, executes immediately.\n */\n requestRender(): void {\n if (this.isSafeToRender()) {\n this.#executeRender();\n } else {\n // Mark that we have a pending render\n this.#pendingRender = () => this.#executeRender();\n }\n }\n\n /**\n * Register a callback to be called on render events.\n */\n onRender(callback: RenderCallback): () => void {\n this.#renderCallbacks.add(callback);\n return () => {\n this.#renderCallbacks.delete(callback);\n };\n }\n\n /**\n * Try to execute pending render if safe.\n */\n #tryRender(): void {\n if (this.#pendingRender && this.isSafeToRender()) {\n const render = this.#pendingRender;\n this.#pendingRender = null;\n render();\n }\n }\n\n /**\n * Execute all registered render callbacks.\n */\n #executeRender(): void {\n for (const callback of this.#renderCallbacks) {\n try {\n callback();\n } catch (error) {\n console.error('LayoutSelectionGate: render callback error', error);\n }\n }\n }\n\n /**\n * Reset the gate state (useful for testing or document reload).\n */\n reset(): void {\n this.#stateSeq = 0;\n this.#renderSeq = 0;\n this.#layoutUpdating = false;\n this.#pendingRender = null;\n }\n\n /**\n * Get debug info about current state.\n */\n getDebugInfo(): {\n stateSeq: number;\n renderSeq: number;\n layoutUpdating: boolean;\n hasPendingRender: boolean;\n isSafe: boolean;\n } {\n return {\n stateSeq: this.#stateSeq,\n renderSeq: this.#renderSeq,\n layoutUpdating: this.#layoutUpdating,\n hasPendingRender: this.#pendingRender !== null,\n isSafe: this.isSafeToRender(),\n };\n }\n}\n","/**\n * Visual Line Navigation Hook\n *\n * Implements visual-line-aware ArrowUp/ArrowDown navigation with sticky X.\n * Extracted from PagedEditor.tsx for better separation of concerns.\n *\n * This hook provides:\n * - getCaretClientX: Get the screen X of the caret at a PM position\n * - findLineElementAtPosition: Find the .layout-line element for a PM position\n * - findPositionOnLineAtClientX: Find a PM position on a line at a given screen X\n * - handlePMKeyDown: Key handler for ArrowUp/ArrowDown with sticky X\n */\n\nimport { useCallback, useRef } from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\n\nexport interface VisualLineNavigationOptions {\n pagesContainerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function useVisualLineNavigation({ pagesContainerRef }: VisualLineNavigationOptions) {\n const stickyXRef = useRef<number | null>(null);\n const lastVisualLineIndexRef = useRef<number>(-1);\n\n /**\n * Get the client X coordinate of the caret at a PM position.\n */\n const getCaretClientX = useCallback(\n (pmPos: number): number | null => {\n if (!pagesContainerRef.current) return null;\n\n const spans = pagesContainerRef.current.querySelectorAll('span[data-pm-start][data-pm-end]');\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n if (spanEl.classList.contains('layout-run-tab')) {\n if (pmPos >= pmStart && pmPos < pmEnd) {\n return spanEl.getBoundingClientRect().left;\n }\n continue;\n }\n\n if (pmPos >= pmStart && pmPos <= pmEnd && span.firstChild?.nodeType === Node.TEXT_NODE) {\n const textNode = span.firstChild as Text;\n const charIndex = Math.min(pmPos - pmStart, textNode.length);\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) continue;\n const range = ownerDoc.createRange();\n range.setStart(textNode, charIndex);\n range.setEnd(textNode, charIndex);\n return range.getBoundingClientRect().left;\n }\n }\n\n // Check empty paragraphs\n const emptyRuns = pagesContainerRef.current.querySelectorAll('.layout-empty-run');\n for (const emptyRun of Array.from(emptyRuns)) {\n const paragraph = emptyRun.closest('.layout-paragraph') as HTMLElement;\n if (!paragraph) continue;\n const pmStart = Number(paragraph.dataset.pmStart);\n const pmEnd = Number(paragraph.dataset.pmEnd);\n if (pmPos >= pmStart && pmPos <= pmEnd) {\n return emptyRun.getBoundingClientRect().left;\n }\n }\n\n return null;\n },\n [pagesContainerRef]\n );\n\n /**\n * Find the visual line element (.layout-line) containing a PM position.\n */\n const findLineElementAtPosition = useCallback(\n (pmPos: number): HTMLElement | null => {\n if (!pagesContainerRef.current) return null;\n\n const allLines = pagesContainerRef.current.querySelectorAll('.layout-line');\n\n // First pass: check span ranges (most precise)\n for (const line of Array.from(allLines)) {\n const lineEl = line as HTMLElement;\n const spans = lineEl.querySelectorAll('span[data-pm-start][data-pm-end]');\n for (const span of Array.from(spans)) {\n const s = span as HTMLElement;\n const start = Number(s.dataset.pmStart);\n const end = Number(s.dataset.pmEnd);\n if (pmPos >= start && pmPos <= end) {\n return lineEl;\n }\n }\n }\n\n // Second pass: check paragraph ranges (handles boundary positions\n // and empty paragraphs where no spans have pm data)\n for (const line of Array.from(allLines)) {\n const lineEl = line as HTMLElement;\n const paragraph = lineEl.closest('.layout-paragraph') as HTMLElement;\n if (!paragraph) continue;\n const pStart = Number(paragraph.dataset.pmStart);\n const pEnd = Number(paragraph.dataset.pmEnd);\n if (pmPos >= pStart && pmPos <= pEnd) {\n const firstLineOfParagraph = paragraph.querySelector('.layout-line');\n if (firstLineOfParagraph === lineEl) {\n return lineEl;\n }\n }\n }\n\n return null;\n },\n [pagesContainerRef]\n );\n\n /**\n * Find the PM position on a visual line closest to a client X coordinate.\n */\n const findPositionOnLineAtClientX = useCallback(\n (lineEl: HTMLElement, clientX: number): number | null => {\n const spans = lineEl.querySelectorAll('span[data-pm-start][data-pm-end]');\n\n if (spans.length === 0) {\n // Empty line - return paragraph content start\n const paragraph = lineEl.closest('.layout-paragraph') as HTMLElement;\n if (paragraph?.dataset.pmStart) {\n return Number(paragraph.dataset.pmStart) + 1;\n }\n return null;\n }\n\n // Check each span for the target X\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const rect = spanEl.getBoundingClientRect();\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n if (spanEl.classList.contains('layout-run-tab')) {\n if (clientX >= rect.left && clientX <= rect.right) {\n const mid = (rect.left + rect.right) / 2;\n return clientX < mid ? pmStart : pmEnd;\n }\n continue;\n }\n\n if (clientX >= rect.left && clientX <= rect.right) {\n const textNode = spanEl.firstChild;\n if (!textNode || textNode.nodeType !== Node.TEXT_NODE) return pmStart;\n\n const text = textNode as Text;\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) return pmStart;\n\n // Binary search for the character at clientX\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n const r = ownerDoc.createRange();\n r.setStart(text, mid);\n r.setEnd(text, mid);\n if (clientX < r.getBoundingClientRect().left) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n\n // Refine: check closer boundary\n if (lo > 0 && lo <= text.length) {\n const r = ownerDoc.createRange();\n r.setStart(text, lo - 1);\n r.setEnd(text, lo - 1);\n const leftX = r.getBoundingClientRect().left;\n r.setStart(text, Math.min(lo, text.length));\n r.setEnd(text, Math.min(lo, text.length));\n const rightX = r.getBoundingClientRect().left;\n if (Math.abs(clientX - leftX) < Math.abs(clientX - rightX)) {\n return pmStart + (lo - 1);\n }\n }\n return pmStart + Math.min(lo, pmEnd - pmStart);\n }\n }\n\n // clientX not within any span - find closest span\n let closestSpan: HTMLElement | null = null;\n let closestDist = Infinity;\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const rect = spanEl.getBoundingClientRect();\n const dist = clientX < rect.left ? rect.left - clientX : clientX - rect.right;\n if (dist < closestDist) {\n closestDist = dist;\n closestSpan = spanEl;\n }\n }\n\n if (!closestSpan) return null;\n const rect = closestSpan.getBoundingClientRect();\n return clientX < rect.left\n ? Number(closestSpan.dataset.pmStart)\n : Number(closestSpan.dataset.pmEnd);\n },\n []\n );\n\n /**\n * Handle key events on the ProseMirror EditorView BEFORE PM processes them.\n * Implements visual-line-aware ArrowUp/ArrowDown with sticky X.\n */\n const handlePMKeyDown = useCallback(\n (view: EditorView, event: KeyboardEvent): boolean => {\n // Clear sticky state on non-vertical navigation\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') {\n if (\n ['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key) ||\n (event.key.length === 1 && !event.ctrlKey && !event.metaKey)\n ) {\n stickyXRef.current = null;\n lastVisualLineIndexRef.current = -1;\n }\n return false; // Let PM handle\n }\n\n // Don't intercept Ctrl/Meta + arrow (move to doc start/end)\n if (event.ctrlKey || event.metaKey) {\n stickyXRef.current = null;\n lastVisualLineIndexRef.current = -1;\n return false;\n }\n\n if (!pagesContainerRef.current) return false;\n\n const allLines = Array.from(pagesContainerRef.current.querySelectorAll('.layout-line'));\n if (allLines.length === 0) return false;\n\n const { from, anchor } = view.state.selection;\n\n // Set sticky X from current caret position if not already set\n if (stickyXRef.current === null) {\n const clientX = getCaretClientX(from);\n if (clientX === null) return false;\n stickyXRef.current = clientX;\n }\n\n // Find current line index - use tracked index if available\n let currentIndex: number;\n if (lastVisualLineIndexRef.current >= 0 && lastVisualLineIndexRef.current < allLines.length) {\n currentIndex = lastVisualLineIndexRef.current;\n } else {\n const currentLine = findLineElementAtPosition(from);\n if (!currentLine) return false;\n currentIndex = allLines.indexOf(currentLine);\n if (currentIndex === -1) return false;\n }\n\n // Find target line\n const targetIndex = event.key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1;\n if (targetIndex < 0 || targetIndex >= allLines.length) {\n lastVisualLineIndexRef.current = -1;\n return false;\n }\n\n const targetLine = allLines[targetIndex] as HTMLElement;\n\n // Find PM position on target line at sticky X\n const newPos = findPositionOnLineAtClientX(targetLine, stickyXRef.current);\n if (newPos === null) return false;\n\n // Track which line we navigated to\n lastVisualLineIndexRef.current = targetIndex;\n\n // Set selection\n const { state, dispatch } = view;\n const clampedPos = Math.max(0, Math.min(newPos, state.doc.content.size));\n\n try {\n const sel = event.shiftKey\n ? TextSelection.create(state.doc, anchor, clampedPos)\n : TextSelection.create(state.doc, clampedPos);\n dispatch(state.tr.setSelection(sel));\n } catch {\n const $newPos = state.doc.resolve(clampedPos);\n const sel = event.shiftKey\n ? TextSelection.between(state.doc.resolve(anchor), $newPos)\n : TextSelection.near($newPos);\n dispatch(state.tr.setSelection(sel));\n }\n\n return true;\n },\n [pagesContainerRef, getCaretClientX, findLineElementAtPosition, findPositionOnLineAtClientX]\n );\n\n return {\n stickyXRef,\n lastVisualLineIndexRef,\n getCaretClientX,\n findLineElementAtPosition,\n findPositionOnLineAtClientX,\n handlePMKeyDown,\n };\n}\n","/**\n * RenderedDomContext Implementation\n *\n * Provides DOM-based position mapping for the LayoutPainter output.\n * Uses the same data-pm-start/data-pm-end attribute pattern as the\n * selection overlay in PagedEditor.\n */\n\nimport type { RenderedDomContext, PositionCoordinates } from './types';\n\n/**\n * Implementation of RenderedDomContext.\n *\n * This class provides position mapping between ProseMirror document\n * positions and pixel coordinates in the rendered DOM. It uses the\n * data-pm-start and data-pm-end attributes that LayoutPainter adds\n * to span elements.\n */\nexport class RenderedDomContextImpl implements RenderedDomContext {\n public pagesContainer: HTMLElement;\n public zoom: number;\n\n constructor(pagesContainer: HTMLElement, zoom: number = 1) {\n this.pagesContainer = pagesContainer;\n this.zoom = zoom;\n }\n\n /**\n * Get pixel coordinates for a ProseMirror position.\n * Uses the browser's text rendering via Range API for precise positioning.\n */\n getCoordinatesForPosition(pmPos: number): PositionCoordinates | null {\n const containerRect = this.pagesContainer.getBoundingClientRect();\n\n // Find spans with PM position data\n const spans = this.pagesContainer.querySelectorAll('span[data-pm-start][data-pm-end]');\n\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n // Handle tab spans with exclusive end (tab at [5,6) means pos 6 is next run)\n if (spanEl.classList.contains('layout-run-tab')) {\n if (pmPos >= pmStart && pmPos < pmEnd) {\n const spanRect = spanEl.getBoundingClientRect();\n const lineEl = spanEl.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (spanRect.left - containerRect.left) / this.zoom,\n y: (spanRect.top - containerRect.top) / this.zoom,\n height: lineHeight / this.zoom,\n };\n }\n continue;\n }\n\n // For text runs, use inclusive range\n if (pmPos >= pmStart && pmPos <= pmEnd && span.firstChild?.nodeType === Node.TEXT_NODE) {\n const textNode = span.firstChild as Text;\n const charIndex = Math.min(pmPos - pmStart, textNode.length);\n\n // Create a range at the exact character position\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) continue;\n\n const range = ownerDoc.createRange();\n range.setStart(textNode, charIndex);\n range.setEnd(textNode, charIndex);\n\n const rangeRect = range.getBoundingClientRect();\n const lineEl = spanEl.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (rangeRect.left - containerRect.left) / this.zoom,\n y: (rangeRect.top - containerRect.top) / this.zoom,\n height: lineHeight / this.zoom,\n };\n }\n }\n\n // Fallback: try to find position in empty paragraphs\n const emptyRuns = this.pagesContainer.querySelectorAll('.layout-empty-run');\n for (const emptyRun of Array.from(emptyRuns)) {\n const paragraph = emptyRun.closest('.layout-paragraph') as HTMLElement;\n if (!paragraph) continue;\n\n const pmStart = Number(paragraph.dataset.pmStart);\n const pmEnd = Number(paragraph.dataset.pmEnd);\n\n if (pmPos >= pmStart && pmPos <= pmEnd) {\n const runRect = emptyRun.getBoundingClientRect();\n const lineEl = emptyRun.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (runRect.left - containerRect.left) / this.zoom,\n y: (runRect.top - containerRect.top) / this.zoom,\n height: lineHeight / this.zoom,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Find DOM elements that overlap with a ProseMirror position range.\n */\n findElementsForRange(from: number, to: number): Element[] {\n const elements: Element[] = [];\n const spans = this.pagesContainer.querySelectorAll('span[data-pm-start][data-pm-end]');\n\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n // Check if this span overlaps with the range\n if (pmEnd > from && pmStart < to) {\n elements.push(spanEl);\n }\n }\n\n return elements;\n }\n\n /**\n * Get bounding rectangles for a range of text.\n * Handles line wraps by returning multiple rects.\n */\n getRectsForRange(\n from: number,\n to: number\n ): Array<{ x: number; y: number; width: number; height: number }> {\n const containerRect = this.pagesContainer.getBoundingClientRect();\n const rects: Array<{ x: number; y: number; width: number; height: number }> = [];\n\n const spans = this.pagesContainer.querySelectorAll('span[data-pm-start][data-pm-end]');\n\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n // Check if this span overlaps with selection\n if (pmEnd > from && pmStart < to) {\n // Handle tab spans - highlight full visual width\n if (spanEl.classList.contains('layout-run-tab')) {\n const spanRect = spanEl.getBoundingClientRect();\n rects.push({\n x: (spanRect.left - containerRect.left) / this.zoom,\n y: (spanRect.top - containerRect.top) / this.zoom,\n width: spanRect.width / this.zoom,\n height: spanRect.height / this.zoom,\n });\n continue;\n }\n\n if (span.firstChild?.nodeType !== Node.TEXT_NODE) continue;\n\n const textNode = span.firstChild as Text;\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) continue;\n\n // Calculate character range within this span\n const startChar = Math.max(0, from - pmStart);\n const endChar = Math.min(textNode.length, to - pmStart);\n\n if (startChar < endChar) {\n const range = ownerDoc.createRange();\n range.setStart(textNode, startChar);\n range.setEnd(textNode, endChar);\n\n // Get all client rects (handles line wraps)\n const clientRects = range.getClientRects();\n for (const rect of Array.from(clientRects)) {\n rects.push({\n x: (rect.left - containerRect.left) / this.zoom,\n y: (rect.top - containerRect.top) / this.zoom,\n width: rect.width / this.zoom,\n height: rect.height / this.zoom,\n });\n }\n }\n }\n }\n\n return rects;\n }\n\n /**\n * Get the offset of the pages container from its parent viewport.\n * This is needed for positioning overlays that are rendered in the\n * viewport container rather than directly in the pages container.\n */\n getContainerOffset(): { x: number; y: number } {\n const parent = this.pagesContainer.parentElement;\n if (!parent) return { x: 0, y: 0 };\n\n const containerRect = this.pagesContainer.getBoundingClientRect();\n const parentRect = parent.getBoundingClientRect();\n\n return {\n x: (containerRect.left - parentRect.left) / this.zoom,\n y: (containerRect.top - parentRect.top) / this.zoom,\n };\n }\n}\n\n/**\n * Create a RenderedDomContext for a pages container element.\n *\n * @param pagesContainer - The container element holding rendered pages\n * @param zoom - Current zoom level (default 1)\n */\nexport function createRenderedDomContext(\n pagesContainer: HTMLElement,\n zoom: number = 1\n): RenderedDomContext {\n return new RenderedDomContextImpl(pagesContainer, zoom);\n}\n","/**\n * PagedEditor Component\n *\n * Main paginated editing component that integrates:\n * - HiddenProseMirror: off-screen editor for keyboard input\n * - Layout engine: computes page layout from PM state\n * - DOM painter: renders pages to visible DOM\n * - Selection overlay: renders caret and selection highlights\n *\n * Architecture:\n * 1. User clicks on visible pages → hit test → update PM selection\n * 2. User types → hidden PM receives input → PM transaction\n * 3. PM transaction → convert to blocks → measure → layout → paint\n * 4. Selection changes → compute rects → update overlay\n */\n\nimport React, {\n useRef,\n useState,\n useCallback,\n useEffect,\n useMemo,\n forwardRef,\n useImperativeHandle,\n memo,\n} from 'react';\nimport type { CSSProperties } from 'react';\nimport { NodeSelection } from 'prosemirror-state';\nimport type { EditorState, Transaction, Plugin } from 'prosemirror-state';\nimport { CellSelection } from 'prosemirror-tables';\nimport type { EditorView } from 'prosemirror-view';\n\n// Internal components\nimport { HiddenProseMirror, type HiddenProseMirrorRef } from './HiddenProseMirror';\nimport { SelectionOverlay } from './SelectionOverlay';\nimport { ImageSelectionOverlay, type ImageSelectionInfo } from './ImageSelectionOverlay';\n\n// Layout engine\nimport { layoutDocument } from '@eigenpal/docx-core/layout-engine';\nimport type {\n Layout,\n FlowBlock,\n Measure,\n ParagraphBlock,\n TableBlock,\n TableMeasure,\n ImageBlock,\n ImageRun,\n PageMargins,\n Run,\n RunFormatting,\n ParagraphAttrs,\n} from '@eigenpal/docx-core/layout-engine/types';\n\n// Layout bridge\nimport { toFlowBlocks } from '@eigenpal/docx-core/layout-bridge/toFlowBlocks';\nimport {\n measureParagraph,\n resetCanvasContext,\n clearAllCaches,\n getCachedParagraphMeasure,\n setCachedParagraphMeasure,\n type FloatingImageZone,\n} from '@eigenpal/docx-core/layout-bridge/measuring';\nimport { hitTestFragment, hitTestTableCell } from '@eigenpal/docx-core/layout-bridge/hitTest';\nimport { clickToPosition } from '@eigenpal/docx-core/layout-bridge/clickToPosition';\nimport { clickToPositionDom } from '@eigenpal/docx-core/layout-bridge/clickToPositionDom';\nimport {\n selectionToRects,\n getCaretPosition,\n type SelectionRect,\n type CaretPosition,\n} from '@eigenpal/docx-core/layout-bridge/selectionRects';\n\n// Layout painter\nimport { LayoutPainter, type BlockLookup } from '@eigenpal/docx-core/layout-painter';\nimport {\n renderPages,\n type RenderPageOptions,\n type HeaderFooterContent,\n type FootnoteRenderItem,\n} from '@eigenpal/docx-core/layout-painter/renderPage';\n\n// Selection sync\nimport { LayoutSelectionGate } from './LayoutSelectionGate';\n\n// Visual line navigation hook\nimport { useVisualLineNavigation } from './useVisualLineNavigation';\n\n// Types\nimport type {\n Document,\n Theme,\n StyleDefinitions,\n SectionProperties,\n HeaderFooter,\n} from '@eigenpal/docx-core/types/document';\nimport type { Footnote } from '@eigenpal/docx-core/types/content';\nimport { getFootnoteText } from '@eigenpal/docx-core/docx/footnoteParser';\nimport {\n collectFootnoteRefs,\n mapFootnotesToPages,\n buildFootnoteContentMap,\n calculateFootnoteReservedHeights,\n} from '@eigenpal/docx-core/layout-bridge/footnoteLayout';\nimport type { RenderedDomContext } from '../plugin-api/types';\nimport { createRenderedDomContext } from '../plugin-api/RenderedDomContext';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PagedEditorProps {\n /** The document to edit. */\n document: Document | null;\n /** Document styles for style resolution. */\n styles?: StyleDefinitions | null;\n /** Theme for styling. */\n theme?: Theme | null;\n /** Section properties (page size, margins). */\n sectionProperties?: SectionProperties | null;\n /** Header content for all pages. */\n headerContent?: HeaderFooter | null;\n /** Footer content for all pages. */\n footerContent?: HeaderFooter | null;\n /** Whether the editor is read-only. */\n readOnly?: boolean;\n /** Gap between pages in pixels. */\n pageGap?: number;\n /** Zoom level (1 = 100%). */\n zoom?: number;\n /** Callback when document changes. */\n onDocumentChange?: (document: Document) => void;\n /** Callback when selection changes. */\n onSelectionChange?: (from: number, to: number) => void;\n /** External ProseMirror plugins. */\n externalPlugins?: Plugin[];\n /** Extension manager for plugins/schema/commands (optional — falls back to default) */\n extensionManager?: import('@eigenpal/docx-core/prosemirror/extensions/ExtensionManager').ExtensionManager;\n /** Callback when editor is ready. */\n onReady?: (ref: PagedEditorRef) => void;\n /** Callback when rendered DOM context is ready. */\n onRenderedDomContextReady?: (context: RenderedDomContext) => void;\n /** Plugin overlays to render inside the viewport. */\n pluginOverlays?: React.ReactNode;\n /** Callback when header or footer is double-clicked for editing. */\n onHeaderFooterDoubleClick?: (position: 'header' | 'footer') => void;\n /** Active header/footer editing mode (dims body, intercepts body clicks). */\n hfEditMode?: 'header' | 'footer' | null;\n /** Called when user clicks the body area while in HF editing mode. */\n onBodyClick?: () => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\nexport interface PagedEditorRef {\n /** Get the current document. */\n getDocument(): Document | null;\n /** Get the ProseMirror EditorState. */\n getState(): EditorState | null;\n /** Get the ProseMirror EditorView. */\n getView(): EditorView | null;\n /** Focus the editor. */\n focus(): void;\n /** Blur the editor. */\n blur(): void;\n /** Check if focused. */\n isFocused(): boolean;\n /** Dispatch a transaction. */\n dispatch(tr: Transaction): void;\n /** Undo. */\n undo(): boolean;\n /** Redo. */\n redo(): boolean;\n /** Set selection by PM position. */\n setSelection(anchor: number, head?: number): void;\n /** Get current layout. */\n getLayout(): Layout | null;\n /** Force re-layout. */\n relayout(): void;\n /** Scroll the visible pages to bring a PM position into view. */\n scrollToPosition(pmPos: number): void;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n// Default page size (US Letter at 96 DPI)\nconst DEFAULT_PAGE_WIDTH = 816;\nconst DEFAULT_PAGE_HEIGHT = 1056;\n\n// Default margins (1 inch at 96 DPI)\nconst DEFAULT_MARGINS: PageMargins = {\n top: 96,\n right: 96,\n bottom: 96,\n left: 96,\n};\n\nconst DEFAULT_PAGE_GAP = 24;\n\n// Stable empty array to avoid re-creating on each render\nconst EMPTY_PLUGINS: Plugin[] = [];\n\n// =============================================================================\n// STYLES\n// =============================================================================\n\nconst containerStyles: CSSProperties = {\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'auto',\n backgroundColor: 'var(--doc-bg, #f8f9fa)',\n};\n\nconst viewportStyles: CSSProperties = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n paddingTop: 24,\n paddingBottom: 24,\n};\n\nconst pagesContainerStyles: CSSProperties = {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n};\n\nconst pluginOverlaysStyles: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n overflow: 'visible',\n zIndex: 8,\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Convert twips to pixels (1 twip = 1/20 point, 96 pixels per inch).\n */\nfunction twipsToPixels(twips: number): number {\n return Math.round((twips / 1440) * 96);\n}\n\n/**\n * Extract page size from section properties or use defaults.\n */\nfunction getPageSize(sectionProps: SectionProperties | null | undefined): {\n w: number;\n h: number;\n} {\n return {\n w: sectionProps?.pageWidth ? twipsToPixels(sectionProps.pageWidth) : DEFAULT_PAGE_WIDTH,\n h: sectionProps?.pageHeight ? twipsToPixels(sectionProps.pageHeight) : DEFAULT_PAGE_HEIGHT,\n };\n}\n\n/**\n * Extract margins from section properties or use defaults.\n */\nfunction getMargins(sectionProps: SectionProperties | null | undefined): PageMargins {\n const top = sectionProps?.marginTop ? twipsToPixels(sectionProps.marginTop) : DEFAULT_MARGINS.top;\n const bottom = sectionProps?.marginBottom\n ? twipsToPixels(sectionProps.marginBottom)\n : DEFAULT_MARGINS.bottom;\n\n return {\n top,\n right: sectionProps?.marginRight\n ? twipsToPixels(sectionProps.marginRight)\n : DEFAULT_MARGINS.right,\n bottom,\n left: sectionProps?.marginLeft ? twipsToPixels(sectionProps.marginLeft) : DEFAULT_MARGINS.left,\n // Header/footer distances - where the header/footer content starts\n // Default to 0.5 inch (48px at 96 DPI) if not specified\n header: sectionProps?.headerDistance ? twipsToPixels(sectionProps.headerDistance) : 48,\n footer: sectionProps?.footerDistance ? twipsToPixels(sectionProps.footerDistance) : 48,\n };\n}\n\n/**\n * Check if an image run is a floating image (should affect text wrapping)\n */\nfunction isFloatingImageRun(run: ImageRun): boolean {\n const wrapType = run.wrapType;\n const displayMode = run.displayMode;\n\n // Floating images have specific wrap types that allow text to flow around them\n if (wrapType && ['square', 'tight', 'through'].includes(wrapType)) {\n return true;\n }\n\n // Or explicit float display mode\n if (displayMode === 'float') {\n return true;\n }\n\n return false;\n}\n\n/**\n * EMU to pixels conversion\n */\nfunction emuToPixels(emu: number | undefined): number {\n if (emu === undefined) return 0;\n return Math.round((emu * 96) / 914400);\n}\n\nfunction resolveTableWidthPx(\n width: number | undefined,\n widthType: string | undefined,\n contentWidth: number\n): number | undefined {\n if (!width) return undefined;\n if (widthType === 'pct') {\n // width is in 50ths of a percent (5000 = 100%)\n return (contentWidth * width) / 5000;\n }\n if (widthType === 'dxa' || !widthType || widthType === 'auto') {\n return Math.round((width / 20) * 1.333);\n }\n return undefined;\n}\n\nfunction measureTableBlock(tableBlock: TableBlock, contentWidth: number): TableMeasure {\n const DEFAULT_CELL_PADDING_X = 7; // Word default: 108 twips ≈ 7px\n const DEFAULT_CELL_PADDING_Y = 1; // OOXML spec says 0 but Word renders ~1px internal leading\n const TABLE_MIN_ROW_HEIGHT = 24;\n\n // columnWidths are already in pixels (converted in toFlowBlocks)\n let columnWidths = tableBlock.columnWidths ?? [];\n const explicitWidthPx = resolveTableWidthPx(tableBlock.width, tableBlock.widthType, contentWidth);\n\n if (columnWidths.length === 0 && tableBlock.rows.length > 0) {\n // Determine total columns from first row's colSpans\n const colCount = tableBlock.rows[0].cells.reduce((sum, cell) => sum + (cell.colSpan ?? 1), 0);\n const totalWidth = explicitWidthPx ?? contentWidth;\n const equalWidth = totalWidth / Math.max(1, colCount);\n columnWidths = Array(colCount).fill(equalWidth);\n } else if (columnWidths.length > 0 && explicitWidthPx) {\n const totalWidth = columnWidths.reduce((sum, w) => sum + w, 0);\n if (totalWidth > 0 && Math.abs(totalWidth - explicitWidthPx) > 1) {\n const scale = explicitWidthPx / totalWidth;\n columnWidths = columnWidths.map((w) => w * scale);\n }\n }\n\n // Build a map of columns occupied by spanning cells from previous rows.\n // Without this, cells in rows with vertical merges get the wrong column width.\n const occupiedColumnsPerRow = new Map<number, Set<number>>();\n for (let rowIdx = 0; rowIdx < tableBlock.rows.length; rowIdx++) {\n const row = tableBlock.rows[rowIdx];\n if (!row) continue;\n let colIdx = 0;\n const occupied = occupiedColumnsPerRow.get(rowIdx) ?? new Set<number>();\n while (occupied.has(colIdx)) colIdx++;\n\n for (const cell of row.cells) {\n const colSpan = cell.colSpan ?? 1;\n const rowSpan = cell.rowSpan ?? 1;\n\n if (rowSpan > 1) {\n for (let r = rowIdx + 1; r < rowIdx + rowSpan; r++) {\n if (!occupiedColumnsPerRow.has(r)) occupiedColumnsPerRow.set(r, new Set());\n const occSet = occupiedColumnsPerRow.get(r)!;\n for (let c = 0; c < colSpan; c++) {\n occSet.add(colIdx + c);\n }\n }\n }\n\n colIdx += colSpan;\n while (occupied.has(colIdx)) colIdx++;\n }\n }\n\n // Calculate cell widths based on colSpan and columnWidths,\n // skipping columns occupied by spanning cells from previous rows.\n const rows = tableBlock.rows.map((row, rowIdx) => {\n let columnIndex = 0;\n const occupied = occupiedColumnsPerRow.get(rowIdx) ?? new Set<number>();\n while (occupied.has(columnIndex)) columnIndex++;\n\n return {\n cells: row.cells.map((cell) => {\n const colSpan = cell.colSpan ?? 1;\n // Calculate cell width as sum of spanned columns\n let cellWidth = 0;\n for (let c = 0; c < colSpan && columnIndex + c < columnWidths.length; c++) {\n cellWidth += columnWidths[columnIndex + c] ?? 0;\n }\n // Fallback to cell.width or default if columnWidths not available\n if (cellWidth === 0) {\n cellWidth = cell.width ?? 100;\n }\n columnIndex += colSpan;\n while (occupied.has(columnIndex)) columnIndex++;\n\n const padLeft = cell.padding?.left ?? DEFAULT_CELL_PADDING_X;\n const padRight = cell.padding?.right ?? DEFAULT_CELL_PADDING_X;\n const cellContentWidth = Math.max(1, cellWidth - padLeft - padRight);\n return {\n blocks: cell.blocks.map((b) => measureBlock(b, cellContentWidth)),\n width: cellWidth,\n height: 0, // Calculated below\n colSpan: cell.colSpan,\n rowSpan: cell.rowSpan,\n };\n }),\n height: 0,\n };\n });\n\n // Calculate cell heights, respecting explicit row height rules\n for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) {\n const row = rows[rowIdx];\n const sourceRowCells = tableBlock.rows[rowIdx]?.cells;\n let maxHeight = 0;\n for (let cellIdx = 0; cellIdx < row.cells.length; cellIdx++) {\n const cell = row.cells[cellIdx];\n const sourceCell = sourceRowCells?.[cellIdx];\n cell.height = cell.blocks.reduce((h, m) => {\n // Get height from any measure type (paragraph or table)\n if ('totalHeight' in m) return h + m.totalHeight;\n return h;\n }, 0);\n const padTop = sourceCell?.padding?.top ?? DEFAULT_CELL_PADDING_Y;\n const padBottom = sourceCell?.padding?.bottom ?? DEFAULT_CELL_PADDING_Y;\n cell.height += padTop + padBottom;\n maxHeight = Math.max(maxHeight, cell.height);\n }\n\n // Apply heightRule from the source row\n const sourceRow = tableBlock.rows[rowIdx];\n const explicitHeight = sourceRow?.height;\n const heightRule = sourceRow?.heightRule;\n\n if (explicitHeight && heightRule === 'exact') {\n row.height = explicitHeight;\n } else if (explicitHeight && heightRule === 'atLeast') {\n row.height = Math.max(maxHeight, explicitHeight);\n } else {\n row.height = Math.max(maxHeight, TABLE_MIN_ROW_HEIGHT);\n }\n }\n\n const totalHeight = rows.reduce((h, r) => h + r.height, 0);\n const totalWidth = columnWidths.reduce((w, cw) => w + cw, 0) || explicitWidthPx || contentWidth;\n\n return {\n kind: 'table',\n rows,\n columnWidths,\n totalWidth,\n totalHeight,\n };\n}\n\n/**\n * Extract floating image exclusion zones from all blocks.\n * Called before measurement to determine line width reductions.\n *\n * For images with vertical align=\"top\" relative to margin, they're at Y=0.\n * The exclusion zones define the areas where text lines need reduced widths.\n */\n/**\n * Extended floating zone info that includes anchor block index\n */\ninterface FloatingZoneWithAnchor extends FloatingImageZone {\n /** Block index where this floating image is anchored */\n anchorBlockIndex: number;\n /** If true, zone is positioned relative to margin/page and applies to all blocks */\n isMarginRelative?: boolean;\n}\n\nfunction extractFloatingZones(blocks: FlowBlock[], contentWidth: number): FloatingZoneWithAnchor[] {\n const zones: FloatingZoneWithAnchor[] = [];\n\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const block = blocks[blockIndex];\n if (block.kind !== 'paragraph') continue;\n\n const paragraphBlock = block as ParagraphBlock;\n\n for (const run of paragraphBlock.runs) {\n if (run.kind !== 'image') continue;\n const imgRun = run as ImageRun;\n\n if (!isFloatingImageRun(imgRun)) continue;\n\n // Calculate Y position based on vertical alignment\n let topY = 0;\n const position = imgRun.position;\n const distTop = imgRun.distTop ?? 0;\n const distBottom = imgRun.distBottom ?? 0;\n const distLeft = imgRun.distLeft ?? 12;\n const distRight = imgRun.distRight ?? 12;\n\n if (position?.vertical) {\n const v = position.vertical;\n if (v.align === 'top' && v.relativeTo === 'margin') {\n // Image at top of content area\n topY = 0;\n } else if (v.posOffset !== undefined) {\n topY = emuToPixels(v.posOffset);\n }\n // Other cases (paragraph-relative) are harder to handle without knowing paragraph positions\n }\n\n const bottomY = topY + imgRun.height;\n\n // Calculate margins based on horizontal position\n let leftMargin = 0;\n let rightMargin = 0;\n\n if (position?.horizontal) {\n const h = position.horizontal;\n if (h.align === 'left') {\n // Image on left - text needs left margin\n leftMargin = imgRun.width + distRight;\n } else if (h.align === 'right') {\n // Image on right - text needs right margin\n rightMargin = imgRun.width + distLeft;\n } else if (h.posOffset !== undefined) {\n const x = emuToPixels(h.posOffset);\n if (x < contentWidth / 2) {\n leftMargin = x + imgRun.width + distRight;\n } else {\n rightMargin = contentWidth - x + distLeft;\n }\n }\n } else if (imgRun.cssFloat === 'left') {\n leftMargin = imgRun.width + distRight;\n } else if (imgRun.cssFloat === 'right') {\n rightMargin = imgRun.width + distLeft;\n }\n\n if (leftMargin > 0 || rightMargin > 0) {\n // Images positioned relative to margin/page apply globally (before their anchor paragraph)\n const isMarginRelative =\n position?.vertical?.relativeTo === 'margin' || position?.vertical?.relativeTo === 'page';\n zones.push({\n leftMargin,\n rightMargin,\n topY: topY - distTop,\n bottomY: bottomY + distBottom,\n anchorBlockIndex: blockIndex,\n isMarginRelative,\n });\n }\n }\n }\n\n // Floating tables (block-level) - treat them as exclusion zones for subsequent text\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const block = blocks[blockIndex];\n if (block.kind !== 'table') continue;\n\n const tableBlock = block as TableBlock;\n const floating = tableBlock.floating;\n if (!floating) continue;\n\n const tableMeasure = measureTableBlock(tableBlock, contentWidth);\n const tableWidth = tableMeasure.totalWidth;\n const tableHeight = tableMeasure.totalHeight;\n\n const distLeft = floating.leftFromText ?? 12;\n const distRight = floating.rightFromText ?? 12;\n const distTop = floating.topFromText ?? 0;\n const distBottom = floating.bottomFromText ?? 0;\n\n let leftMargin = 0;\n let rightMargin = 0;\n\n // Determine horizontal position relative to content area\n let x = 0;\n if (floating.tblpX !== undefined) {\n x = floating.tblpX;\n } else if (floating.tblpXSpec) {\n if (floating.tblpXSpec === 'left' || floating.tblpXSpec === 'inside') {\n x = 0;\n } else if (floating.tblpXSpec === 'right' || floating.tblpXSpec === 'outside') {\n x = contentWidth - tableWidth;\n } else if (floating.tblpXSpec === 'center') {\n x = (contentWidth - tableWidth) / 2;\n }\n } else if (tableBlock.justification === 'center') {\n x = (contentWidth - tableWidth) / 2;\n } else if (tableBlock.justification === 'right') {\n x = contentWidth - tableWidth;\n }\n\n if (x < contentWidth / 2) {\n leftMargin = x + tableWidth + distRight;\n } else {\n rightMargin = contentWidth - x + distLeft;\n }\n\n const topY = floating.tblpY ?? 0;\n const bottomY = topY + tableHeight;\n\n zones.push({\n leftMargin,\n rightMargin,\n topY: topY - distTop,\n bottomY: bottomY + distBottom,\n anchorBlockIndex: blockIndex,\n });\n }\n\n return zones;\n}\n\n/**\n * Measure a block based on its type.\n */\nfunction measureBlock(\n block: FlowBlock,\n contentWidth: number,\n floatingZones?: FloatingImageZone[],\n cumulativeY?: number\n): Measure {\n switch (block.kind) {\n case 'paragraph': {\n const pBlock = block as ParagraphBlock;\n\n // Cache paragraph measurements when no floating zones affect this block.\n // Safe because without floating zones the result depends only on content\n // and contentWidth (both captured in the cache key). When floating zones\n // ARE present, we always measure fresh since zones depend on inter-block\n // layout context (cumulative Y, neighboring floating tables/images).\n if (!floatingZones || floatingZones.length === 0) {\n const cached = getCachedParagraphMeasure(pBlock, contentWidth);\n if (cached) return cached;\n }\n\n const result = measureParagraph(pBlock, contentWidth, {\n floatingZones,\n paragraphYOffset: cumulativeY ?? 0,\n });\n\n if (!floatingZones || floatingZones.length === 0) {\n setCachedParagraphMeasure(pBlock, contentWidth, result);\n }\n\n return result;\n }\n\n case 'table': {\n return measureTableBlock(block as TableBlock, contentWidth);\n }\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n return {\n kind: 'image',\n width: imageBlock.width ?? 100,\n height: imageBlock.height ?? 100,\n };\n }\n\n case 'pageBreak':\n return { kind: 'pageBreak' };\n\n case 'columnBreak':\n return { kind: 'columnBreak' };\n\n case 'sectionBreak':\n return { kind: 'sectionBreak' };\n\n default:\n // Unknown block type - return empty paragraph measure\n return {\n kind: 'paragraph',\n lines: [],\n totalHeight: 0,\n };\n }\n}\n\n/**\n * Measure all blocks with floating image support.\n *\n * Pre-scans all blocks to find floating images and creates exclusion zones.\n * Then measures each block, passing the zones so paragraphs can calculate\n * per-line widths based on vertical overlap with floating images.\n */\nfunction measureBlocks(blocks: FlowBlock[], contentWidth: number): Measure[] {\n // Pre-extract floating image exclusion zones with anchor block indices\n const floatingZonesWithAnchors = extractFloatingZones(blocks, contentWidth);\n\n // Margin-relative zones (positioned relative to page/margin) on the same vertical\n // position are likely on the same page. Group them and activate all from the earliest\n // anchor so text wraps around ALL images from the first paragraph onward.\n // e.g. left-aligned and right-aligned images at margin top should both affect text\n // starting from the first anchor paragraph, not just the one containing each image.\n const marginRelative = floatingZonesWithAnchors.filter((z) => z.isMarginRelative);\n const paragraphRelative = floatingZonesWithAnchors.filter((z) => !z.isMarginRelative);\n\n // Group margin-relative zones by topY and move all to earliest anchor in group\n const marginByTopY = new Map<number, FloatingZoneWithAnchor[]>();\n for (const z of marginRelative) {\n const group = marginByTopY.get(z.topY) ?? [];\n group.push(z);\n marginByTopY.set(z.topY, group);\n }\n\n const adjustedZones: FloatingZoneWithAnchor[] = [...paragraphRelative];\n for (const group of marginByTopY.values()) {\n const minAnchor = Math.min(...group.map((z) => z.anchorBlockIndex));\n for (const z of group) {\n adjustedZones.push({ ...z, anchorBlockIndex: minAnchor });\n }\n }\n\n // Group zones by effective anchor block index\n const zonesByAnchor = new Map<number, FloatingImageZone[]>();\n for (const z of adjustedZones) {\n const existing = zonesByAnchor.get(z.anchorBlockIndex) ?? [];\n existing.push({\n leftMargin: z.leftMargin,\n rightMargin: z.rightMargin,\n topY: z.topY,\n bottomY: z.bottomY,\n });\n zonesByAnchor.set(z.anchorBlockIndex, existing);\n }\n\n const anchorIndices = new Set(adjustedZones.map((z) => z.anchorBlockIndex));\n\n // Track cumulative Y position for floating zone overlap calculation\n // Resets when we reach a block with floating images (establishing local page coords)\n let cumulativeY = 0;\n let activeZones: FloatingImageZone[] = [];\n\n return blocks.map((block, blockIndex) => {\n // Check if this block is an anchor for floating images\n // If so, reset cumulative Y and replace active zones (old zones from previous\n // anchors are invalid after the Y reset since their topY/bottomY are in the old\n // coordinate system)\n if (anchorIndices.has(blockIndex)) {\n cumulativeY = 0;\n activeZones = zonesByAnchor.get(blockIndex) ?? [];\n }\n\n const zones = activeZones.length > 0 ? activeZones : undefined;\n\n try {\n const blockStart = performance.now();\n const measure = measureBlock(block, contentWidth, zones, cumulativeY);\n const blockTime = performance.now() - blockStart;\n if (blockTime > 500) {\n console.warn(\n `[measureBlocks] Block ${blockIndex} (${block.kind}) took ${Math.round(blockTime)}ms`\n );\n }\n\n // Update cumulative Y for next block\n if ('totalHeight' in measure) {\n if (!(block.kind === 'table' && (block as TableBlock).floating)) {\n cumulativeY += measure.totalHeight;\n }\n }\n\n return measure;\n } catch (error) {\n console.error(`[measureBlocks] Error measuring block ${blockIndex} (${block.kind}):`, error);\n // Return a minimal measure so we don't crash the entire layout\n return { totalHeight: 20 } as Measure;\n }\n });\n}\n\n/**\n * Convert document Run content to FlowBlock runs.\n * Handles text, tabs, fields (PAGE, NUMPAGES), etc.\n *\n * Fields like PAGE and NUMPAGES are converted to FieldRun which gets\n * substituted with actual values at render time (in renderParagraph).\n *\n * @param content - Array of ParagraphContent from document\n */\nfunction convertDocumentRunsToFlowRuns(content: unknown[]): Run[] {\n const runs: Run[] = [];\n\n for (const item of content) {\n const itemObj = item as Record<string, unknown>;\n\n // Handle Run type (from Document)\n if (itemObj.type === 'run' && Array.isArray(itemObj.content)) {\n const formatting = itemObj.formatting as Record<string, unknown> | undefined;\n const runFormatting: RunFormatting = {};\n\n if (formatting) {\n if (formatting.bold) runFormatting.bold = true;\n if (formatting.italic) runFormatting.italic = true;\n if (formatting.underline) runFormatting.underline = true;\n if (formatting.strike) runFormatting.strike = true;\n if (formatting.color) {\n const color = formatting.color as Record<string, unknown>;\n if (color.val) runFormatting.color = `#${color.val}`;\n else if (color.rgb) runFormatting.color = `#${color.rgb}`;\n }\n if (formatting.fontSize) {\n runFormatting.fontSize = (formatting.fontSize as number) / 2; // half-points to points\n }\n if (formatting.fontFamily) {\n const ff = formatting.fontFamily as Record<string, unknown>;\n runFormatting.fontFamily = (ff.ascii || ff.hAnsi) as string;\n }\n }\n\n // Process run content\n for (const runContent of itemObj.content as unknown[]) {\n const rc = runContent as Record<string, unknown>;\n\n if (rc.type === 'text' && typeof rc.text === 'string') {\n runs.push({\n kind: 'text',\n text: rc.text,\n ...runFormatting,\n });\n } else if (rc.type === 'tab') {\n runs.push({\n kind: 'tab',\n ...runFormatting,\n });\n } else if (rc.type === 'break') {\n runs.push({\n kind: 'lineBreak',\n });\n } else if (rc.type === 'drawing' && rc.image) {\n // Handle images/drawings\n const image = rc.image as Record<string, unknown>;\n const size = image.size as { width: number; height: number } | undefined;\n // EMU to pixels: 1 inch = 914400 EMU, 1 inch = 96 pixels\n const emuToPixels = (emu: number) => Math.round((emu / 914400) * 96);\n const widthPx = size?.width ? emuToPixels(size.width) : 100;\n const heightPx = size?.height ? emuToPixels(size.height) : 100;\n\n // Check for position (floating/anchored images)\n const position = image.position as\n | {\n horizontal?: { relativeTo?: string; posOffset?: number; align?: string };\n vertical?: { relativeTo?: string; posOffset?: number; align?: string };\n }\n | undefined;\n\n runs.push({\n kind: 'image',\n src: (image.src as string) || '',\n width: widthPx,\n height: heightPx,\n alt: (image.alt as string) || undefined,\n // Include position for floating images\n position: position\n ? {\n horizontal: position.horizontal,\n vertical: position.vertical,\n }\n : undefined,\n } as Run);\n }\n }\n }\n\n // Handle SimpleField (w:fldSimple) - PAGE, NUMPAGES, etc.\n if (itemObj.type === 'simpleField') {\n const fieldType = itemObj.fieldType as string;\n\n // Extract formatting from content runs (same approach as ComplexField)\n const fieldFormatting: RunFormatting = {};\n if (Array.isArray(itemObj.content) && itemObj.content.length > 0) {\n const firstRun = itemObj.content[0] as Record<string, unknown>;\n if (firstRun?.type === 'run' && firstRun.formatting) {\n const formatting = firstRun.formatting as Record<string, unknown>;\n if (formatting.fontSize) {\n fieldFormatting.fontSize = (formatting.fontSize as number) / 2;\n }\n if (formatting.fontFamily) {\n const ff = formatting.fontFamily as Record<string, unknown>;\n fieldFormatting.fontFamily = (ff.ascii || ff.hAnsi) as string;\n }\n if (formatting.bold) fieldFormatting.bold = true;\n if (formatting.italic) fieldFormatting.italic = true;\n if (formatting.color) {\n const c = formatting.color as Record<string, unknown>;\n const val = (c.rgb || c.val) as string | undefined;\n if (val) fieldFormatting.color = val.startsWith('#') ? val : `#${val}`;\n }\n }\n }\n\n if (fieldType === 'PAGE') {\n runs.push({\n kind: 'field',\n fieldType: 'PAGE',\n fallback: '1',\n ...fieldFormatting,\n });\n } else if (fieldType === 'NUMPAGES') {\n runs.push({\n kind: 'field',\n fieldType: 'NUMPAGES',\n fallback: '1',\n ...fieldFormatting,\n });\n } else if (Array.isArray(itemObj.content)) {\n // Use the display content for other fields\n const displayRuns = convertDocumentRunsToFlowRuns(itemObj.content as unknown[]);\n runs.push(...displayRuns);\n }\n continue;\n }\n\n // Handle ComplexField (fldChar sequence)\n if (itemObj.type === 'complexField') {\n const fieldType = itemObj.fieldType as string;\n\n // Extract formatting from fieldResult runs if available\n const fieldFormatting: RunFormatting = {};\n if (Array.isArray(itemObj.fieldResult) && itemObj.fieldResult.length > 0) {\n const firstRun = itemObj.fieldResult[0] as Record<string, unknown>;\n if (firstRun?.type === 'run' && firstRun.formatting) {\n const formatting = firstRun.formatting as Record<string, unknown>;\n if (formatting.fontSize) {\n fieldFormatting.fontSize = (formatting.fontSize as number) / 2;\n }\n if (formatting.fontFamily) {\n const ff = formatting.fontFamily as Record<string, unknown>;\n fieldFormatting.fontFamily = (ff.ascii || ff.hAnsi) as string;\n }\n if (formatting.bold) fieldFormatting.bold = true;\n if (formatting.italic) fieldFormatting.italic = true;\n if (formatting.color) {\n const c = formatting.color as Record<string, unknown>;\n const val = (c.rgb || c.val) as string | undefined;\n if (val) fieldFormatting.color = val.startsWith('#') ? val : `#${val}`;\n }\n }\n }\n\n if (fieldType === 'PAGE') {\n runs.push({\n kind: 'field',\n fieldType: 'PAGE',\n fallback: '1',\n ...fieldFormatting,\n });\n } else if (fieldType === 'NUMPAGES') {\n runs.push({\n kind: 'field',\n fieldType: 'NUMPAGES',\n fallback: '1',\n ...fieldFormatting,\n });\n } else if (Array.isArray(itemObj.fieldResult)) {\n // Use the fieldResult for other fields\n const displayRuns = convertDocumentRunsToFlowRuns(itemObj.fieldResult as unknown[]);\n runs.push(...displayRuns);\n }\n }\n\n // Handle Hyperlink\n if (itemObj.type === 'hyperlink' && Array.isArray(itemObj.children)) {\n const childRuns = convertDocumentRunsToFlowRuns(itemObj.children as unknown[]);\n runs.push(...childRuns);\n }\n }\n\n return runs;\n}\n\n/**\n * Convert HeaderFooter (document type) to HeaderFooterContent (render type).\n *\n * This converts parsed header/footer content into FlowBlocks that can be\n * rendered by the layout painter.\n *\n * Fields like PAGE and NUMPAGES are converted to FieldRun which gets\n * substituted with actual values at render time.\n *\n * @param headerFooter - The header/footer document content\n * @param contentWidth - Available width for content\n */\nfunction convertHeaderFooterToContent(\n headerFooter: HeaderFooter | null | undefined,\n contentWidth: number\n): HeaderFooterContent | undefined {\n if (!headerFooter || !headerFooter.content || headerFooter.content.length === 0) {\n return undefined;\n }\n\n const blocks: FlowBlock[] = [];\n\n for (const item of headerFooter.content) {\n const itemObj = item as unknown as Record<string, unknown>;\n\n // Check for Document Paragraph type\n if (itemObj.type === 'paragraph' && Array.isArray(itemObj.content)) {\n const formatting = itemObj.formatting as Record<string, unknown> | undefined;\n const attrs: ParagraphAttrs = {};\n\n if (formatting) {\n if (formatting.alignment) {\n const align = formatting.alignment as string;\n if (align === 'both') attrs.alignment = 'justify';\n else if (['left', 'center', 'right', 'justify'].includes(align)) {\n attrs.alignment = align as 'left' | 'center' | 'right' | 'justify';\n }\n }\n }\n\n const runs = convertDocumentRunsToFlowRuns(itemObj.content as unknown[]);\n\n // Only add paragraph if it has content\n if (runs.length > 0) {\n const paragraphBlock: ParagraphBlock = {\n kind: 'paragraph',\n id: String(blocks.length),\n runs,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n };\n blocks.push(paragraphBlock);\n }\n }\n }\n\n if (blocks.length === 0) {\n return undefined;\n }\n\n // Build blocks for measurement that exclude floating images\n // (floating images are positioned absolutely, don't affect paragraph height)\n const blocksForMeasure: FlowBlock[] = blocks.map((block) => {\n if (block.kind !== 'paragraph') return block;\n const pb = block as ParagraphBlock;\n const hasFloating = pb.runs.some(\n (r) => r.kind === 'image' && 'position' in r && (r as Record<string, unknown>).position\n );\n if (!hasFloating) return block;\n const inlineRuns = pb.runs.filter(\n (r) => !(r.kind === 'image' && 'position' in r && (r as Record<string, unknown>).position)\n );\n // If only floating images remain, add an empty text run so the paragraph still measures\n if (inlineRuns.length === 0) {\n inlineRuns.push({ kind: 'text' as const, text: '' });\n }\n return { ...pb, runs: inlineRuns };\n });\n\n const measures = measureBlocks(blocksForMeasure, contentWidth);\n const totalHeight = measures.reduce((h, m) => {\n if (m.kind === 'paragraph') {\n return h + m.totalHeight;\n }\n return h;\n }, 0);\n\n return {\n blocks,\n measures,\n height: totalHeight,\n };\n}\n\n// =============================================================================\n// FOOTNOTE HELPERS\n// =============================================================================\n\n/**\n * Build per-page footnote render items from page footnote mapping.\n */\nfunction buildFootnoteRenderItems(\n pageFootnoteMap: Map<number, number[]>,\n footnoteContentMap: Map<number, { displayNumber: number }>,\n doc: Document | null\n): Map<number, FootnoteRenderItem[]> {\n const result = new Map<number, FootnoteRenderItem[]>();\n if (!doc?.package?.footnotes) return result;\n\n // Build lookup for footnote text\n const fnLookup = new Map<number, Footnote>();\n for (const fn of doc.package.footnotes) {\n if (fn.noteType && fn.noteType !== 'normal') continue;\n fnLookup.set(fn.id, fn);\n }\n\n for (const [pageNumber, footnoteIds] of pageFootnoteMap) {\n const items: FootnoteRenderItem[] = [];\n\n for (const fnId of footnoteIds) {\n const fn = fnLookup.get(fnId);\n if (!fn) continue;\n\n const content = footnoteContentMap.get(fnId);\n const displayNum = content?.displayNumber ?? 0;\n const text = getFootnoteText(fn);\n\n items.push({\n displayNumber: String(displayNum),\n text,\n });\n }\n\n if (items.length > 0) {\n result.set(pageNumber, items);\n }\n }\n\n return result;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * PagedEditor - Main paginated editing component.\n */\nconst PagedEditorComponent = forwardRef<PagedEditorRef, PagedEditorProps>(\n function PagedEditor(props, ref) {\n const {\n document,\n styles,\n theme: _theme,\n sectionProperties,\n headerContent,\n footerContent,\n readOnly = false,\n pageGap = DEFAULT_PAGE_GAP,\n zoom = 1,\n onDocumentChange,\n onSelectionChange,\n externalPlugins = EMPTY_PLUGINS,\n extensionManager,\n onReady,\n onRenderedDomContextReady,\n pluginOverlays,\n onHeaderFooterDoubleClick,\n hfEditMode,\n onBodyClick,\n className,\n style,\n } = props;\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const pagesContainerRef = useRef<HTMLDivElement>(null);\n const hiddenPMRef = useRef<HiddenProseMirrorRef>(null);\n const painterRef = useRef<LayoutPainter | null>(null);\n\n // Visual line navigation (ArrowUp/ArrowDown with sticky X)\n const { handlePMKeyDown } = useVisualLineNavigation({ pagesContainerRef });\n\n // Store callbacks in refs to avoid infinite re-render loops\n // when parent passes unstable callback references\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onDocumentChangeRef = useRef(onDocumentChange);\n const onReadyRef = useRef(onReady);\n const onRenderedDomContextReadyRef = useRef(onRenderedDomContextReady);\n\n // Keep refs in sync with latest props\n onSelectionChangeRef.current = onSelectionChange;\n onDocumentChangeRef.current = onDocumentChange;\n onReadyRef.current = onReady;\n onRenderedDomContextReadyRef.current = onRenderedDomContextReady;\n\n // State\n const [layout, setLayout] = useState<Layout | null>(null);\n const [blocks, setBlocks] = useState<FlowBlock[]>([]);\n const [measures, setMeasures] = useState<Measure[]>([]);\n const [isFocused, setIsFocused] = useState(false);\n const [selectionRects, setSelectionRects] = useState<SelectionRect[]>([]);\n const [caretPosition, setCaretPosition] = useState<CaretPosition | null>(null);\n\n // Image selection state\n const [selectedImageInfo, setSelectedImageInfo] = useState<ImageSelectionInfo | null>(null);\n const isImageInteractingRef = useRef(false);\n\n /** Build ImageSelectionInfo from a DOM element with data-pm-start */\n const buildImageSelectionInfo = useCallback(\n (el: HTMLElement, pmPos: number): ImageSelectionInfo => {\n const imgTag = el.tagName === 'IMG' ? el : el.querySelector('img');\n const rect = (imgTag ?? el).getBoundingClientRect();\n return {\n element: (imgTag ?? el) as HTMLElement,\n pmPos,\n width: Math.round(rect.width / zoom),\n height: Math.round(rect.height / zoom),\n };\n },\n [zoom]\n );\n\n // Drag selection state\n const isDraggingRef = useRef(false);\n const dragAnchorRef = useRef<number | null>(null);\n\n // Column resize state\n const isResizingColumnRef = useRef(false);\n const resizeStartXRef = useRef(0);\n const resizeColumnIndexRef = useRef(0);\n const resizeTablePmStartRef = useRef(0);\n const resizeOrigWidthsRef = useRef<{ left: number; right: number }>({ left: 0, right: 0 });\n const resizeHandleRef = useRef<HTMLElement | null>(null);\n\n // Row resize state\n const isResizingRowRef = useRef(false);\n const resizeStartYRef = useRef(0);\n const resizeRowIndexRef = useRef(0);\n const resizeRowTablePmStartRef = useRef(0);\n const resizeRowOrigHeightRef = useRef(0); // twips\n const resizeRowHandleRef = useRef<HTMLElement | null>(null);\n const resizeRowIsEdgeRef = useRef(false);\n\n // Right edge resize state (grows last column only)\n const isResizingRightEdgeRef = useRef(false);\n const resizeRightEdgeStartXRef = useRef(0);\n const resizeRightEdgeColIndexRef = useRef(0);\n const resizeRightEdgePmStartRef = useRef(0);\n const resizeRightEdgeOrigWidthRef = useRef(0); // twips\n const resizeRightEdgeHandleRef = useRef<HTMLElement | null>(null);\n\n // Cell selection drag state\n const isCellDraggingRef = useRef(false);\n const cellDragAnchorPosRef = useRef<number | null>(null);\n const cellDragLastPmPosRef = useRef<number | null>(null);\n const cellDragOverflowXRef = useRef<number | null>(null);\n const CELL_SELECT_OVERFLOW_PX = 5; // px of continued drag after text selection maxes out\n\n // Selection gate - ensures selection renders only when layout is current\n const syncCoordinator = useMemo(() => new LayoutSelectionGate(), []);\n\n // Compute page size and margins\n const pageSize = useMemo(() => getPageSize(sectionProperties), [sectionProperties]);\n const margins = useMemo(() => getMargins(sectionProperties), [sectionProperties]);\n const contentWidth = pageSize.w - margins.left - margins.right;\n\n // Initialize painter using useMemo to ensure it's ready before first render callbacks\n const painter = useMemo(() => {\n return new LayoutPainter({\n pageGap,\n showShadow: true,\n pageBackground: '#fff',\n });\n }, [pageGap]);\n\n // Keep ref in sync with memoized painter\n painterRef.current = painter;\n\n // =========================================================================\n // Layout Pipeline\n // =========================================================================\n\n /**\n * Run the full layout pipeline:\n * 1. Convert PM doc to blocks\n * 2. Measure blocks\n * 3. Layout blocks onto pages\n * 4. Paint pages to DOM\n */\n const runLayoutPipeline = useCallback(\n (state: EditorState) => {\n const pipelineStart = performance.now();\n\n // Capture current state sequence for this layout run\n const currentEpoch = syncCoordinator.getStateSeq();\n\n // Signal layout is starting\n syncCoordinator.onLayoutStart();\n\n try {\n // Step 1: Convert PM doc to flow blocks\n let stepStart = performance.now();\n const pageContentHeight = pageSize.h - margins.top - margins.bottom;\n const newBlocks = toFlowBlocks(state.doc, { theme: _theme, pageContentHeight });\n let stepTime = performance.now() - stepStart;\n if (stepTime > 500) {\n console.warn(\n `[PagedEditor] toFlowBlocks took ${Math.round(stepTime)}ms (${newBlocks.length} blocks)`\n );\n }\n setBlocks(newBlocks);\n\n // Step 2: Measure all blocks.\n // Must use full measureBlocks() because measurements depend on\n // inter-block context (floating zones, cumulative Y). Individual\n // block measurements cannot be cached by PM node identity since\n // floating tables/images create exclusion zones that affect\n // neighboring paragraphs' line widths.\n stepStart = performance.now();\n const newMeasures = measureBlocks(newBlocks, contentWidth);\n stepTime = performance.now() - stepStart;\n if (stepTime > 1000) {\n console.warn(\n `[PagedEditor] measureBlocks took ${Math.round(stepTime)}ms (${newBlocks.length} blocks)`\n );\n }\n setMeasures(newMeasures);\n\n // Step 2.5: Collect footnote references from blocks\n const footnoteRefs = collectFootnoteRefs(newBlocks);\n const hasFootnotes = footnoteRefs.length > 0 && document?.package?.footnotes;\n\n // Step 2.75: Prepare header/footer content for rendering (needed before layout\n // to compute effective margins when header content exceeds available space)\n const headerContentForRender = convertHeaderFooterToContent(headerContent, contentWidth);\n const footerContentForRender = convertHeaderFooterToContent(footerContent, contentWidth);\n\n // Adjust margins if header/footer content exceeds available space\n // (Word and Google Docs push body content down when header grows)\n const headerDistance = margins.header ?? 48;\n const footerDistance = margins.footer ?? 48;\n const availableHeaderSpace = margins.top - headerDistance;\n const availableFooterSpace = margins.bottom - footerDistance;\n const headerContentHeight = headerContentForRender?.height ?? 0;\n const footerContentHeight = footerContentForRender?.height ?? 0;\n\n let effectiveMargins = margins;\n if (\n headerContentHeight > availableHeaderSpace ||\n footerContentHeight > availableFooterSpace\n ) {\n effectiveMargins = { ...margins };\n if (headerContentHeight > availableHeaderSpace) {\n effectiveMargins.top = headerDistance + headerContentHeight;\n }\n if (footerContentHeight > availableFooterSpace) {\n effectiveMargins.bottom = footerDistance + footerContentHeight;\n }\n }\n\n // Step 3: Layout blocks onto pages (two-pass if footnotes exist)\n stepStart = performance.now();\n let newLayout: Layout;\n let pageFootnoteMap = new Map<number, number[]>();\n let footnoteContentMap = new Map<number, { displayNumber: number; height: number }>();\n\n if (hasFootnotes) {\n // Pass 1: Layout without footnote space to determine page assignments\n const pass1Layout = layoutDocument(newBlocks, newMeasures, {\n pageSize,\n margins: effectiveMargins,\n });\n\n // Map footnote refs to pages\n pageFootnoteMap = mapFootnotesToPages(pass1Layout.pages, footnoteRefs);\n\n // Build footnote content and measure heights\n footnoteContentMap = buildFootnoteContentMap(\n document!.package.footnotes!,\n footnoteRefs,\n contentWidth\n );\n\n // Calculate per-page reserved heights\n const footnoteReservedHeights = calculateFootnoteReservedHeights(\n pageFootnoteMap,\n footnoteContentMap\n );\n\n // Pass 2: Layout with reserved heights\n if (footnoteReservedHeights.size > 0) {\n newLayout = layoutDocument(newBlocks, newMeasures, {\n pageSize,\n margins: effectiveMargins,\n footnoteReservedHeights,\n });\n\n // Re-map footnotes to pages (assignments may have shifted)\n pageFootnoteMap = mapFootnotesToPages(newLayout.pages, footnoteRefs);\n\n // Store footnoteIds on each page for rendering\n for (const [pageNum, fnIds] of pageFootnoteMap) {\n const page = newLayout.pages.find((p) => p.number === pageNum);\n if (page) {\n page.footnoteIds = fnIds;\n }\n }\n } else {\n newLayout = pass1Layout;\n }\n } else {\n // No footnotes — single pass\n newLayout = layoutDocument(newBlocks, newMeasures, {\n pageSize,\n margins: effectiveMargins,\n });\n }\n\n stepTime = performance.now() - stepStart;\n if (stepTime > 500) {\n console.warn(\n `[PagedEditor] layoutDocument took ${Math.round(stepTime)}ms (${newLayout.pages.length} pages)`\n );\n }\n setLayout(newLayout);\n\n // Step 4: Paint to DOM\n if (pagesContainerRef.current && painterRef.current) {\n stepStart = performance.now();\n\n // Build block lookup\n const blockLookup: BlockLookup = new Map();\n for (let i = 0; i < newBlocks.length; i++) {\n const block = newBlocks[i];\n const measure = newMeasures[i];\n if (block && measure) {\n blockLookup.set(String(block.id), { block, measure });\n }\n }\n painterRef.current.setBlockLookup(blockLookup);\n\n // Build per-page footnote render items\n const footnotesByPage = hasFootnotes\n ? buildFootnoteRenderItems(pageFootnoteMap, footnoteContentMap, document)\n : undefined;\n\n // Render pages to container\n renderPages(newLayout.pages, pagesContainerRef.current, {\n pageGap,\n showShadow: true,\n pageBackground: '#fff',\n blockLookup,\n headerContent: headerContentForRender,\n footerContent: footerContentForRender,\n headerDistance: sectionProperties?.headerDistance\n ? twipsToPixels(sectionProperties.headerDistance)\n : undefined,\n footerDistance: sectionProperties?.footerDistance\n ? twipsToPixels(sectionProperties.footerDistance)\n : undefined,\n pageBorders: sectionProperties?.pageBorders,\n theme: _theme,\n footnotesByPage: footnotesByPage?.size ? footnotesByPage : undefined,\n } as RenderPageOptions & {\n pageGap?: number;\n blockLookup?: BlockLookup;\n footnotesByPage?: Map<number, FootnoteRenderItem[]>;\n });\n\n stepTime = performance.now() - stepStart;\n if (stepTime > 500) {\n console.warn(`[PagedEditor] renderPages took ${Math.round(stepTime)}ms`);\n }\n\n // Create and expose RenderedDomContext after DOM is painted\n if (onRenderedDomContextReady) {\n const domContext = createRenderedDomContext(pagesContainerRef.current, zoom);\n onRenderedDomContextReady(domContext);\n }\n }\n\n const totalTime = performance.now() - pipelineStart;\n if (totalTime > 2000) {\n console.warn(\n `[PagedEditor] Layout pipeline took ${Math.round(totalTime)}ms total ` +\n `(${newBlocks.length} blocks, ${newMeasures.length} measures)`\n );\n }\n } catch (error) {\n console.error('[PagedEditor] Layout pipeline error:', error);\n }\n\n // Signal layout is complete for this sequence\n syncCoordinator.onLayoutComplete(currentEpoch);\n },\n [\n contentWidth,\n pageSize,\n margins,\n pageGap,\n zoom,\n syncCoordinator,\n headerContent,\n footerContent,\n sectionProperties,\n onRenderedDomContextReady,\n document,\n ]\n );\n\n // =========================================================================\n // Coalesced Layout (rAF throttle)\n // =========================================================================\n\n /**\n * Ref holding a pending requestAnimationFrame ID and the latest state.\n * Multiple rapid transactions (e.g. typing \"hello\") within the same frame\n * are coalesced so only the final state triggers a full layout pass.\n */\n const pendingLayoutRef = useRef<{\n rafId: number;\n state: EditorState;\n } | null>(null);\n\n /**\n * Schedule a layout pipeline run for the next animation frame.\n * If a run is already scheduled, the pending state is replaced so only\n * the most recent document state gets laid out.\n */\n const scheduleLayout = useCallback(\n (state: EditorState) => {\n if (pendingLayoutRef.current) {\n // Already scheduled — just update the state to the latest\n pendingLayoutRef.current.state = state;\n return;\n }\n const rafId = requestAnimationFrame(() => {\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending) {\n runLayoutPipeline(pending.state);\n }\n });\n pendingLayoutRef.current = { rafId, state };\n },\n [runLayoutPipeline]\n );\n\n // Clean up pending rAF on unmount\n useEffect(() => {\n return () => {\n if (pendingLayoutRef.current) {\n cancelAnimationFrame(pendingLayoutRef.current.rafId);\n pendingLayoutRef.current = null;\n }\n };\n }, []);\n\n /**\n * Get caret position using DOM-based measurement.\n * This uses the browser's text rendering to get precise pixel positions.\n */\n const getCaretFromDom = useCallback(\n (pmPos: number, currentZoom: number = 1): CaretPosition | null => {\n if (!pagesContainerRef.current) return null;\n\n const overlay = pagesContainerRef.current.parentElement?.querySelector(\n '[data-testid=\"selection-overlay\"]'\n );\n if (!overlay) return null;\n\n const overlayRect = overlay.getBoundingClientRect();\n\n // Find spans with PM position data\n const spans = pagesContainerRef.current.querySelectorAll(\n 'span[data-pm-start][data-pm-end]'\n );\n\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n // Special handling for tab spans - use exclusive end to avoid boundary conflicts\n // Tab at [5,6) means position 6 belongs to the next run, not the tab\n if (spanEl.classList.contains('layout-run-tab')) {\n if (pmPos >= pmStart && pmPos < pmEnd) {\n const spanRect = spanEl.getBoundingClientRect();\n const pageEl = spanEl.closest('.layout-page');\n const pageIndex = pageEl ? Number((pageEl as HTMLElement).dataset.pageNumber) - 1 : 0;\n const lineEl = spanEl.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (spanRect.left - overlayRect.left) / currentZoom,\n y: (spanRect.top - overlayRect.top) / currentZoom,\n height: lineHeight,\n pageIndex,\n };\n }\n continue; // Skip to next span\n }\n\n // For text runs, use inclusive range\n if (pmPos >= pmStart && pmPos <= pmEnd && span.firstChild?.nodeType === Node.TEXT_NODE) {\n const textNode = span.firstChild as Text;\n const charIndex = Math.min(pmPos - pmStart, textNode.length);\n\n // Create a range at the exact character position\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) continue;\n const range = ownerDoc.createRange();\n range.setStart(textNode, charIndex);\n range.setEnd(textNode, charIndex);\n\n const rangeRect = range.getBoundingClientRect();\n\n // Find which page this span is on\n const pageEl = spanEl.closest('.layout-page');\n const pageIndex = pageEl ? Number((pageEl as HTMLElement).dataset.pageNumber) - 1 : 0;\n\n // Get line height from the line element or use default\n const lineEl = spanEl.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (rangeRect.left - overlayRect.left) / currentZoom,\n y: (rangeRect.top - overlayRect.top) / currentZoom,\n height: lineHeight,\n pageIndex,\n };\n }\n }\n\n // Fallback: try to find position in empty paragraphs (they have empty runs)\n const emptyRuns = pagesContainerRef.current.querySelectorAll('.layout-empty-run');\n for (const emptyRun of Array.from(emptyRuns)) {\n const paragraph = emptyRun.closest('.layout-paragraph') as HTMLElement;\n if (!paragraph) continue;\n\n const pmStart = Number(paragraph.dataset.pmStart);\n const pmEnd = Number(paragraph.dataset.pmEnd);\n\n if (pmPos >= pmStart && pmPos <= pmEnd) {\n const runRect = emptyRun.getBoundingClientRect();\n const pageEl = paragraph.closest('.layout-page');\n const pageIndex = pageEl ? Number((pageEl as HTMLElement).dataset.pageNumber) - 1 : 0;\n const lineEl = emptyRun.closest('.layout-line');\n const lineHeight = lineEl ? (lineEl as HTMLElement).offsetHeight : 16;\n\n return {\n x: (runRect.left - overlayRect.left) / currentZoom,\n y: (runRect.top - overlayRect.top) / currentZoom,\n height: lineHeight,\n pageIndex,\n };\n }\n }\n\n return null;\n },\n []\n );\n\n /**\n * Update selection overlay from PM selection.\n */\n const updateSelectionOverlay = useCallback(\n (state: EditorState) => {\n const { from, to } = state.selection;\n\n // Always notify selection change (for toolbar sync) even if layout not ready\n // Use ref to avoid infinite loops when callback is unstable\n onSelectionChangeRef.current?.(from, to);\n\n // Update visual cell selection highlighting on visible layout table cells\n if (pagesContainerRef.current) {\n // Clear previous cell highlighting\n const prevSelected = pagesContainerRef.current.querySelectorAll(\n '.layout-table-cell-selected'\n );\n for (const el of Array.from(prevSelected)) {\n el.classList.remove('layout-table-cell-selected');\n }\n\n // If CellSelection, highlight the corresponding visible cells\n // Use duck-typing ($anchorCell) instead of instanceof to avoid bundling issues\n const sel = state.selection as CellSelection;\n const isCellSel = '$anchorCell' in sel && typeof sel.forEachCell === 'function';\n if (isCellSel) {\n // Collect ranges [cellStart, cellEnd) for each selected cell\n const selectedRanges: Array<[number, number]> = [];\n sel.forEachCell((node, pos) => {\n selectedRanges.push([pos, pos + node.nodeSize]);\n });\n\n // Find visible layout cells whose pmStart falls inside a selected cell range\n const allCells = pagesContainerRef.current.querySelectorAll('.layout-table-cell');\n for (const cellEl of Array.from(allCells)) {\n const htmlEl = cellEl as HTMLElement;\n const pmStartAttr = htmlEl.dataset.pmStart;\n if (pmStartAttr !== undefined) {\n const pmPos = Number(pmStartAttr);\n for (const [start, end] of selectedRanges) {\n if (pmPos >= start && pmPos < end) {\n htmlEl.classList.add('layout-table-cell-selected');\n break;\n }\n }\n }\n }\n }\n }\n\n if (!layout || blocks.length === 0) return;\n\n // Collapsed selection - show caret\n if (from === to) {\n // Use DOM-based caret positioning for accuracy\n const domCaret = getCaretFromDom(from, zoom);\n if (domCaret) {\n setCaretPosition(domCaret);\n } else {\n // Fallback to layout-based calculation if DOM not ready\n const overlay = pagesContainerRef.current?.parentElement?.querySelector(\n '[data-testid=\"selection-overlay\"]'\n );\n const firstPage = pagesContainerRef.current?.querySelector('.layout-page');\n\n if (overlay && firstPage) {\n const overlayRect = overlay.getBoundingClientRect();\n const pageRect = firstPage.getBoundingClientRect();\n const caret = getCaretPosition(layout, blocks, measures, from);\n\n if (caret) {\n setCaretPosition({\n ...caret,\n x: caret.x + (pageRect.left - overlayRect.left) / zoom,\n y: caret.y + (pageRect.top - overlayRect.top) / zoom,\n });\n } else {\n setCaretPosition(null);\n }\n } else {\n setCaretPosition(null);\n }\n }\n setSelectionRects([]);\n } else {\n // Range selection - show highlight rectangles using DOM-based approach\n const overlay = pagesContainerRef.current?.parentElement?.querySelector(\n '[data-testid=\"selection-overlay\"]'\n );\n\n if (overlay && pagesContainerRef.current) {\n const overlayRect = overlay.getBoundingClientRect();\n const domRects: SelectionRect[] = [];\n\n // Find spans that intersect with the selection range\n const spans = pagesContainerRef.current.querySelectorAll(\n 'span[data-pm-start][data-pm-end]'\n );\n\n for (const span of Array.from(spans)) {\n const spanEl = span as HTMLElement;\n const pmStart = Number(spanEl.dataset.pmStart);\n const pmEnd = Number(spanEl.dataset.pmEnd);\n\n // Check if this span overlaps with selection\n if (pmEnd > from && pmStart < to) {\n // Special handling for tab spans - highlight the full visual width\n if (spanEl.classList.contains('layout-run-tab')) {\n const spanRect = spanEl.getBoundingClientRect();\n const pageEl = spanEl.closest('.layout-page');\n const pageIndex = pageEl\n ? Number((pageEl as HTMLElement).dataset.pageNumber) - 1\n : 0;\n\n domRects.push({\n x: (spanRect.left - overlayRect.left) / zoom,\n y: (spanRect.top - overlayRect.top) / zoom,\n width: spanRect.width / zoom,\n height: spanRect.height / zoom,\n pageIndex,\n });\n continue;\n }\n\n if (span.firstChild?.nodeType !== Node.TEXT_NODE) continue;\n\n const textNode = span.firstChild as Text;\n const ownerDoc = spanEl.ownerDocument;\n if (!ownerDoc) continue;\n\n // Calculate the character range within this span\n const startChar = Math.max(0, from - pmStart);\n const endChar = Math.min(textNode.length, to - pmStart);\n\n if (startChar < endChar) {\n const range = ownerDoc.createRange();\n range.setStart(textNode, startChar);\n range.setEnd(textNode, endChar);\n\n // Get all client rects for this range (handles line wraps)\n const clientRects = range.getClientRects();\n for (const rect of Array.from(clientRects)) {\n const pageEl = spanEl.closest('.layout-page');\n const pageIndex = pageEl\n ? Number((pageEl as HTMLElement).dataset.pageNumber) - 1\n : 0;\n\n domRects.push({\n x: (rect.left - overlayRect.left) / zoom,\n y: (rect.top - overlayRect.top) / zoom,\n width: rect.width / zoom,\n height: rect.height / zoom,\n pageIndex,\n });\n }\n }\n }\n }\n\n if (domRects.length > 0) {\n setSelectionRects(domRects);\n } else {\n // Fallback to layout-based calculation\n const firstPage = pagesContainerRef.current.querySelector('.layout-page');\n if (firstPage) {\n const pageRect = firstPage.getBoundingClientRect();\n const pageOffsetX = (pageRect.left - overlayRect.left) / zoom;\n const pageOffsetY = (pageRect.top - overlayRect.top) / zoom;\n\n const rects = selectionToRects(layout, blocks, measures, from, to);\n const adjustedRects = rects.map((rect) => ({\n ...rect,\n x: rect.x + pageOffsetX,\n y: rect.y + pageOffsetY,\n }));\n setSelectionRects(adjustedRects);\n } else {\n setSelectionRects([]);\n }\n }\n } else {\n setSelectionRects([]);\n }\n setCaretPosition(null);\n }\n },\n [layout, blocks, measures, getCaretFromDom, zoom]\n // NOTE: onSelectionChange removed from dependencies - accessed via ref to prevent infinite loops\n );\n\n // =========================================================================\n // Event Handlers\n // =========================================================================\n\n /**\n * Handle PM transaction - re-layout on content/selection change.\n */\n const handleTransaction = useCallback(\n (transaction: Transaction, newState: EditorState) => {\n if (transaction.docChanged) {\n // Increment state sequence to signal document changed\n syncCoordinator.incrementStateSeq();\n\n // Content changed - schedule layout (coalesced via rAF)\n scheduleLayout(newState);\n\n // Notify document change - use ref to avoid infinite loops\n const newDoc = hiddenPMRef.current?.getDocument();\n if (newDoc) {\n onDocumentChangeRef.current?.(newDoc);\n }\n }\n\n // Request selection update (will only execute when layout is current)\n syncCoordinator.requestRender();\n\n // Only update selection overlay immediately for non-doc-changing transactions\n // (e.g. arrow keys, clicks). For doc changes, the overlay will be updated\n // after layout completes via the useEffect([layout]) hook, avoiding cursor\n // flicker from stale DOM positions.\n if (!transaction.docChanged) {\n updateSelectionOverlay(newState);\n }\n },\n [scheduleLayout, updateSelectionOverlay, syncCoordinator]\n // NOTE: onDocumentChange removed from dependencies - accessed via ref to prevent infinite loops\n );\n\n /**\n * Handle selection change from PM.\n */\n const handleSelectionChange = useCallback(\n (state: EditorState) => {\n // Check if this is an image node selection - suppress text overlay if so\n const { selection } = state;\n if (selection instanceof NodeSelection && selection.node.type.name === 'image') {\n // Suppress text selection overlay for image selections\n setSelectionRects([]);\n setCaretPosition(null);\n } else if (syncCoordinator.isSafeToRender()) {\n // Only update overlay when layout is current. When doc changed,\n // layout is pending and DOM hasn't been updated yet — updating the\n // overlay now would position the cursor against stale geometry,\n // causing it to visibly jump. The overlay will be updated after\n // layout completes via the useEffect([layout]) hook.\n updateSelectionOverlay(state);\n }\n\n // Defer image selection check until after layout update\n requestAnimationFrame(() => {\n const view = hiddenPMRef.current?.getView();\n if (!view) {\n setSelectedImageInfo(null);\n return;\n }\n const { selection: sel } = view.state;\n if (sel instanceof NodeSelection && sel.node.type.name === 'image') {\n const pmPos = sel.from;\n const imgEl = pagesContainerRef.current?.querySelector(\n `[data-pm-start=\"${pmPos}\"]`\n ) as HTMLElement | null;\n if (imgEl) {\n setSelectedImageInfo(buildImageSelectionInfo(imgEl, pmPos));\n return;\n }\n }\n if (!isImageInteractingRef.current) {\n setSelectedImageInfo(null);\n }\n });\n },\n [updateSelectionOverlay, zoom, buildImageSelectionInfo, syncCoordinator]\n );\n\n /**\n * Get PM position from mouse coordinates using DOM-based detection.\n * Falls back to geometry-based calculation if DOM mapping fails.\n */\n const getPositionFromMouse = useCallback(\n (clientX: number, clientY: number): number | null => {\n if (!pagesContainerRef.current || !layout) return null;\n\n // Try DOM-based click mapping first (most accurate)\n const domPos = clickToPositionDom(pagesContainerRef.current, clientX, clientY, zoom);\n if (domPos !== null) {\n return domPos;\n }\n\n // Fallback to geometry-based mapping\n const pageElements = pagesContainerRef.current.querySelectorAll('.layout-page');\n let clickedPageIndex = -1;\n let pageRect: DOMRect | null = null;\n\n for (let i = 0; i < pageElements.length; i++) {\n const pageEl = pageElements[i];\n const rect = pageEl.getBoundingClientRect();\n if (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n ) {\n clickedPageIndex = i;\n pageRect = rect;\n break;\n }\n }\n\n if (clickedPageIndex < 0 || !pageRect) {\n return null;\n }\n\n const pageX = (clientX - pageRect.left) / zoom;\n const pageY = (clientY - pageRect.top) / zoom;\n\n const page = layout.pages[clickedPageIndex];\n if (!page) return null;\n\n const pageHit = {\n pageIndex: clickedPageIndex,\n page,\n pageY,\n };\n\n const fragmentHit = hitTestFragment(pageHit, blocks, measures, {\n x: pageX,\n y: pageY,\n });\n\n if (!fragmentHit) return null;\n\n // For table fragments, do cell-level hit testing\n if (fragmentHit.fragment.kind === 'table') {\n const tableCellHit = hitTestTableCell(pageHit, blocks, measures, {\n x: pageX,\n y: pageY,\n });\n return clickToPosition(fragmentHit, tableCellHit);\n }\n\n return clickToPosition(fragmentHit);\n },\n [layout, blocks, measures, zoom]\n );\n\n /**\n * Find the table cell position in ProseMirror doc for a given PM position.\n * Returns the position just inside the cell node, suitable for CellSelection.create().\n */\n const findCellPosFromPmPos = useCallback((pmPos: number): number | null => {\n const view = hiddenPMRef.current?.getView();\n if (!view) return null;\n try {\n const $pos = view.state.doc.resolve(pmPos);\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n // Return position of the cell node itself (before(d)).\n // CellSelection.create will resolve this and use cellAround() internally.\n return $pos.before(d);\n }\n }\n } catch {\n // Position resolution failed\n }\n return null;\n }, []);\n\n /**\n * Find the closest image element from a click target.\n * Returns the element with data-pm-start if it's an image, or null.\n */\n const findImageElement = useCallback((target: HTMLElement): HTMLElement | null => {\n const IMAGE_CONTAINER_CLASSES = [\n 'layout-block-image',\n 'layout-image',\n 'layout-page-floating-image',\n ];\n const isImageContainer = (el: HTMLElement) =>\n !!el.dataset.pmStart && IMAGE_CONTAINER_CLASSES.some((c) => el.classList.contains(c));\n\n // Inline images: <img class=\"layout-run layout-run-image\" data-pm-start=\"X\">\n if (target.tagName === 'IMG' && target.classList.contains('layout-run-image')) {\n return target;\n }\n // Click on <img> inside a container div, or directly on the container\n if (\n target.tagName === 'IMG' &&\n target.parentElement &&\n isImageContainer(target.parentElement)\n ) {\n return target.parentElement;\n }\n if (isImageContainer(target)) {\n return target;\n }\n return null;\n }, []);\n\n /** Scroll visible pages to a ProseMirror position */\n const scrollToPositionImpl = useCallback((pmPos: number) => {\n const pageContainer = pagesContainerRef.current;\n if (!pageContainer) return;\n const targetEl = pageContainer.querySelector(`[data-pm-start=\"${pmPos}\"]`);\n if (targetEl) {\n targetEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, []);\n\n /**\n * Handle mousedown on pages - start selection or drag.\n */\n const handlePagesMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!hiddenPMRef.current || e.button !== 0) return; // Only handle left click\n\n // Intercept internal anchor link clicks (TOC entries, cross-references)\n // Must be before readOnly check so links work in read-only mode\n const anchorEl = (e.target as HTMLElement).closest('a[href^=\"#\"]');\n if (anchorEl) {\n e.preventDefault();\n e.stopPropagation();\n return; // Let handlePagesClick handle the navigation\n }\n\n if (readOnly) return;\n\n // When in HF edit mode, clicks outside header/footer area close the HF editor\n if (hfEditMode && onBodyClick) {\n const target = e.target as HTMLElement;\n const isInHfArea =\n target.closest('.layout-page-header') ||\n target.closest('.layout-page-footer') ||\n target.closest('.hf-inline-editor');\n if (!isInHfArea) {\n e.preventDefault();\n e.stopPropagation();\n onBodyClick();\n return;\n }\n }\n\n // In normal mode, clicks in header/footer area should place cursor at\n // start of body content, not inside header/footer (matches Word/Google Docs)\n if (!hfEditMode) {\n const target = e.target as HTMLElement;\n const isInHfArea =\n target.closest('.layout-page-header') || target.closest('.layout-page-footer');\n if (isInHfArea) {\n e.preventDefault();\n // Place cursor at start of body content\n if (hiddenPMRef.current) {\n hiddenPMRef.current.setSelection(0);\n hiddenPMRef.current.focus();\n setIsFocused(true);\n }\n return;\n }\n }\n\n // Column resize: intercept clicks on resize handles\n const target = e.target as HTMLElement;\n if (target.classList.contains('layout-table-resize-handle')) {\n e.preventDefault();\n e.stopPropagation();\n isResizingColumnRef.current = true;\n resizeStartXRef.current = e.clientX;\n resizeHandleRef.current = target;\n target.classList.add('dragging');\n\n const colIndex = parseInt(target.dataset.columnIndex ?? '0', 10);\n resizeColumnIndexRef.current = colIndex;\n resizeTablePmStartRef.current = parseInt(target.dataset.tablePmStart ?? '0', 10);\n\n // Get current column widths from the ProseMirror doc\n const view = hiddenPMRef.current.getView();\n if (view) {\n const $pos = view.state.doc.resolve(resizeTablePmStartRef.current + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n const widths = node.attrs.columnWidths as number[] | null;\n if (\n widths &&\n widths[colIndex] !== undefined &&\n widths[colIndex + 1] !== undefined\n ) {\n resizeOrigWidthsRef.current = {\n left: widths[colIndex],\n right: widths[colIndex + 1],\n };\n }\n break;\n }\n }\n }\n return;\n }\n\n // Row resize: intercept clicks on row resize handles or bottom edge handle\n if (\n target.classList.contains('layout-table-row-resize-handle') ||\n target.classList.contains('layout-table-edge-handle-bottom')\n ) {\n e.preventDefault();\n e.stopPropagation();\n isResizingRowRef.current = true;\n resizeStartYRef.current = e.clientY;\n resizeRowHandleRef.current = target;\n resizeRowIsEdgeRef.current = target.dataset.isEdge === 'bottom';\n target.classList.add('dragging');\n\n const rowIndex = parseInt(target.dataset.rowIndex ?? '0', 10);\n resizeRowIndexRef.current = rowIndex;\n resizeRowTablePmStartRef.current = parseInt(target.dataset.tablePmStart ?? '0', 10);\n\n // Get current row height from ProseMirror doc\n const view = hiddenPMRef.current.getView();\n if (view) {\n const $pos = view.state.doc.resolve(resizeRowTablePmStartRef.current + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n let rowNode: typeof node | null = null;\n let idx = 0;\n node.forEach((child) => {\n if (idx === rowIndex) rowNode = child;\n idx++;\n });\n if (rowNode) {\n const height = (rowNode as typeof node).attrs.height as number | null;\n if (height) {\n resizeRowOrigHeightRef.current = height;\n } else {\n // Estimate from rendered height: find the row element\n const tableEl = target.closest('.layout-table');\n const rowEl = tableEl?.querySelector(`[data-row-index=\"${rowIndex}\"]`);\n const renderedHeight = rowEl\n ? (rowEl as HTMLElement).getBoundingClientRect().height\n : 30;\n resizeRowOrigHeightRef.current = Math.round(renderedHeight * 15);\n }\n }\n break;\n }\n }\n }\n return;\n }\n\n // Right edge resize: intercept clicks on right edge handle\n if (target.classList.contains('layout-table-edge-handle-right')) {\n e.preventDefault();\n e.stopPropagation();\n isResizingRightEdgeRef.current = true;\n resizeRightEdgeStartXRef.current = e.clientX;\n resizeRightEdgeHandleRef.current = target;\n target.classList.add('dragging');\n\n const colIndex = parseInt(target.dataset.columnIndex ?? '0', 10);\n resizeRightEdgeColIndexRef.current = colIndex;\n resizeRightEdgePmStartRef.current = parseInt(target.dataset.tablePmStart ?? '0', 10);\n\n // Get current last column width from ProseMirror doc\n const view = hiddenPMRef.current.getView();\n if (view) {\n const $pos = view.state.doc.resolve(resizeRightEdgePmStartRef.current + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n const widths = node.attrs.columnWidths as number[] | null;\n if (widths && widths[colIndex] !== undefined) {\n resizeRightEdgeOrigWidthRef.current = widths[colIndex];\n }\n break;\n }\n }\n }\n return;\n }\n\n // Check if the click target is an image element\n const imageEl = findImageElement(target);\n if (imageEl) {\n e.preventDefault();\n e.stopPropagation();\n\n const pmStart = imageEl.dataset.pmStart;\n if (pmStart !== undefined) {\n const pos = parseInt(pmStart, 10);\n hiddenPMRef.current.setNodeSelection(pos);\n setSelectedImageInfo(buildImageSelectionInfo(imageEl, pos));\n setSelectionRects([]);\n setCaretPosition(null);\n }\n\n hiddenPMRef.current.focus();\n setIsFocused(true);\n return;\n }\n\n // Clicking outside an image clears image selection\n setSelectedImageInfo(null);\n\n e.preventDefault(); // Prevent native text selection\n\n const pmPos = getPositionFromMouse(e.clientX, e.clientY);\n\n if (pmPos !== null) {\n // Check if click is inside a table cell - track for potential cell drag selection\n const cellPos = findCellPosFromPmPos(pmPos);\n cellDragAnchorPosRef.current = cellPos;\n isCellDraggingRef.current = false;\n cellDragLastPmPosRef.current = null;\n cellDragOverflowXRef.current = null;\n\n // Start dragging\n isDraggingRef.current = true;\n dragAnchorRef.current = pmPos;\n\n // Set initial selection (collapsed)\n hiddenPMRef.current.setSelection(pmPos);\n } else {\n // Clicked outside content - move to end\n cellDragAnchorPosRef.current = null;\n isCellDraggingRef.current = false;\n const view = hiddenPMRef.current.getView();\n if (view) {\n const endPos = Math.max(0, view.state.doc.content.size - 1);\n hiddenPMRef.current.setSelection(endPos);\n dragAnchorRef.current = endPos;\n isDraggingRef.current = true;\n }\n }\n\n // Focus the hidden editor\n hiddenPMRef.current.focus();\n setIsFocused(true);\n },\n [getPositionFromMouse, findCellPosFromPmPos, readOnly, hfEditMode, onBodyClick, zoom]\n );\n\n /**\n * Handle mousemove - extend selection during drag.\n */\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n // Column resize drag\n if (isResizingColumnRef.current) {\n e.preventDefault();\n const delta = e.clientX - resizeStartXRef.current;\n // Move the handle visually\n if (resizeHandleRef.current) {\n const origLeft = parseFloat(resizeHandleRef.current.style.left);\n resizeHandleRef.current.style.left = `${origLeft + delta}px`;\n resizeStartXRef.current = e.clientX;\n\n // Update stored widths (convert pixel delta to twips: 1px ≈ 15 twips at 96dpi)\n const deltaTwips = Math.round(delta * 15);\n const minWidth = 300; // ~0.2 inches minimum\n const newLeft = resizeOrigWidthsRef.current.left + deltaTwips;\n const newRight = resizeOrigWidthsRef.current.right - deltaTwips;\n if (newLeft >= minWidth && newRight >= minWidth) {\n resizeOrigWidthsRef.current = { left: newLeft, right: newRight };\n }\n }\n return;\n }\n\n // Row resize drag\n if (isResizingRowRef.current) {\n e.preventDefault();\n const delta = e.clientY - resizeStartYRef.current;\n if (resizeRowHandleRef.current) {\n const origTop = parseFloat(resizeRowHandleRef.current.style.top);\n resizeRowHandleRef.current.style.top = `${origTop + delta}px`;\n resizeStartYRef.current = e.clientY;\n\n // Update stored height (convert pixel delta to twips)\n const deltaTwips = Math.round(delta * 15);\n const minHeight = 200; // ~0.14 inches minimum\n const newHeight = resizeRowOrigHeightRef.current + deltaTwips;\n if (newHeight >= minHeight) {\n resizeRowOrigHeightRef.current = newHeight;\n }\n }\n return;\n }\n\n // Right edge resize drag\n if (isResizingRightEdgeRef.current) {\n e.preventDefault();\n const delta = e.clientX - resizeRightEdgeStartXRef.current;\n if (resizeRightEdgeHandleRef.current) {\n const origLeft = parseFloat(resizeRightEdgeHandleRef.current.style.left);\n resizeRightEdgeHandleRef.current.style.left = `${origLeft + delta}px`;\n resizeRightEdgeStartXRef.current = e.clientX;\n\n // Update stored width (convert pixel delta to twips)\n const deltaTwips = Math.round(delta * 15);\n const minWidth = 300; // ~0.2 inches minimum\n const newWidth = resizeRightEdgeOrigWidthRef.current + deltaTwips;\n if (newWidth >= minWidth) {\n resizeRightEdgeOrigWidthRef.current = newWidth;\n }\n }\n return;\n }\n\n if (!isDraggingRef.current || dragAnchorRef.current === null) return;\n if (!hiddenPMRef.current || !pagesContainerRef.current) return;\n\n const pmPos = getPositionFromMouse(e.clientX, e.clientY);\n if (pmPos === null) return;\n\n // Dragging in table cells: text selection first, cell selection when crossing boundary\n if (cellDragAnchorPosRef.current !== null) {\n // If already in cell-drag mode, continue updating cell selection\n if (isCellDraggingRef.current) {\n const currentCellPos = findCellPosFromPmPos(pmPos);\n if (currentCellPos !== null) {\n hiddenPMRef.current.setCellSelection(cellDragAnchorPosRef.current, currentCellPos);\n return;\n }\n }\n\n // Switch to cell selection when drag crosses into a different cell\n const currentCellPos = findCellPosFromPmPos(pmPos);\n if (currentCellPos !== null && currentCellPos !== cellDragAnchorPosRef.current) {\n isCellDraggingRef.current = true;\n hiddenPMRef.current.setCellSelection(cellDragAnchorPosRef.current, currentCellPos);\n cellDragOverflowXRef.current = null;\n return;\n }\n\n // Detect when text selection has maxed out within the cell:\n // If pmPos stops changing but mouse keeps moving, user has dragged past text content\n if (cellDragLastPmPosRef.current !== null && pmPos === cellDragLastPmPosRef.current) {\n if (cellDragOverflowXRef.current === null) {\n cellDragOverflowXRef.current = e.clientX;\n } else if (\n Math.abs(e.clientX - cellDragOverflowXRef.current) >= CELL_SELECT_OVERFLOW_PX\n ) {\n // Overflow threshold reached — select the entire cell\n isCellDraggingRef.current = true;\n hiddenPMRef.current.setCellSelection(\n cellDragAnchorPosRef.current,\n cellDragAnchorPosRef.current\n );\n cellDragOverflowXRef.current = null;\n return;\n }\n } else {\n // Position is still advancing — reset overflow tracking\n cellDragOverflowXRef.current = null;\n cellDragLastPmPosRef.current = pmPos;\n }\n }\n\n // Regular text selection drag (within cell or outside tables)\n const anchor = dragAnchorRef.current;\n hiddenPMRef.current.setSelection(anchor, pmPos);\n },\n [getPositionFromMouse, findCellPosFromPmPos]\n );\n\n /**\n * Handle mouseup - end drag selection.\n */\n const handleMouseUp = useCallback(() => {\n // Commit column resize\n if (isResizingColumnRef.current) {\n isResizingColumnRef.current = false;\n if (resizeHandleRef.current) {\n resizeHandleRef.current.classList.remove('dragging');\n resizeHandleRef.current = null;\n }\n\n // Update ProseMirror document with new column widths\n const view = hiddenPMRef.current?.getView();\n if (view) {\n const pmStart = resizeTablePmStartRef.current;\n const colIdx = resizeColumnIndexRef.current;\n const { left: newLeft, right: newRight } = resizeOrigWidthsRef.current;\n\n // Find the table node and update columnWidths + cell widths\n const $pos = view.state.doc.resolve(pmStart + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n const tablePos = $pos.before(d);\n const tr = view.state.tr;\n const widths = [...(node.attrs.columnWidths as number[])];\n widths[colIdx] = newLeft;\n widths[colIdx + 1] = newRight;\n\n // Update table columnWidths attr\n tr.setNodeMarkup(tablePos, undefined, {\n ...node.attrs,\n columnWidths: widths,\n });\n\n // Update cell width attrs in each row\n let rowOffset = tablePos + 1;\n node.forEach((row) => {\n let cellOffset = rowOffset + 1;\n let cellColIdx = 0;\n row.forEach((cell) => {\n const colspan = (cell.attrs.colspan as number) || 1;\n if (cellColIdx === colIdx || cellColIdx === colIdx + 1) {\n const newWidth = cellColIdx === colIdx ? newLeft : newRight;\n tr.setNodeMarkup(tr.mapping.map(cellOffset), undefined, {\n ...cell.attrs,\n width: newWidth,\n widthType: 'dxa',\n colwidth: null,\n });\n }\n cellOffset += cell.nodeSize;\n cellColIdx += colspan;\n });\n rowOffset += row.nodeSize;\n });\n\n view.dispatch(tr);\n break;\n }\n }\n }\n return;\n }\n\n // Commit row resize\n if (isResizingRowRef.current) {\n isResizingRowRef.current = false;\n if (resizeRowHandleRef.current) {\n resizeRowHandleRef.current.classList.remove('dragging');\n resizeRowHandleRef.current = null;\n }\n\n const view = hiddenPMRef.current?.getView();\n if (view) {\n const pmStart = resizeRowTablePmStartRef.current;\n const rowIdx = resizeRowIndexRef.current;\n const newHeight = resizeRowOrigHeightRef.current;\n\n const $pos = view.state.doc.resolve(pmStart + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n const tablePos = $pos.before(d);\n const tr = view.state.tr;\n\n // Walk to the target row\n let rowOffset = tablePos + 1;\n let idx = 0;\n node.forEach((row) => {\n if (idx === rowIdx) {\n tr.setNodeMarkup(tr.mapping.map(rowOffset), undefined, {\n ...row.attrs,\n height: newHeight,\n heightRule: 'atLeast',\n });\n }\n rowOffset += row.nodeSize;\n idx++;\n });\n\n view.dispatch(tr);\n break;\n }\n }\n }\n return;\n }\n\n // Commit right edge resize\n if (isResizingRightEdgeRef.current) {\n isResizingRightEdgeRef.current = false;\n if (resizeRightEdgeHandleRef.current) {\n resizeRightEdgeHandleRef.current.classList.remove('dragging');\n resizeRightEdgeHandleRef.current = null;\n }\n\n const view = hiddenPMRef.current?.getView();\n if (view) {\n const pmStart = resizeRightEdgePmStartRef.current;\n const colIdx = resizeRightEdgeColIndexRef.current;\n const newWidth = resizeRightEdgeOrigWidthRef.current;\n\n const $pos = view.state.doc.resolve(pmStart + 1);\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'table') {\n const tablePos = $pos.before(d);\n const tr = view.state.tr;\n\n // Update columnWidths — only change last column\n const widths = [...(node.attrs.columnWidths as number[])];\n widths[colIdx] = newWidth;\n\n tr.setNodeMarkup(tablePos, undefined, {\n ...node.attrs,\n columnWidths: widths,\n });\n\n // Update cell width attrs in the last column of each row\n let rowOffset = tablePos + 1;\n node.forEach((row) => {\n let cellOffset = rowOffset + 1;\n let cellColIdx = 0;\n row.forEach((cell) => {\n const colspan = (cell.attrs.colspan as number) || 1;\n if (cellColIdx === colIdx) {\n tr.setNodeMarkup(tr.mapping.map(cellOffset), undefined, {\n ...cell.attrs,\n width: newWidth,\n widthType: 'dxa',\n colwidth: null,\n });\n }\n cellOffset += cell.nodeSize;\n cellColIdx += colspan;\n });\n rowOffset += row.nodeSize;\n });\n\n view.dispatch(tr);\n break;\n }\n }\n }\n return;\n }\n\n isDraggingRef.current = false;\n isCellDraggingRef.current = false;\n cellDragLastPmPosRef.current = null;\n cellDragOverflowXRef.current = null;\n // Keep dragAnchorRef for potential shift-click extension\n }, []);\n\n // Add global mouse event listeners for drag selection\n useEffect(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseMove, handleMouseUp]);\n\n /**\n * Handle click on pages container (for double-click word selection).\n */\n const handlePagesClick = useCallback(\n (e: React.MouseEvent) => {\n // Intercept internal anchor link clicks (TOC entries, cross-references)\n const anchorEl = (e.target as HTMLElement).closest('a[href^=\"#\"]');\n if (anchorEl) {\n e.preventDefault();\n e.stopPropagation();\n const bookmarkName = anchorEl.getAttribute('href')?.substring(1);\n if (bookmarkName && hiddenPMRef.current) {\n const view = hiddenPMRef.current.getView();\n if (view) {\n // Walk PM doc to find the paragraph with matching bookmark\n let targetPos: number | null = null;\n view.state.doc.descendants((node, pos) => {\n if (targetPos !== null) return false; // stop once found\n if (node.type.name === 'paragraph') {\n const bookmarks = node.attrs.bookmarks as\n | Array<{ id: number; name: string }>\n | undefined;\n if (bookmarks?.some((b) => b.name === bookmarkName)) {\n targetPos = pos;\n return false;\n }\n }\n });\n if (targetPos !== null) {\n scrollToPositionImpl(targetPos);\n // Also move selection to the heading\n hiddenPMRef.current.setSelection(targetPos + 1);\n }\n }\n }\n return;\n }\n\n // Double-click on header/footer area triggers editing mode\n if (e.detail === 2 && onHeaderFooterDoubleClick) {\n const target = e.target as HTMLElement;\n const headerEl = target.closest('.layout-page-header');\n const footerEl = target.closest('.layout-page-footer');\n if (headerEl) {\n e.preventDefault();\n e.stopPropagation();\n onHeaderFooterDoubleClick('header');\n return;\n }\n if (footerEl) {\n e.preventDefault();\n e.stopPropagation();\n onHeaderFooterDoubleClick('footer');\n return;\n }\n }\n\n // Double-click: select entire cell (CellSelection) if in table, otherwise word selection\n if (e.detail === 2 && hiddenPMRef.current) {\n const pmPos = getPositionFromMouse(e.clientX, e.clientY);\n if (pmPos !== null) {\n // If inside a table cell, select the entire cell\n const cellPos = findCellPosFromPmPos(pmPos);\n if (cellPos !== null) {\n e.preventDefault();\n e.stopPropagation();\n hiddenPMRef.current.setCellSelection(cellPos, cellPos);\n return;\n }\n\n const view = hiddenPMRef.current.getView();\n if (view) {\n const { doc } = view.state;\n const $pos = doc.resolve(pmPos);\n const parent = $pos.parent;\n\n // Find word boundaries\n if (parent.isTextblock) {\n const text = parent.textContent;\n const offset = $pos.parentOffset;\n\n // Find word start (go back until whitespace/punctuation)\n let start = offset;\n while (start > 0 && /\\w/.test(text[start - 1])) {\n start--;\n }\n\n // Find word end (go forward until whitespace/punctuation)\n let end = offset;\n while (end < text.length && /\\w/.test(text[end])) {\n end++;\n }\n\n // Convert to absolute positions\n const absStart = $pos.start() + start;\n const absEnd = $pos.start() + end;\n\n if (absStart < absEnd) {\n hiddenPMRef.current.setSelection(absStart, absEnd);\n }\n }\n }\n }\n }\n // Triple-click for paragraph selection\n if (e.detail === 3 && hiddenPMRef.current) {\n const pmPos = getPositionFromMouse(e.clientX, e.clientY);\n if (pmPos !== null) {\n const view = hiddenPMRef.current.getView();\n if (view) {\n const { doc } = view.state;\n const $pos = doc.resolve(pmPos);\n\n // Find paragraph start and end\n const paragraphStart = $pos.start($pos.depth);\n const paragraphEnd = $pos.end($pos.depth);\n\n hiddenPMRef.current.setSelection(paragraphStart, paragraphEnd);\n }\n }\n }\n },\n [getPositionFromMouse, onHeaderFooterDoubleClick]\n );\n\n /**\n * Handle focus on container - redirect to hidden PM.\n */\n const handleContainerFocus = useCallback(() => {\n if (readOnly) return;\n hiddenPMRef.current?.focus();\n setIsFocused(true);\n }, [readOnly]);\n\n /**\n * Handle blur from container.\n */\n const handleContainerBlur = useCallback((e: React.FocusEvent) => {\n // Check if focus is moving to hidden PM or staying within container\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (relatedTarget && containerRef.current?.contains(relatedTarget)) {\n return; // Focus staying within editor\n }\n setIsFocused(false);\n }, []);\n\n /**\n * Handle image resize from the overlay.\n */\n const handleImageResize = useCallback((pmPos: number, newWidth: number, newHeight: number) => {\n const view = hiddenPMRef.current?.getView();\n if (!view) return;\n\n try {\n const node = view.state.doc.nodeAt(pmPos);\n if (!node || node.type.name !== 'image') return;\n\n const tr = view.state.tr.setNodeMarkup(pmPos, undefined, {\n ...node.attrs,\n width: newWidth,\n height: newHeight,\n });\n view.dispatch(tr);\n\n // Re-select the image after resize\n hiddenPMRef.current?.setNodeSelection(pmPos);\n } catch {\n // Position may have changed during resize\n }\n }, []);\n\n /**\n * Handle image resize start - prevent text selection during resize.\n */\n const handleImageResizeStart = useCallback(() => {\n isImageInteractingRef.current = true;\n }, []);\n\n /**\n * Handle image resize end.\n */\n const handleImageResizeEnd = useCallback(() => {\n isImageInteractingRef.current = false;\n }, []);\n\n /**\n * Handle image drag-to-move: move image node from its current position\n * to the drop position determined by mouse coordinates.\n */\n const handleImageDragMove = useCallback(\n (pmPos: number, clientX: number, clientY: number) => {\n const view = hiddenPMRef.current?.getView();\n if (!view) return;\n\n try {\n const node = view.state.doc.nodeAt(pmPos);\n if (!node || node.type.name !== 'image') return;\n\n const isFloating =\n node.attrs.displayMode === 'float' ||\n (node.attrs.wrapType &&\n ['square', 'tight', 'through'].includes(node.attrs.wrapType as string));\n\n if (isFloating) {\n // For floating images: update position attributes so the image\n // moves to the drop point while staying floating.\n // Find the page under the drop point\n const pages = pagesContainerRef.current?.querySelectorAll('.layout-page');\n if (!pages || pages.length === 0) return;\n\n let contentEl: HTMLElement | null = null;\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n if (clientY >= rect.top && clientY <= rect.bottom) {\n contentEl = page.querySelector('.layout-page-content') as HTMLElement;\n break;\n }\n }\n if (!contentEl) {\n // Fallback to last page if below all pages\n contentEl = pages[pages.length - 1].querySelector(\n '.layout-page-content'\n ) as HTMLElement;\n }\n if (!contentEl) return;\n\n const contentRect = contentEl.getBoundingClientRect();\n // Convert drop coordinates to content-area-relative pixels\n const dropX = (clientX - contentRect.left) / zoom;\n const dropY = (clientY - contentRect.top) / zoom;\n // Pixels to EMU: px * 914400 / 96\n const PIXELS_TO_EMU = 914400 / 96;\n const hOffsetEmu = Math.round(dropX * PIXELS_TO_EMU);\n const vOffsetEmu = Math.round(dropY * PIXELS_TO_EMU);\n\n const newPosition = {\n horizontal: { posOffset: hOffsetEmu, relativeTo: 'margin' },\n vertical: { posOffset: vOffsetEmu, relativeTo: 'margin' },\n };\n\n const tr = view.state.tr.setNodeMarkup(pmPos, undefined, {\n ...node.attrs,\n position: newPosition,\n });\n view.dispatch(tr);\n hiddenPMRef.current?.setNodeSelection(pmPos);\n } else {\n // For inline images: move to the drop text position\n const dropPos = getPositionFromMouse(clientX, clientY);\n if (dropPos === null) return;\n if (dropPos === pmPos || dropPos === pmPos + 1) return;\n\n let tr = view.state.tr;\n\n if (dropPos <= pmPos) {\n tr = tr.delete(pmPos, pmPos + node.nodeSize);\n tr = tr.insert(dropPos, node);\n hiddenPMRef.current?.setNodeSelection(dropPos);\n } else {\n tr = tr.delete(pmPos, pmPos + node.nodeSize);\n const adjusted = dropPos - node.nodeSize;\n tr = tr.insert(Math.min(adjusted, tr.doc.content.size), node);\n hiddenPMRef.current?.setNodeSelection(Math.min(adjusted, tr.doc.content.size - 1));\n }\n\n view.dispatch(tr);\n }\n } catch {\n // Position may be invalid\n }\n },\n [getPositionFromMouse, zoom]\n );\n\n const handleImageDragStart = useCallback(() => {\n isImageInteractingRef.current = true;\n }, []);\n\n const handleImageDragEnd = useCallback(() => {\n isImageInteractingRef.current = false;\n }, []);\n\n /**\n * Handle keyboard events on container.\n * Most keyboard handling is done by ProseMirror, but we intercept\n * specific keys for navigation and ensure focus stays on hidden PM.\n */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (readOnly) return;\n // Ensure hidden PM is focused if user types\n if (!hiddenPMRef.current?.isFocused()) {\n hiddenPMRef.current?.focus();\n setIsFocused(true);\n }\n\n // Prevent space from scrolling the container - let PM handle it as text input\n if (e.key === ' ' && !e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n // Forward to hidden PM by dispatching a native event\n const view = hiddenPMRef.current?.getView();\n if (view) {\n // Insert space text via PM transaction\n const { state, dispatch } = view;\n dispatch(state.tr.insertText(' '));\n }\n return;\n }\n\n // PageUp/PageDown - let container handle scrolling\n if (['PageUp', 'PageDown'].includes(e.key) && !e.metaKey && !e.ctrlKey) {\n // Let PM handle the cursor movement first\n // If PM doesn't handle it (at bounds), the container will scroll\n }\n\n // Cmd/Ctrl+Home - scroll to top and move cursor to start\n if (e.key === 'Home' && (e.metaKey || e.ctrlKey)) {\n if (containerRef.current) {\n containerRef.current.scrollTop = 0;\n }\n }\n\n // Cmd/Ctrl+End - scroll to bottom and move cursor to end\n if (e.key === 'End' && (e.metaKey || e.ctrlKey)) {\n if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }\n },\n [readOnly]\n );\n\n /**\n * Handle mousedown on container (outside pages).\n */\n const handleContainerMouseDown = useCallback(() => {\n if (readOnly) return;\n // Focus hidden PM if clicking outside pages area\n if (!hiddenPMRef.current?.isFocused()) {\n hiddenPMRef.current?.focus();\n setIsFocused(true);\n }\n }, [readOnly]);\n\n // =========================================================================\n // Initial Layout\n // =========================================================================\n\n /**\n * Run initial layout when document or view changes.\n */\n const handleEditorViewReady = useCallback(\n (view: EditorView) => {\n runLayoutPipeline(view.state);\n updateSelectionOverlay(view.state);\n\n // Auto-focus the editor so the user can start typing immediately\n if (!readOnly) {\n // Use requestAnimationFrame to ensure DOM is ready\n requestAnimationFrame(() => {\n view.focus();\n setIsFocused(true);\n });\n }\n },\n [runLayoutPipeline, updateSelectionOverlay, readOnly]\n );\n\n // Re-layout when web fonts finish loading to fix measurements that were\n // computed against fallback fonts during initial render.\n // Uses FontFaceSet.onloadingdone to detect when new fonts complete loading.\n useEffect(() => {\n const handleFontsLoaded = () => {\n const view = hiddenPMRef.current?.getView();\n if (view) {\n // Clear all cached measurements — font metrics have changed\n resetCanvasContext();\n clearAllCaches();\n runLayoutPipeline(view.state);\n updateSelectionOverlay(view.state);\n }\n };\n\n // Listen for font loading completion events\n window.document.fonts.addEventListener('loadingdone', handleFontsLoaded);\n return () => {\n window.document.fonts.removeEventListener('loadingdone', handleFontsLoaded);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Re-layout when header/footer content changes (e.g., after HF editor save).\n // runLayoutPipeline includes headerContent/footerContent in its deps, but it\n // only runs when explicitly called — this effect triggers it.\n const headerFooterEpochRef = useRef(0);\n useEffect(() => {\n // Skip the initial render — handleEditorViewReady already does the first layout\n if (headerFooterEpochRef.current === 0) {\n headerFooterEpochRef.current = 1;\n return;\n }\n const view = hiddenPMRef.current?.getView();\n if (view) {\n runLayoutPipeline(view.state);\n }\n }, [headerContent, footerContent, runLayoutPipeline]);\n\n // Re-compute selection overlay when the container resizes.\n // Page elements shift during window resize (centering, scrollbar changes),\n // causing caret/selection coordinates to become stale.\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver(() => {\n const state = hiddenPMRef.current?.getState();\n if (state) {\n updateSelectionOverlay(state);\n }\n });\n\n observer.observe(container);\n return () => observer.disconnect();\n }, [updateSelectionOverlay]);\n\n // =========================================================================\n // Imperative Handle\n // =========================================================================\n\n useImperativeHandle(\n ref,\n () => ({\n getDocument() {\n return hiddenPMRef.current?.getDocument() ?? null;\n },\n getState() {\n return hiddenPMRef.current?.getState() ?? null;\n },\n getView() {\n return hiddenPMRef.current?.getView() ?? null;\n },\n focus() {\n hiddenPMRef.current?.focus();\n setIsFocused(true);\n },\n blur() {\n hiddenPMRef.current?.blur();\n setIsFocused(false);\n },\n isFocused() {\n return hiddenPMRef.current?.isFocused() ?? false;\n },\n dispatch(tr: Transaction) {\n hiddenPMRef.current?.dispatch(tr);\n },\n undo() {\n return hiddenPMRef.current?.undo() ?? false;\n },\n redo() {\n return hiddenPMRef.current?.redo() ?? false;\n },\n setSelection(anchor: number, head?: number) {\n hiddenPMRef.current?.setSelection(anchor, head);\n },\n getLayout() {\n return layout;\n },\n relayout() {\n const state = hiddenPMRef.current?.getState();\n if (state) {\n runLayoutPipeline(state);\n }\n },\n scrollToPosition: scrollToPositionImpl,\n }),\n [layout, runLayoutPipeline, scrollToPositionImpl]\n );\n\n // Update selection overlay when layout changes\n // This is needed because handleEditorViewReady calls runLayoutPipeline which\n // sets layout asynchronously, so updateSelectionOverlay would return early\n // if layout is still null. This effect ensures we update once layout is ready.\n useEffect(() => {\n const state = hiddenPMRef.current?.getState();\n if (layout && state) {\n updateSelectionOverlay(state);\n }\n }, [layout, updateSelectionOverlay]);\n\n // Notify when ready\n // Notify when ready - use ref for callback to prevent infinite loops\n useEffect(() => {\n if (onReadyRef.current && hiddenPMRef.current) {\n onReadyRef.current({\n getDocument: () => hiddenPMRef.current?.getDocument() ?? null,\n getState: () => hiddenPMRef.current?.getState() ?? null,\n getView: () => hiddenPMRef.current?.getView() ?? null,\n focus: () => {\n hiddenPMRef.current?.focus();\n setIsFocused(true);\n },\n blur: () => {\n hiddenPMRef.current?.blur();\n setIsFocused(false);\n },\n isFocused: () => hiddenPMRef.current?.isFocused() ?? false,\n dispatch: (tr) => hiddenPMRef.current?.dispatch(tr),\n undo: () => hiddenPMRef.current?.undo() ?? false,\n redo: () => hiddenPMRef.current?.redo() ?? false,\n setSelection: (anchor, head) => hiddenPMRef.current?.setSelection(anchor, head),\n getLayout: () => layout,\n relayout: () => {\n const state = hiddenPMRef.current?.getState();\n if (state) {\n runLayoutPipeline(state);\n }\n },\n scrollToPosition: scrollToPositionImpl,\n });\n }\n }, [layout, runLayoutPipeline]);\n // NOTE: onReady removed from dependencies - accessed via ref to prevent infinite loops\n\n // =========================================================================\n // Render\n // =========================================================================\n\n // Calculate total height for scroll\n const totalHeight = useMemo(() => {\n if (!layout) return DEFAULT_PAGE_HEIGHT + 48;\n const numPages = layout.pages.length;\n return numPages * pageSize.h + (numPages - 1) * pageGap + 48;\n }, [layout, pageSize.h, pageGap]);\n\n return (\n <div\n ref={containerRef}\n className={`ep-root paged-editor ${className ?? ''}`}\n style={{ ...containerStyles, ...style }}\n tabIndex={0}\n onFocus={handleContainerFocus}\n onBlur={handleContainerBlur}\n onKeyDown={handleKeyDown}\n onMouseDown={handleContainerMouseDown}\n >\n {/* Hidden ProseMirror for keyboard input */}\n <HiddenProseMirror\n ref={hiddenPMRef}\n document={document}\n styles={styles}\n widthPx={contentWidth}\n readOnly={readOnly}\n onTransaction={handleTransaction}\n onSelectionChange={handleSelectionChange}\n externalPlugins={externalPlugins}\n extensionManager={extensionManager}\n onEditorViewReady={handleEditorViewReady}\n onKeyDown={handlePMKeyDown}\n />\n\n {/* Viewport for visible pages */}\n <div\n style={{\n ...viewportStyles,\n minHeight: totalHeight,\n transform: zoom !== 1 ? `scale(${zoom})` : undefined,\n transformOrigin: 'top center',\n }}\n >\n {/* Pages container */}\n <div\n ref={pagesContainerRef}\n className={`paged-editor__pages${hfEditMode ? ` paged-editor--hf-editing paged-editor--editing-${hfEditMode}` : ''}`}\n style={pagesContainerStyles}\n onMouseDown={handlePagesMouseDown}\n onClick={handlePagesClick}\n aria-hidden=\"true\" // Visual only, PM provides semantic content\n />\n\n {/* Selection overlay */}\n <SelectionOverlay\n selectionRects={selectionRects}\n caretPosition={caretPosition}\n isFocused={isFocused}\n pageGap={pageGap}\n readOnly={readOnly}\n />\n\n {/* Image selection overlay */}\n <ImageSelectionOverlay\n imageInfo={selectedImageInfo}\n zoom={zoom}\n isFocused={isFocused}\n onResize={handleImageResize}\n onResizeStart={handleImageResizeStart}\n onResizeEnd={handleImageResizeEnd}\n onDragMove={handleImageDragMove}\n onDragStart={handleImageDragStart}\n onDragEnd={handleImageDragEnd}\n />\n\n {/* Plugin overlays (highlights, annotations) */}\n {pluginOverlays && (\n <div className=\"paged-editor__plugin-overlays\" style={pluginOverlaysStyles}>\n {pluginOverlays}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nexport const PagedEditor = memo(PagedEditorComponent);\n\nexport default PagedEditor;\n","/**\n * DocxEditor Component\n *\n * Main component integrating all editor features:\n * - Toolbar for formatting\n * - ProseMirror-based editor for content editing\n * - Zoom control\n * - Error boundary\n * - Loading states\n */\n\nimport {\n useRef,\n useCallback,\n useState,\n useEffect,\n useMemo,\n forwardRef,\n useImperativeHandle,\n lazy,\n Suspense,\n} from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { Document, Theme, HeaderFooter } from '@eigenpal/docx-core/types/document';\n\nimport { Toolbar, type SelectionFormatting, type FormattingAction } from './Toolbar';\nimport { pointsToHalfPoints } from './ui/FontSizePicker';\nimport { DocumentOutline } from './DocumentOutline';\nimport type { HeadingInfo } from '@eigenpal/docx-core/utils/headingCollector';\nimport { ErrorBoundary, ErrorProvider } from './ErrorBoundary';\nimport type { TableAction } from './ui/TableToolbar';\nimport { mapHexToHighlightName } from './toolbarUtils';\nimport {\n PageNumberIndicator,\n type PageIndicatorPosition,\n type PageIndicatorVariant,\n} from './ui/PageNumberIndicator';\nimport {\n PageNavigator,\n type PageNavigatorPosition,\n type PageNavigatorVariant,\n} from './ui/PageNavigator';\nimport { HorizontalRuler } from './ui/HorizontalRuler';\nimport { VerticalRuler } from './ui/VerticalRuler';\nimport { type PrintOptions } from './ui/PrintPreview';\n// Dialog hooks and utilities (static imports — lightweight, no UI)\nimport {\n useFindReplace,\n findInDocument,\n scrollToMatch,\n type FindMatch,\n type FindOptions,\n type FindResult,\n} from './dialogs/FindReplaceDialog';\nimport { useHyperlinkDialog, type HyperlinkData } from './dialogs/HyperlinkDialog';\nimport type { ImagePositionData } from './dialogs/ImagePositionDialog';\nimport type { ImagePropertiesData } from './dialogs/ImagePropertiesDialog';\nimport {\n InlineHeaderFooterEditor,\n type InlineHeaderFooterEditorRef,\n} from './InlineHeaderFooterEditor';\n\n// Dialog components (lazy-loaded — only fetched when first opened)\nconst FindReplaceDialog = lazy(() => import('./dialogs/FindReplaceDialog'));\nconst HyperlinkDialog = lazy(() => import('./dialogs/HyperlinkDialog'));\nconst TablePropertiesDialog = lazy(() =>\n import('./dialogs/TablePropertiesDialog').then((m) => ({ default: m.TablePropertiesDialog }))\n);\nconst ImagePositionDialog = lazy(() =>\n import('./dialogs/ImagePositionDialog').then((m) => ({ default: m.ImagePositionDialog }))\n);\nconst ImagePropertiesDialog = lazy(() =>\n import('./dialogs/ImagePropertiesDialog').then((m) => ({ default: m.ImagePropertiesDialog }))\n);\nconst FootnotePropertiesDialog = lazy(() =>\n import('./dialogs/FootnotePropertiesDialog').then((m) => ({\n default: m.FootnotePropertiesDialog,\n }))\n);\nimport { MaterialSymbol } from './ui/Icons';\nimport { getBuiltinTableStyle, type TableStylePreset } from './ui/TableStyleGallery';\nimport { DocumentAgent } from '@eigenpal/docx-core/agent/DocumentAgent';\nimport { DefaultLoadingIndicator, DefaultPlaceholder, ParseError } from './DocxEditorHelpers';\nimport { parseDocx } from '@eigenpal/docx-core/docx/parser';\nimport { type DocxInput } from '@eigenpal/docx-core/utils/docxInput';\nimport { onFontsLoaded, loadDocumentFonts } from '@eigenpal/docx-core/utils/fontLoader';\nimport { executeCommand } from '@eigenpal/docx-core/agent/executor';\nimport { useTableSelection } from '../hooks/useTableSelection';\nimport { useDocumentHistory } from '../hooks/useHistory';\n\n// Extension system\nimport { createStarterKit } from '@eigenpal/docx-core/prosemirror/extensions/StarterKit';\nimport { ExtensionManager } from '@eigenpal/docx-core/prosemirror/extensions/ExtensionManager';\n\n// Conversion (for HF inline editor save)\nimport { proseDocToBlocks } from '@eigenpal/docx-core/prosemirror/conversion/fromProseDoc';\n\n// ProseMirror editor\nimport {\n type SelectionState,\n TextSelection,\n extractSelectionState,\n toggleBold,\n toggleItalic,\n toggleUnderline,\n toggleStrike,\n toggleSuperscript,\n toggleSubscript,\n setTextColor,\n setHighlight,\n setFontSize,\n setFontFamily,\n setAlignment,\n setLineSpacing,\n toggleBulletList,\n toggleNumberedList,\n increaseIndent,\n decreaseIndent,\n setIndentLeft,\n setIndentRight,\n setIndentFirstLine,\n removeTabStop,\n increaseListLevel,\n decreaseListLevel,\n clearFormatting,\n applyStyle,\n createStyleResolver,\n // Hyperlink commands\n getHyperlinkAttrs,\n getSelectedText,\n setHyperlink,\n removeHyperlink,\n insertHyperlink,\n // Page break command\n insertPageBreak,\n // Table of Contents command\n generateTOC,\n // Table commands\n getTableContext,\n insertTable,\n addRowAbove,\n addRowBelow,\n deleteRow as pmDeleteRow,\n addColumnLeft,\n addColumnRight,\n deleteColumn as pmDeleteColumn,\n deleteTable as pmDeleteTable,\n selectTable as pmSelectTable,\n selectRow as pmSelectRow,\n selectColumn as pmSelectColumn,\n mergeCells as pmMergeCells,\n splitCell as pmSplitCell,\n setCellBorder,\n setCellVerticalAlign,\n setCellMargins,\n setCellTextDirection,\n toggleNoWrap,\n setRowHeight,\n toggleHeaderRow,\n distributeColumns,\n autoFitContents,\n setTableProperties,\n applyTableStyle,\n removeTableBorders,\n setAllTableBorders,\n setOutsideTableBorders,\n setInsideTableBorders,\n setCellFillColor,\n setTableBorderColor,\n setTableBorderWidth,\n type TableContextInfo,\n} from '@eigenpal/docx-core/prosemirror';\nimport { collectHeadings } from '@eigenpal/docx-core/utils/headingCollector';\n\n// Paginated editor\nimport { PagedEditor, type PagedEditorRef } from '../paged-editor/PagedEditor';\n\n// Plugin API types\nimport type { RenderedDomContext } from '../plugin-api/types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * DocxEditor props\n */\nexport interface DocxEditorProps {\n /** Document data — ArrayBuffer, Uint8Array, Blob, or File */\n documentBuffer?: DocxInput | null;\n /** Pre-parsed document (alternative to documentBuffer) */\n document?: Document | null;\n /** Callback when document is saved */\n onSave?: (buffer: ArrayBuffer) => void;\n /** Callback when document changes */\n onChange?: (document: Document) => void;\n /** Callback when selection changes */\n onSelectionChange?: (state: SelectionState | null) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback when fonts are loaded */\n onFontsLoaded?: () => void;\n /** External ProseMirror plugins (from PluginHost) */\n externalPlugins?: import('prosemirror-state').Plugin[];\n /** Callback when editor view is ready (for PluginHost) */\n onEditorViewReady?: (view: import('prosemirror-view').EditorView) => void;\n /** Theme for styling */\n theme?: Theme | null;\n /** Whether to show toolbar (default: true) */\n showToolbar?: boolean;\n /** Whether to show zoom control (default: true) */\n showZoomControl?: boolean;\n /** Whether to show page number indicator (default: true) */\n showPageNumbers?: boolean;\n /** Whether to enable interactive page navigation (default: true) */\n enablePageNavigation?: boolean;\n /** Position of page number indicator (default: 'bottom-center') */\n pageNumberPosition?: PageIndicatorPosition | PageNavigatorPosition;\n /** Variant of page number indicator (default: 'default') */\n pageNumberVariant?: PageIndicatorVariant | PageNavigatorVariant;\n /** Whether to show page margin guides/boundaries (default: false) */\n showMarginGuides?: boolean;\n /** Color for margin guides (default: '#c0c0c0') */\n marginGuideColor?: string;\n /** Whether to show horizontal ruler (default: false) */\n showRuler?: boolean;\n /** Unit for ruler display (default: 'inch') */\n rulerUnit?: 'inch' | 'cm';\n /** Initial zoom level (default: 1.0) */\n initialZoom?: number;\n /** Whether the editor is read-only. When true, hides toolbar and rulers */\n readOnly?: boolean;\n /** Custom toolbar actions */\n toolbarExtra?: ReactNode;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Placeholder when no document */\n placeholder?: ReactNode;\n /** Loading indicator */\n loadingIndicator?: ReactNode;\n /** Whether to show the document outline sidebar (default: false) */\n showOutline?: boolean;\n /** Whether to show print button in toolbar (default: true) */\n showPrintButton?: boolean;\n /** Print options for print preview */\n printOptions?: PrintOptions;\n /** Callback when print is triggered */\n onPrint?: () => void;\n /** Callback when content is copied */\n onCopy?: () => void;\n /** Callback when content is cut */\n onCut?: () => void;\n /** Callback when content is pasted */\n onPaste?: () => void;\n /**\n * Callback when rendered DOM context is ready (for plugin overlays).\n * Used by PluginHost to get access to the rendered page DOM for positioning.\n */\n onRenderedDomContextReady?: (context: RenderedDomContext) => void;\n /**\n * Plugin overlays to render inside the editor viewport.\n * Passed from PluginHost to render plugin-specific overlays.\n */\n pluginOverlays?: ReactNode;\n}\n\n/**\n * DocxEditor ref interface\n */\nexport interface DocxEditorRef {\n /** Get the DocumentAgent for programmatic access */\n getAgent: () => DocumentAgent | null;\n /** Get the current document */\n getDocument: () => Document | null;\n /** Get the editor ref */\n getEditorRef: () => PagedEditorRef | null;\n /** Save the document to buffer */\n save: () => Promise<ArrayBuffer | null>;\n /** Set zoom level */\n setZoom: (zoom: number) => void;\n /** Get current zoom level */\n getZoom: () => number;\n /** Focus the editor */\n focus: () => void;\n /** Get current page number */\n getCurrentPage: () => number;\n /** Get total page count */\n getTotalPages: () => number;\n /** Scroll to a specific page */\n scrollToPage: (pageNumber: number) => void;\n /** Open print preview */\n openPrintPreview: () => void;\n /** Print the document directly */\n print: () => void;\n}\n\n/**\n * Editor internal state\n */\ninterface EditorState {\n isLoading: boolean;\n parseError: string | null;\n zoom: number;\n /** Current selection formatting for toolbar */\n selectionFormatting: SelectionFormatting;\n /** Current page number (1-indexed) */\n currentPage: number;\n /** Total page count */\n totalPages: number;\n /** Paragraph indent data for ruler */\n paragraphIndentLeft: number;\n paragraphIndentRight: number;\n paragraphFirstLineIndent: number;\n paragraphHangingIndent: boolean;\n paragraphTabs: import('@eigenpal/docx-core/types/document').TabStop[] | null;\n /** ProseMirror table context (for showing table toolbar) */\n pmTableContext: TableContextInfo | null;\n /** Image context when cursor is on an image node */\n pmImageContext: {\n pos: number;\n wrapType: string;\n displayMode: string;\n cssFloat: string | null;\n transform: string | null;\n alt: string | null;\n borderWidth: number | null;\n borderColor: string | null;\n borderStyle: string | null;\n } | null;\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * DocxEditor - Complete DOCX editor component\n */\nexport const DocxEditor = forwardRef<DocxEditorRef, DocxEditorProps>(function DocxEditor(\n {\n documentBuffer,\n document: initialDocument,\n onSave,\n onChange,\n onSelectionChange,\n onError,\n onFontsLoaded: onFontsLoadedCallback,\n theme,\n showToolbar = true,\n showZoomControl = true,\n showPageNumbers = true,\n enablePageNavigation = true,\n pageNumberPosition = 'bottom-center',\n pageNumberVariant = 'default',\n showMarginGuides: _showMarginGuides = false,\n marginGuideColor: _marginGuideColor,\n showRuler = false,\n rulerUnit = 'inch',\n initialZoom = 1.0,\n readOnly = false,\n toolbarExtra,\n className = '',\n style,\n placeholder,\n loadingIndicator,\n showOutline: showOutlineProp = false,\n showPrintButton = true,\n printOptions: _printOptions,\n onPrint,\n onCopy: _onCopy,\n onCut: _onCut,\n onPaste: _onPaste,\n externalPlugins,\n onEditorViewReady,\n onRenderedDomContextReady,\n pluginOverlays,\n },\n ref\n) {\n // State\n const [state, setState] = useState<EditorState>({\n isLoading: !!documentBuffer,\n parseError: null,\n zoom: initialZoom,\n selectionFormatting: {},\n currentPage: 1,\n totalPages: 1,\n paragraphIndentLeft: 0,\n paragraphIndentRight: 0,\n paragraphFirstLineIndent: 0,\n paragraphHangingIndent: false,\n paragraphTabs: null,\n pmTableContext: null,\n pmImageContext: null,\n });\n\n // Table properties dialog state\n const [tablePropsOpen, setTablePropsOpen] = useState(false);\n // Image position dialog state\n const [imagePositionOpen, setImagePositionOpen] = useState(false);\n // Image properties dialog state\n const [imagePropsOpen, setImagePropsOpen] = useState(false);\n // Footnote properties dialog state\n const [footnotePropsOpen, setFootnotePropsOpen] = useState(false);\n // Header/footer editing state\n const [hfEditPosition, setHfEditPosition] = useState<'header' | 'footer' | null>(null);\n // Document outline sidebar state\n const [showOutline, setShowOutline] = useState(showOutlineProp);\n const showOutlineRef = useRef(false);\n showOutlineRef.current = showOutline;\n const [outlineHeadings, setHeadingInfos] = useState<HeadingInfo[]>([]);\n\n // Sync outline visibility when prop changes\n useEffect(() => {\n setShowOutline(showOutlineProp);\n if (showOutlineProp) {\n const view = pagedEditorRef.current?.getView();\n if (view) {\n setHeadingInfos(collectHeadings(view.state.doc));\n }\n }\n }, [showOutlineProp]);\n\n // History hook for undo/redo - start with null document\n const history = useDocumentHistory<Document | null>(initialDocument || null, {\n maxEntries: 100,\n groupingInterval: 500,\n enableKeyboardShortcuts: true,\n });\n\n // Extension manager — built once, provides schema + plugins + commands\n const extensionManager = useMemo(() => {\n const mgr = new ExtensionManager(createStarterKit());\n mgr.buildSchema();\n mgr.initializeRuntime();\n return mgr;\n }, []);\n\n // Refs\n const pagedEditorRef = useRef<PagedEditorRef>(null);\n const hfEditorRef = useRef<InlineHeaderFooterEditorRef>(null);\n const agentRef = useRef<DocumentAgent | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Save the last known selection for restoring after toolbar interactions\n const lastSelectionRef = useRef<{ from: number; to: number } | null>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n const editorContentRef = useRef<HTMLDivElement>(null);\n const toolbarWrapperRef = useRef<HTMLDivElement>(null);\n const toolbarRoRef = useRef<ResizeObserver | null>(null);\n const [toolbarHeight, setToolbarHeight] = useState(0);\n // Keep history.state accessible in stable callbacks without stale closures\n const historyStateRef = useRef(history.state);\n historyStateRef.current = history.state;\n // Track current border color/width for border presets (like Google Docs)\n const borderSpecRef = useRef({ style: 'single', size: 4, color: { rgb: '000000' } });\n\n // Measure toolbar height for positioning the outline panel below it\n const toolbarRefCallback = useCallback((el: HTMLDivElement | null) => {\n toolbarWrapperRef.current = el;\n // Clean up previous observer\n if (toolbarRoRef.current) {\n toolbarRoRef.current.disconnect();\n toolbarRoRef.current = null;\n }\n if (!el) {\n setToolbarHeight(0);\n return;\n }\n setToolbarHeight(el.offsetHeight);\n const ro = new ResizeObserver(() => {\n setToolbarHeight(el.offsetHeight);\n });\n ro.observe(el);\n toolbarRoRef.current = ro;\n }, []);\n\n // Cleanup ResizeObserver on unmount\n useEffect(() => {\n return () => {\n toolbarRoRef.current?.disconnect();\n };\n }, []);\n\n // Helper to get the active editor's view — returns HF editor view when in HF editing mode\n const getActiveEditorView = useCallback(() => {\n if (hfEditPosition && hfEditorRef.current) {\n return hfEditorRef.current.getView();\n }\n return pagedEditorRef.current?.getView();\n }, [hfEditPosition]);\n\n // Helper to focus the active editor\n const focusActiveEditor = useCallback(() => {\n if (hfEditPosition && hfEditorRef.current) {\n hfEditorRef.current.focus();\n } else {\n pagedEditorRef.current?.focus();\n }\n }, [hfEditPosition]);\n\n // Helper to undo in the active editor\n const undoActiveEditor = useCallback(() => {\n if (hfEditPosition && hfEditorRef.current) {\n hfEditorRef.current.undo();\n } else {\n pagedEditorRef.current?.undo();\n }\n }, [hfEditPosition]);\n\n // Helper to redo in the active editor\n const redoActiveEditor = useCallback(() => {\n if (hfEditPosition && hfEditorRef.current) {\n hfEditorRef.current.redo();\n } else {\n pagedEditorRef.current?.redo();\n }\n }, [hfEditPosition]);\n\n // Find/Replace hook\n const findReplace = useFindReplace();\n\n // Hyperlink dialog hook\n const hyperlinkDialog = useHyperlinkDialog();\n\n // Parse document buffer\n useEffect(() => {\n if (!documentBuffer) {\n if (initialDocument) {\n history.reset(initialDocument);\n setState((prev) => ({ ...prev, isLoading: false }));\n // Load fonts for initial document\n loadDocumentFonts(initialDocument).catch((err) => {\n console.warn('Failed to load document fonts:', err);\n });\n }\n return;\n }\n\n setState((prev) => ({ ...prev, isLoading: true, parseError: null }));\n\n const parseDocument = async () => {\n try {\n const doc = await parseDocx(documentBuffer);\n // Reset history with parsed document (clears undo/redo stacks)\n history.reset(doc);\n setState((prev) => ({\n ...prev,\n isLoading: false,\n parseError: null,\n }));\n\n // Load fonts used in the document from Google Fonts\n loadDocumentFonts(doc).catch((err) => {\n console.warn('Failed to load document fonts:', err);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to parse document';\n setState((prev) => ({\n ...prev,\n isLoading: false,\n parseError: message,\n }));\n onError?.(error instanceof Error ? error : new Error(message));\n }\n };\n\n parseDocument();\n }, [documentBuffer, initialDocument, onError]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update document when initialDocument changes\n useEffect(() => {\n if (initialDocument && !documentBuffer) {\n history.reset(initialDocument);\n }\n }, [initialDocument, documentBuffer]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Create/update agent when document changes\n useEffect(() => {\n if (history.state) {\n agentRef.current = new DocumentAgent(history.state);\n } else {\n agentRef.current = null;\n }\n }, [history.state]);\n\n // Listen for font loading\n useEffect(() => {\n const cleanup = onFontsLoaded(() => {\n onFontsLoadedCallback?.();\n });\n return cleanup;\n }, [onFontsLoadedCallback]);\n\n // Handle document change\n const handleDocumentChange = useCallback(\n (newDocument: Document) => {\n history.push(newDocument);\n onChange?.(newDocument);\n // Update outline headings if sidebar is open\n if (showOutlineRef.current) {\n const view = pagedEditorRef.current?.getView();\n if (view) {\n setHeadingInfos(collectHeadings(view.state.doc));\n }\n }\n },\n [onChange, history]\n );\n\n // Handle selection changes from ProseMirror\n const handleSelectionChange = useCallback(\n (selectionState: SelectionState | null) => {\n // Save selection for restoring after toolbar interactions\n const view = getActiveEditorView();\n if (view) {\n const { from, to } = view.state.selection;\n lastSelectionRef.current = { from, to };\n }\n\n // Also check table context from ProseMirror\n let pmTableCtx: TableContextInfo | null = null;\n if (view) {\n pmTableCtx = getTableContext(view.state);\n if (!pmTableCtx.isInTable) {\n pmTableCtx = null;\n }\n }\n\n // Check if cursor is on an image (NodeSelection)\n let pmImageCtx: typeof state.pmImageContext = null;\n if (view) {\n const sel = view.state.selection;\n // NodeSelection has a `node` property\n const selectedNode = (\n sel as { node?: { type: { name: string }; attrs: Record<string, unknown> } }\n ).node;\n if (selectedNode?.type.name === 'image') {\n pmImageCtx = {\n pos: sel.from,\n wrapType: (selectedNode.attrs.wrapType as string) ?? 'inline',\n displayMode: (selectedNode.attrs.displayMode as string) ?? 'inline',\n cssFloat: (selectedNode.attrs.cssFloat as string) ?? null,\n transform: (selectedNode.attrs.transform as string) ?? null,\n alt: (selectedNode.attrs.alt as string) ?? null,\n borderWidth: (selectedNode.attrs.borderWidth as number) ?? null,\n borderColor: (selectedNode.attrs.borderColor as string) ?? null,\n borderStyle: (selectedNode.attrs.borderStyle as string) ?? null,\n };\n }\n }\n\n if (!selectionState) {\n setState((prev) => ({\n ...prev,\n selectionFormatting: {},\n pmTableContext: pmTableCtx,\n pmImageContext: pmImageCtx,\n }));\n return;\n }\n\n // Update toolbar formatting from ProseMirror selection\n const { textFormatting, paragraphFormatting } = selectionState;\n\n // Extract font family (prefer ascii, fall back to hAnsi)\n const fontFamily = textFormatting.fontFamily?.ascii || textFormatting.fontFamily?.hAnsi;\n\n // Extract text color as hex string\n const textColor = textFormatting.color?.rgb ? `#${textFormatting.color.rgb}` : undefined;\n\n // Build list state from numPr\n const numPr = paragraphFormatting.numPr;\n const listState = numPr\n ? {\n type: (numPr.numId === 1 ? 'bullet' : 'numbered') as 'bullet' | 'numbered',\n level: numPr.ilvl ?? 0,\n isInList: true,\n numId: numPr.numId,\n }\n : undefined;\n\n const formatting: SelectionFormatting = {\n bold: textFormatting.bold,\n italic: textFormatting.italic,\n underline: !!textFormatting.underline,\n strike: textFormatting.strike,\n superscript: textFormatting.vertAlign === 'superscript',\n subscript: textFormatting.vertAlign === 'subscript',\n fontFamily,\n fontSize: textFormatting.fontSize,\n color: textColor,\n highlight: textFormatting.highlight,\n alignment: paragraphFormatting.alignment,\n lineSpacing: paragraphFormatting.lineSpacing,\n listState,\n styleId: selectionState.styleId ?? undefined,\n indentLeft: paragraphFormatting.indentLeft,\n };\n setState((prev) => ({\n ...prev,\n selectionFormatting: formatting,\n paragraphIndentLeft: paragraphFormatting.indentLeft ?? 0,\n paragraphIndentRight: paragraphFormatting.indentRight ?? 0,\n paragraphFirstLineIndent: paragraphFormatting.indentFirstLine ?? 0,\n paragraphHangingIndent: paragraphFormatting.hangingIndent ?? false,\n paragraphTabs: paragraphFormatting.tabs ?? null,\n pmTableContext: pmTableCtx,\n pmImageContext: pmImageCtx,\n }));\n\n // Notify parent\n onSelectionChange?.(selectionState);\n },\n [onSelectionChange]\n );\n\n // Table selection hook\n const tableSelection = useTableSelection({\n document: history.state,\n onChange: handleDocumentChange,\n onSelectionChange: (_context) => {\n // Could notify parent of table selection changes\n },\n });\n\n // Keyboard shortcuts for Find/Replace (Ctrl+F, Ctrl+H) and delete table selection\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Check for Ctrl+F (Find) or Ctrl+H (Replace)\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const cmdOrCtrl = isMac ? e.metaKey : e.ctrlKey;\n\n // Delete selected table from layout selection (non-ProseMirror selection)\n if (!cmdOrCtrl && !e.shiftKey && !e.altKey) {\n if (e.key === 'Delete' || e.key === 'Backspace') {\n // If full table is selected via ProseMirror CellSelection, delete it.\n const view = pagedEditorRef.current?.getView();\n if (view) {\n const sel = view.state.selection as { $anchorCell?: unknown; forEachCell?: unknown };\n const isCellSel = '$anchorCell' in sel && typeof sel.forEachCell === 'function';\n if (isCellSel) {\n const context = getTableContext(view.state);\n if (context.isInTable && context.table) {\n let totalCells = 0;\n context.table.descendants((node) => {\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n totalCells += 1;\n }\n });\n let selectedCells = 0;\n (sel as { forEachCell: (fn: () => void) => void }).forEachCell(() => {\n selectedCells += 1;\n });\n if (totalCells > 0 && selectedCells >= totalCells) {\n e.preventDefault();\n pmDeleteTable(view.state, view.dispatch);\n return;\n }\n }\n }\n }\n\n if (tableSelection.state.tableIndex !== null) {\n e.preventDefault();\n tableSelection.handleAction('deleteTable');\n return;\n }\n }\n }\n\n if (cmdOrCtrl && !e.shiftKey && !e.altKey) {\n if (e.key.toLowerCase() === 'f') {\n e.preventDefault();\n // Get selected text if any\n const selection = window.getSelection();\n const selectedText = selection && !selection.isCollapsed ? selection.toString() : '';\n findReplace.openFind(selectedText);\n } else if (e.key.toLowerCase() === 'h') {\n e.preventDefault();\n // Get selected text if any\n const selection = window.getSelection();\n const selectedText = selection && !selection.isCollapsed ? selection.toString() : '';\n findReplace.openReplace(selectedText);\n } else if (e.key.toLowerCase() === 'k') {\n e.preventDefault();\n // Open hyperlink dialog\n const view = pagedEditorRef.current?.getView();\n if (view) {\n const selectedText = getSelectedText(view.state);\n const existingLink = getHyperlinkAttrs(view.state);\n if (existingLink) {\n hyperlinkDialog.openEdit({\n url: existingLink.href,\n displayText: selectedText,\n tooltip: existingLink.tooltip,\n });\n } else {\n hyperlinkDialog.openInsert(selectedText);\n }\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [findReplace, hyperlinkDialog, tableSelection]);\n\n // Handle table insert from toolbar\n const handleInsertTable = useCallback(\n (rows: number, columns: number) => {\n const view = getActiveEditorView();\n if (!view) return;\n insertTable(rows, columns)(view.state, view.dispatch);\n focusActiveEditor();\n },\n [getActiveEditorView, focusActiveEditor]\n );\n\n // Insert a page break at cursor\n const handleInsertPageBreak = useCallback(() => {\n const view = getActiveEditorView();\n if (!view) return;\n insertPageBreak(view.state, view.dispatch);\n focusActiveEditor();\n }, [getActiveEditorView, focusActiveEditor]);\n\n // Insert a table of contents at cursor\n const handleInsertTOC = useCallback(() => {\n const view = getActiveEditorView();\n if (!view) return;\n generateTOC(view.state, view.dispatch);\n focusActiveEditor();\n }, [getActiveEditorView, focusActiveEditor]);\n\n // Toggle document outline sidebar\n const handleToggleOutline = useCallback(() => {\n setShowOutline((prev) => {\n if (!prev) {\n // Opening: collect headings immediately\n const view = pagedEditorRef.current?.getView();\n if (view) {\n setHeadingInfos(collectHeadings(view.state.doc));\n }\n }\n return !prev;\n });\n }, []);\n\n // Navigate to a heading from the outline\n const handleHeadingInfoClick = useCallback((pmPos: number) => {\n pagedEditorRef.current?.scrollToPosition(pmPos);\n // Also set selection to the heading\n pagedEditorRef.current?.setSelection(pmPos + 1);\n pagedEditorRef.current?.focus();\n }, []);\n\n // Trigger file picker for image insert\n const handleInsertImageClick = useCallback(() => {\n imageInputRef.current?.click();\n }, []);\n\n // Handle file selection for image insert\n const handleImageFileChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const view = getActiveEditorView();\n if (!view) return;\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n\n // Create an Image element to get natural dimensions\n const img = new Image();\n img.onload = () => {\n let width = img.naturalWidth;\n let height = img.naturalHeight;\n\n // Constrain to reasonable max width (content area of US Letter page at 96dpi)\n const maxWidth = 612; // ~6.375 inches\n if (width > maxWidth) {\n const scale = maxWidth / width;\n width = maxWidth;\n height = Math.round(height * scale);\n }\n\n const rId = `rId_img_${Date.now()}`;\n const imageNode = view.state.schema.nodes.image.create({\n src: dataUrl,\n alt: file.name,\n width,\n height,\n rId,\n wrapType: 'inline',\n displayMode: 'inline',\n });\n\n const { from } = view.state.selection;\n const tr = view.state.tr.insert(from, imageNode);\n view.dispatch(tr.scrollIntoView());\n focusActiveEditor();\n };\n img.src = dataUrl;\n };\n reader.readAsDataURL(file);\n\n // Reset the input so the same file can be selected again\n e.target.value = '';\n },\n [getActiveEditorView, focusActiveEditor]\n );\n\n // Handle shape insertion\n // Handle image wrap type change\n const handleImageWrapType = useCallback(\n (wrapType: string) => {\n const view = getActiveEditorView();\n if (!view || !state.pmImageContext) return;\n\n const pos = state.pmImageContext.pos;\n const node = view.state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') return;\n\n // Map wrap type to display mode + cssFloat\n let displayMode = 'inline';\n let cssFloat: string | null = null;\n\n switch (wrapType) {\n case 'inline':\n displayMode = 'inline';\n cssFloat = null;\n break;\n case 'square':\n case 'tight':\n case 'through':\n displayMode = 'float';\n cssFloat = 'left';\n break;\n case 'topAndBottom':\n displayMode = 'block';\n cssFloat = null;\n break;\n case 'behind':\n case 'inFront':\n displayMode = 'float';\n cssFloat = 'none';\n break;\n case 'wrapLeft':\n displayMode = 'float';\n cssFloat = 'right';\n wrapType = 'square';\n break;\n case 'wrapRight':\n displayMode = 'float';\n cssFloat = 'left';\n wrapType = 'square';\n break;\n }\n\n const tr = view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n wrapType,\n displayMode,\n cssFloat,\n });\n view.dispatch(tr.scrollIntoView());\n focusActiveEditor();\n },\n [getActiveEditorView, focusActiveEditor, state.pmImageContext]\n );\n\n // Handle image transform (rotate/flip)\n const handleImageTransform = useCallback(\n (action: 'rotateCW' | 'rotateCCW' | 'flipH' | 'flipV') => {\n const view = getActiveEditorView();\n if (!view || !state.pmImageContext) return;\n\n const pos = state.pmImageContext.pos;\n const node = view.state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') return;\n\n const currentTransform = (node.attrs.transform as string) || '';\n\n // Parse current rotation and flip state\n const rotateMatch = currentTransform.match(/rotate\\((-?\\d+(?:\\.\\d+)?)deg\\)/);\n let rotation = rotateMatch ? parseFloat(rotateMatch[1]) : 0;\n let hasFlipH = /scaleX\\(-1\\)/.test(currentTransform);\n let hasFlipV = /scaleY\\(-1\\)/.test(currentTransform);\n\n switch (action) {\n case 'rotateCW':\n rotation = (rotation + 90) % 360;\n break;\n case 'rotateCCW':\n rotation = (rotation - 90 + 360) % 360;\n break;\n case 'flipH':\n hasFlipH = !hasFlipH;\n break;\n case 'flipV':\n hasFlipV = !hasFlipV;\n break;\n }\n\n // Build new transform string\n const parts: string[] = [];\n if (rotation !== 0) parts.push(`rotate(${rotation}deg)`);\n if (hasFlipH) parts.push('scaleX(-1)');\n if (hasFlipV) parts.push('scaleY(-1)');\n const newTransform = parts.length > 0 ? parts.join(' ') : null;\n\n const tr = view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n transform: newTransform,\n });\n view.dispatch(tr.scrollIntoView());\n focusActiveEditor();\n },\n [getActiveEditorView, focusActiveEditor, state.pmImageContext]\n );\n\n // Apply image position changes\n const handleApplyImagePosition = useCallback(\n (data: ImagePositionData) => {\n const view = getActiveEditorView();\n if (!view || !state.pmImageContext) return;\n\n const pos = state.pmImageContext.pos;\n const node = view.state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') return;\n\n const tr = view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n position: {\n horizontal: data.horizontal,\n vertical: data.vertical,\n },\n distTop: data.distTop ?? node.attrs.distTop,\n distBottom: data.distBottom ?? node.attrs.distBottom,\n distLeft: data.distLeft ?? node.attrs.distLeft,\n distRight: data.distRight ?? node.attrs.distRight,\n });\n view.dispatch(tr.scrollIntoView());\n focusActiveEditor();\n },\n [getActiveEditorView, focusActiveEditor, state.pmImageContext]\n );\n\n // Open image properties dialog\n const handleOpenImageProperties = useCallback(() => {\n setImagePropsOpen(true);\n }, []);\n\n // Apply image properties (alt text + border)\n const handleApplyImageProperties = useCallback(\n (data: ImagePropertiesData) => {\n const view = getActiveEditorView();\n if (!view || !state.pmImageContext) return;\n\n const pos = state.pmImageContext.pos;\n const node = view.state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') return;\n\n const tr = view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n alt: data.alt ?? null,\n borderWidth: data.borderWidth ?? null,\n borderColor: data.borderColor ?? null,\n borderStyle: data.borderStyle ?? null,\n });\n view.dispatch(tr.scrollIntoView());\n focusActiveEditor();\n },\n [getActiveEditorView, focusActiveEditor, state.pmImageContext]\n );\n\n // Handle footnote/endnote properties update\n const handleApplyFootnoteProperties = useCallback(\n (\n footnotePr: import('@eigenpal/docx-core/types/document').FootnoteProperties,\n endnotePr: import('@eigenpal/docx-core/types/document').EndnoteProperties\n ) => {\n if (!history.state?.package) return;\n const newDoc = {\n ...history.state.package.document,\n finalSectionProperties: {\n ...history.state.package.document.finalSectionProperties,\n footnotePr,\n endnotePr,\n },\n };\n history.push({\n ...history.state,\n package: {\n ...history.state.package,\n document: newDoc,\n },\n });\n },\n [history]\n );\n\n // Handle table action from Toolbar - use ProseMirror commands\n const handleTableAction = useCallback(\n (action: TableAction) => {\n const view = getActiveEditorView();\n if (!view) return;\n\n switch (action) {\n case 'addRowAbove':\n addRowAbove(view.state, view.dispatch);\n break;\n case 'addRowBelow':\n addRowBelow(view.state, view.dispatch);\n break;\n case 'addColumnLeft':\n addColumnLeft(view.state, view.dispatch);\n break;\n case 'addColumnRight':\n addColumnRight(view.state, view.dispatch);\n break;\n case 'deleteRow':\n pmDeleteRow(view.state, view.dispatch);\n break;\n case 'deleteColumn':\n pmDeleteColumn(view.state, view.dispatch);\n break;\n case 'deleteTable':\n pmDeleteTable(view.state, view.dispatch);\n break;\n case 'selectTable':\n pmSelectTable(view.state, view.dispatch);\n break;\n case 'selectRow':\n pmSelectRow(view.state, view.dispatch);\n break;\n case 'selectColumn':\n pmSelectColumn(view.state, view.dispatch);\n break;\n case 'mergeCells':\n pmMergeCells(view.state, view.dispatch);\n break;\n case 'splitCell':\n pmSplitCell(view.state, view.dispatch);\n break;\n // Border actions — use current border spec from toolbar\n case 'borderAll':\n setAllTableBorders(view.state, view.dispatch, borderSpecRef.current);\n break;\n case 'borderOutside':\n setOutsideTableBorders(view.state, view.dispatch, borderSpecRef.current);\n break;\n case 'borderInside':\n setInsideTableBorders(view.state, view.dispatch, borderSpecRef.current);\n break;\n case 'borderNone':\n removeTableBorders(view.state, view.dispatch);\n break;\n // Per-side border actions (use current border spec)\n case 'borderTop':\n setCellBorder('top', borderSpecRef.current)(view.state, view.dispatch);\n break;\n case 'borderBottom':\n setCellBorder('bottom', borderSpecRef.current)(view.state, view.dispatch);\n break;\n case 'borderLeft':\n setCellBorder('left', borderSpecRef.current)(view.state, view.dispatch);\n break;\n case 'borderRight':\n setCellBorder('right', borderSpecRef.current)(view.state, view.dispatch);\n break;\n default:\n // Handle complex actions (with parameters)\n if (typeof action === 'object') {\n if (action.type === 'cellFillColor') {\n setCellFillColor(action.color)(view.state, view.dispatch);\n } else if (action.type === 'borderColor') {\n const rgb = action.color.replace(/^#/, '');\n borderSpecRef.current = { ...borderSpecRef.current, color: { rgb } };\n setTableBorderColor(action.color)(view.state, view.dispatch);\n } else if (action.type === 'borderWidth') {\n borderSpecRef.current = { ...borderSpecRef.current, size: action.size };\n setTableBorderWidth(action.size)(view.state, view.dispatch);\n } else if (action.type === 'cellBorder') {\n setCellBorder(action.side, {\n style: action.style,\n size: action.size,\n color: { rgb: action.color.replace(/^#/, '') },\n })(view.state, view.dispatch);\n } else if (action.type === 'cellVerticalAlign') {\n setCellVerticalAlign(action.align)(view.state, view.dispatch);\n } else if (action.type === 'cellMargins') {\n setCellMargins(action.margins)(view.state, view.dispatch);\n } else if (action.type === 'cellTextDirection') {\n setCellTextDirection(action.direction)(view.state, view.dispatch);\n } else if (action.type === 'toggleNoWrap') {\n toggleNoWrap()(view.state, view.dispatch);\n } else if (action.type === 'rowHeight') {\n setRowHeight(action.height, action.rule)(view.state, view.dispatch);\n } else if (action.type === 'toggleHeaderRow') {\n toggleHeaderRow()(view.state, view.dispatch);\n } else if (action.type === 'distributeColumns') {\n distributeColumns()(view.state, view.dispatch);\n } else if (action.type === 'autoFitContents') {\n autoFitContents()(view.state, view.dispatch);\n } else if (action.type === 'openTableProperties') {\n setTablePropsOpen(true);\n } else if (action.type === 'tableProperties') {\n setTableProperties(action.props)(view.state, view.dispatch);\n } else if (action.type === 'applyTableStyle') {\n // Resolve style data from built-in presets or document styles\n let preset: TableStylePreset | undefined = getBuiltinTableStyle(action.styleId);\n const currentDocForTable = historyStateRef.current;\n if (!preset && currentDocForTable?.package.styles) {\n const styleResolver = createStyleResolver(currentDocForTable.package.styles);\n const docStyle = styleResolver.getStyle(action.styleId);\n if (docStyle) {\n // Convert to preset inline (same as documentStyleToPreset)\n preset = { id: docStyle.styleId, name: docStyle.name ?? docStyle.styleId };\n if (docStyle.tblPr?.borders) {\n const b = docStyle.tblPr.borders;\n preset.tableBorders = {};\n for (const side of [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'insideH',\n 'insideV',\n ] as const) {\n const bs = b[side];\n if (bs) {\n preset.tableBorders[side] = {\n style: bs.style,\n size: bs.size,\n color: bs.color?.rgb ? { rgb: bs.color.rgb } : undefined,\n };\n }\n }\n }\n if (docStyle.tblStylePr) {\n preset.conditionals = {};\n for (const cond of docStyle.tblStylePr) {\n const entry: Record<string, unknown> = {};\n if (cond.tcPr?.shading?.fill)\n entry.backgroundColor = `#${cond.tcPr.shading.fill}`;\n if (cond.tcPr?.borders) {\n const borders: Record<string, unknown> = {};\n for (const s of ['top', 'bottom', 'left', 'right'] as const) {\n const bs2 = cond.tcPr.borders[s];\n if (bs2)\n borders[s] = {\n style: bs2.style,\n size: bs2.size,\n color: bs2.color?.rgb ? { rgb: bs2.color.rgb } : undefined,\n };\n }\n entry.borders = borders;\n }\n if (cond.rPr?.bold) entry.bold = true;\n if (cond.rPr?.color?.rgb) entry.color = `#${cond.rPr.color.rgb}`;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (preset.conditionals as any)[cond.type] = entry;\n }\n }\n preset.look = { firstRow: true, lastRow: false, noHBand: false, noVBand: true };\n }\n }\n if (preset) {\n applyTableStyle({\n styleId: preset.id,\n tableBorders: preset.tableBorders,\n conditionals: preset.conditionals,\n look: preset.look,\n })(view.state, view.dispatch);\n }\n }\n } else {\n // Fallback to legacy table selection handler for other actions\n tableSelection.handleAction(action);\n }\n }\n\n focusActiveEditor();\n },\n [tableSelection, getActiveEditorView, focusActiveEditor]\n );\n\n // Handle formatting action from toolbar\n const handleFormat = useCallback(\n (action: FormattingAction) => {\n const view = getActiveEditorView();\n if (!view) return;\n\n // Focus editor first to ensure we can dispatch commands\n view.focus();\n\n // Restore selection if it was lost during toolbar interaction\n // This happens when user clicks on dropdown menus (font picker, style picker, etc.)\n // Only restore for the body editor — HF editor manages its own selection\n const isBodyEditor = view === pagedEditorRef.current?.getView();\n const { from, to } = view.state.selection;\n const savedSelection = lastSelectionRef.current;\n\n if (\n isBodyEditor &&\n savedSelection &&\n (from !== savedSelection.from || to !== savedSelection.to)\n ) {\n // Selection was lost (focus moved to dropdown portal) - restore it\n try {\n const tr = view.state.tr.setSelection(\n TextSelection.create(view.state.doc, savedSelection.from, savedSelection.to)\n );\n view.dispatch(tr);\n } catch (e) {\n // If restoration fails (e.g., positions are invalid after doc change), continue with current selection\n console.warn('Could not restore selection:', e);\n }\n }\n\n // Handle simple toggle actions\n if (action === 'bold') {\n toggleBold(view.state, view.dispatch);\n return;\n }\n if (action === 'italic') {\n toggleItalic(view.state, view.dispatch);\n return;\n }\n if (action === 'underline') {\n toggleUnderline(view.state, view.dispatch);\n return;\n }\n if (action === 'strikethrough') {\n toggleStrike(view.state, view.dispatch);\n return;\n }\n if (action === 'superscript') {\n toggleSuperscript(view.state, view.dispatch);\n return;\n }\n if (action === 'subscript') {\n toggleSubscript(view.state, view.dispatch);\n return;\n }\n if (action === 'bulletList') {\n toggleBulletList(view.state, view.dispatch);\n return;\n }\n if (action === 'numberedList') {\n toggleNumberedList(view.state, view.dispatch);\n return;\n }\n if (action === 'indent') {\n // Try list indent first, then paragraph indent\n if (!increaseListLevel(view.state, view.dispatch)) {\n increaseIndent()(view.state, view.dispatch);\n }\n return;\n }\n if (action === 'outdent') {\n // Try list outdent first, then paragraph outdent\n if (!decreaseListLevel(view.state, view.dispatch)) {\n decreaseIndent()(view.state, view.dispatch);\n }\n return;\n }\n if (action === 'clearFormatting') {\n clearFormatting(view.state, view.dispatch);\n return;\n }\n if (action === 'insertLink') {\n // Get the selected text for the hyperlink dialog\n const selectedText = getSelectedText(view.state);\n // Check if we're editing an existing link\n const existingLink = getHyperlinkAttrs(view.state);\n if (existingLink) {\n hyperlinkDialog.openEdit({\n url: existingLink.href,\n displayText: selectedText,\n tooltip: existingLink.tooltip,\n });\n } else {\n hyperlinkDialog.openInsert(selectedText);\n }\n return;\n }\n\n // Handle object-based actions\n if (typeof action === 'object') {\n switch (action.type) {\n case 'alignment':\n setAlignment(action.value)(view.state, view.dispatch);\n break;\n case 'textColor':\n // action.value can be a string like \"#FF0000\" or a color name\n setTextColor({ rgb: action.value.replace('#', '') })(view.state, view.dispatch);\n break;\n case 'highlightColor': {\n // Convert hex to OOXML named highlight value (e.g., 'FFFF00' → 'yellow')\n const highlightName = action.value ? mapHexToHighlightName(action.value) : '';\n setHighlight(highlightName || action.value)(view.state, view.dispatch);\n break;\n }\n case 'fontSize':\n // Convert points to half-points (OOXML uses half-points for font sizes)\n setFontSize(pointsToHalfPoints(action.value))(view.state, view.dispatch);\n break;\n case 'fontFamily':\n setFontFamily(action.value)(view.state, view.dispatch);\n break;\n case 'lineSpacing':\n setLineSpacing(action.value)(view.state, view.dispatch);\n break;\n case 'applyStyle': {\n // Resolve style to get its formatting properties\n // Use ref to avoid stale closure (handleFormat has [] deps)\n const currentDoc = historyStateRef.current;\n const styleResolver = currentDoc?.package.styles\n ? createStyleResolver(currentDoc.package.styles)\n : null;\n\n if (styleResolver) {\n const resolved = styleResolver.resolveParagraphStyle(action.value);\n applyStyle(action.value, {\n paragraphFormatting: resolved.paragraphFormatting,\n runFormatting: resolved.runFormatting,\n })(view.state, view.dispatch);\n } else {\n // No styles available, just set the styleId\n applyStyle(action.value)(view.state, view.dispatch);\n }\n break;\n }\n }\n }\n },\n [getActiveEditorView]\n );\n\n // Handle zoom change\n const handleZoomChange = useCallback((zoom: number) => {\n setState((prev) => ({ ...prev, zoom }));\n }, []);\n\n // Handle hyperlink dialog submit\n const handleHyperlinkSubmit = useCallback(\n (data: HyperlinkData) => {\n const view = getActiveEditorView();\n if (!view) return;\n\n const url = data.url || '';\n const tooltip = data.tooltip;\n\n // Check if we have a selection\n const { empty } = view.state.selection;\n\n if (empty && data.displayText) {\n // No selection but display text provided - insert new linked text\n insertHyperlink(data.displayText, url, tooltip)(view.state, view.dispatch);\n } else if (!empty) {\n // Have selection - apply hyperlink to it\n setHyperlink(url, tooltip)(view.state, view.dispatch);\n } else if (data.displayText) {\n // Empty selection but display text provided\n insertHyperlink(data.displayText, url, tooltip)(view.state, view.dispatch);\n }\n\n hyperlinkDialog.close();\n focusActiveEditor();\n },\n [hyperlinkDialog, getActiveEditorView, focusActiveEditor]\n );\n\n // Handle hyperlink removal\n const handleHyperlinkRemove = useCallback(() => {\n const view = getActiveEditorView();\n if (!view) return;\n\n removeHyperlink(view.state, view.dispatch);\n hyperlinkDialog.close();\n focusActiveEditor();\n }, [hyperlinkDialog, getActiveEditorView, focusActiveEditor]);\n\n // Handle margin changes from rulers\n const createMarginHandler = useCallback(\n (property: 'marginLeft' | 'marginRight' | 'marginTop' | 'marginBottom') =>\n (marginTwips: number) => {\n if (!history.state || readOnly) return;\n const newDoc = {\n ...history.state,\n package: {\n ...history.state.package,\n document: {\n ...history.state.package.document,\n finalSectionProperties: {\n ...history.state.package.document.finalSectionProperties,\n [property]: marginTwips,\n },\n },\n },\n };\n handleDocumentChange(newDoc);\n },\n [history.state, readOnly, handleDocumentChange]\n );\n\n const handleLeftMarginChange = useMemo(\n () => createMarginHandler('marginLeft'),\n [createMarginHandler]\n );\n const handleRightMarginChange = useMemo(\n () => createMarginHandler('marginRight'),\n [createMarginHandler]\n );\n const handleTopMarginChange = useMemo(\n () => createMarginHandler('marginTop'),\n [createMarginHandler]\n );\n const handleBottomMarginChange = useMemo(\n () => createMarginHandler('marginBottom'),\n [createMarginHandler]\n );\n\n // Paragraph indent handlers (for ruler)\n const handleIndentLeftChange = useCallback(\n (twips: number) => {\n const view = getActiveEditorView();\n if (!view) return;\n setIndentLeft(twips)(view.state, view.dispatch);\n },\n [getActiveEditorView]\n );\n\n const handleIndentRightChange = useCallback(\n (twips: number) => {\n const view = getActiveEditorView();\n if (!view) return;\n setIndentRight(twips)(view.state, view.dispatch);\n },\n [getActiveEditorView]\n );\n\n const handleFirstLineIndentChange = useCallback(\n (twips: number) => {\n const view = getActiveEditorView();\n if (!view) return;\n // If twips is negative, it's a hanging indent\n if (twips < 0) {\n setIndentFirstLine(-twips, true)(view.state, view.dispatch);\n } else {\n setIndentFirstLine(twips, false)(view.state, view.dispatch);\n }\n },\n [getActiveEditorView]\n );\n\n const handleTabStopRemove = useCallback(\n (positionTwips: number) => {\n const view = getActiveEditorView();\n if (!view) return;\n removeTabStop(positionTwips)(view.state, view.dispatch);\n },\n [getActiveEditorView]\n );\n\n // Handle page navigation (from PageNavigator)\n // TODO: Implement page navigation in ProseMirror\n const handlePageNavigate = useCallback((_pageNumber: number) => {\n // Page navigation not yet implemented for ProseMirror\n }, []);\n\n // Handle save\n const handleSave = useCallback(async (): Promise<ArrayBuffer | null> => {\n if (!agentRef.current) return null;\n\n try {\n const buffer = await agentRef.current.toBuffer();\n onSave?.(buffer);\n return buffer;\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error('Failed to save document'));\n return null;\n }\n }, [onSave, onError]);\n\n // Handle error from editor\n const handleEditorError = useCallback(\n (error: Error) => {\n onError?.(error);\n },\n [onError]\n );\n\n const handleDirectPrint = useCallback(() => {\n // Find the pages container and clone its content into a clean print window\n const pagesEl = containerRef.current?.querySelector('.paged-editor__pages');\n if (!pagesEl) {\n window.print();\n onPrint?.();\n return;\n }\n\n const printWindow = window.open('', '_blank');\n if (!printWindow) {\n // Popup blocked — fall back to window.print()\n window.print();\n onPrint?.();\n return;\n }\n\n // Collect all @font-face rules from the current page\n const fontFaceRules: string[] = [];\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules)) {\n if (rule instanceof CSSFontFaceRule) {\n fontFaceRules.push(rule.cssText);\n }\n }\n } catch {\n // Cross-origin stylesheets can't be read — skip\n }\n }\n\n // Clone pages and remove transforms/shadows\n const pagesClone = pagesEl.cloneNode(true) as HTMLElement;\n pagesClone.style.cssText = 'display: block; margin: 0; padding: 0;';\n for (const page of Array.from(pagesClone.querySelectorAll('.layout-page'))) {\n const el = page as HTMLElement;\n el.style.boxShadow = 'none';\n el.style.margin = '0';\n }\n\n printWindow.document.write(`<!DOCTYPE html>\n<html><head><title>Print</title>\n<style>\n${fontFaceRules.join('\\n')}\n* { margin: 0; padding: 0; }\nbody { background: white; }\n.layout-page { break-after: page; }\n.layout-page:last-child { break-after: auto; }\n@page { margin: 0; size: auto; }\n</style>\n</head><body>${pagesClone.outerHTML}</body></html>`);\n printWindow.document.close();\n\n // Wait for fonts/images then print\n printWindow.onload = () => {\n printWindow.print();\n printWindow.close();\n };\n\n // Fallback if onload doesn't fire (some browsers)\n setTimeout(() => {\n if (!printWindow.closed) {\n printWindow.print();\n printWindow.close();\n }\n }, 1000);\n\n onPrint?.();\n }, [onPrint]);\n\n // ============================================================================\n // FIND/REPLACE HANDLERS\n // ============================================================================\n\n // Store the current find result for navigation\n const findResultRef = useRef<FindResult | null>(null);\n\n // Handle find operation\n const handleFind = useCallback(\n (searchText: string, options: FindOptions): FindResult | null => {\n if (!history.state || !searchText.trim()) {\n findResultRef.current = null;\n return null;\n }\n\n const matches = findInDocument(history.state, searchText, options);\n const result: FindResult = {\n matches,\n totalCount: matches.length,\n currentIndex: 0,\n };\n\n findResultRef.current = result;\n findReplace.setMatches(matches, 0);\n\n // Scroll to first match\n if (matches.length > 0 && containerRef.current) {\n scrollToMatch(containerRef.current, matches[0]);\n }\n\n return result;\n },\n [history.state, findReplace]\n );\n\n // Handle find next\n const handleFindNext = useCallback((): FindMatch | null => {\n if (!findResultRef.current || findResultRef.current.matches.length === 0) {\n return null;\n }\n\n const newIndex = findReplace.goToNextMatch();\n const match = findResultRef.current.matches[newIndex];\n\n // Scroll to the match\n if (match && containerRef.current) {\n scrollToMatch(containerRef.current, match);\n }\n\n return match || null;\n }, [findReplace]);\n\n // Handle find previous\n const handleFindPrevious = useCallback((): FindMatch | null => {\n if (!findResultRef.current || findResultRef.current.matches.length === 0) {\n return null;\n }\n\n const newIndex = findReplace.goToPreviousMatch();\n const match = findResultRef.current.matches[newIndex];\n\n // Scroll to the match\n if (match && containerRef.current) {\n scrollToMatch(containerRef.current, match);\n }\n\n return match || null;\n }, [findReplace]);\n\n // Handle replace current match\n const handleReplace = useCallback(\n (replaceText: string): boolean => {\n if (!history.state || !findResultRef.current || findResultRef.current.matches.length === 0) {\n return false;\n }\n\n const currentMatch = findResultRef.current.matches[findResultRef.current.currentIndex];\n if (!currentMatch) return false;\n\n // Execute replace command\n try {\n const newDoc = executeCommand(history.state, {\n type: 'replaceText',\n range: {\n start: {\n paragraphIndex: currentMatch.paragraphIndex,\n offset: currentMatch.startOffset,\n },\n end: {\n paragraphIndex: currentMatch.paragraphIndex,\n offset: currentMatch.endOffset,\n },\n },\n text: replaceText,\n });\n\n handleDocumentChange(newDoc);\n return true;\n } catch (error) {\n console.error('Replace failed:', error);\n return false;\n }\n },\n [history.state, handleDocumentChange]\n );\n\n // Handle replace all matches\n const handleReplaceAll = useCallback(\n (searchText: string, replaceText: string, options: FindOptions): number => {\n if (!history.state || !searchText.trim()) {\n return 0;\n }\n\n // Find all matches first\n const matches = findInDocument(history.state, searchText, options);\n if (matches.length === 0) return 0;\n\n // Replace from end to start to maintain correct indices\n let doc = history.state;\n const sortedMatches = [...matches].sort((a, b) => {\n if (a.paragraphIndex !== b.paragraphIndex) {\n return b.paragraphIndex - a.paragraphIndex;\n }\n return b.startOffset - a.startOffset;\n });\n\n for (const match of sortedMatches) {\n try {\n doc = executeCommand(doc, {\n type: 'replaceText',\n range: {\n start: {\n paragraphIndex: match.paragraphIndex,\n offset: match.startOffset,\n },\n end: {\n paragraphIndex: match.paragraphIndex,\n offset: match.endOffset,\n },\n },\n text: replaceText,\n });\n } catch (error) {\n console.error('Replace failed for match:', match, error);\n }\n }\n\n handleDocumentChange(doc);\n findResultRef.current = null;\n findReplace.setMatches([], 0);\n\n return matches.length;\n },\n [history.state, handleDocumentChange, findReplace]\n );\n\n // Expose ref methods\n useImperativeHandle(\n ref,\n () => ({\n getAgent: () => agentRef.current,\n getDocument: () => history.state,\n getEditorRef: () => pagedEditorRef.current,\n save: handleSave,\n setZoom: (zoom: number) => setState((prev) => ({ ...prev, zoom })),\n getZoom: () => state.zoom,\n focus: () => {\n pagedEditorRef.current?.focus();\n },\n getCurrentPage: () => state.currentPage,\n getTotalPages: () => state.totalPages,\n scrollToPage: (_pageNumber: number) => {\n // TODO: Implement page navigation in ProseMirror\n },\n openPrintPreview: handleDirectPrint,\n print: handleDirectPrint,\n }),\n [history.state, state.zoom, state.currentPage, state.totalPages, handleSave, handleDirectPrint]\n );\n\n // Get header and footer content from document\n const { headerContent, footerContent } = useMemo<{\n headerContent: HeaderFooter | null;\n footerContent: HeaderFooter | null;\n }>(() => {\n if (!history.state?.package) {\n return { headerContent: null, footerContent: null };\n }\n\n const pkg = history.state.package;\n const sectionProps = pkg.document?.finalSectionProperties;\n const headers = pkg.headers;\n const footers = pkg.footers;\n\n let header: HeaderFooter | null = null;\n let footer: HeaderFooter | null = null;\n\n // Get default header from section references\n if (headers && sectionProps?.headerReferences) {\n const defaultRef = sectionProps.headerReferences.find((r) => r.type === 'default');\n if (defaultRef?.rId) {\n header = headers.get(defaultRef.rId) ?? null;\n }\n }\n\n // Get default footer from section references\n if (footers && sectionProps?.footerReferences) {\n const defaultRef = sectionProps.footerReferences.find((r) => r.type === 'default');\n if (defaultRef?.rId) {\n footer = footers.get(defaultRef.rId) ?? null;\n }\n }\n\n return { headerContent: header, footerContent: footer };\n }, [history.state]);\n\n // Handle header/footer double-click — open editing overlay\n // If no header/footer exists, create an empty one so the user can add content\n const handleHeaderFooterDoubleClick = useCallback(\n (position: 'header' | 'footer') => {\n const hf = position === 'header' ? headerContent : footerContent;\n if (hf) {\n setHfEditPosition(position);\n return;\n }\n\n // Create empty header/footer for docs that don't have one yet\n if (!history.state?.package) return;\n const pkg = history.state.package;\n const sectionProps = pkg.document?.finalSectionProperties;\n if (!sectionProps) return;\n\n const rId = `rId_new_${position}`;\n const emptyHf: HeaderFooter = {\n type: position === 'header' ? 'header' : 'footer',\n hdrFtrType: 'default',\n content: [{ type: 'paragraph', content: [] }],\n };\n\n const mapKey = position === 'header' ? 'headers' : 'footers';\n const newMap = new Map(pkg[mapKey] ?? []);\n newMap.set(rId, emptyHf);\n\n const refKey = position === 'header' ? 'headerReferences' : 'footerReferences';\n const existingRefs = sectionProps[refKey] ?? [];\n const newRef = { type: 'default' as const, rId };\n\n const newDoc: Document = {\n ...history.state,\n package: {\n ...pkg,\n [mapKey]: newMap,\n document: pkg.document\n ? {\n ...pkg.document,\n finalSectionProperties: {\n ...sectionProps,\n [refKey]: [...existingRefs, newRef],\n },\n }\n : pkg.document,\n },\n };\n history.push(newDoc);\n setHfEditPosition(position);\n },\n [headerContent, footerContent, history]\n );\n\n // Handle header/footer save — update document package with edited content\n const handleHeaderFooterSave = useCallback(\n (content: (import('@eigenpal/docx-core/types/document').Paragraph | import('@eigenpal/docx-core/types/document').Table)[]) => {\n if (!hfEditPosition || !history.state?.package) {\n setHfEditPosition(null);\n return;\n }\n\n const pkg = history.state.package;\n const sectionProps = pkg.document?.finalSectionProperties;\n const refs =\n hfEditPosition === 'header'\n ? sectionProps?.headerReferences\n : sectionProps?.footerReferences;\n const defaultRef = refs?.find((r) => r.type === 'default');\n const mapKey = hfEditPosition === 'header' ? 'headers' : 'footers';\n const map = pkg[mapKey];\n\n if (defaultRef?.rId && map) {\n const existing = map.get(defaultRef.rId);\n const updated: HeaderFooter = {\n type: hfEditPosition,\n hdrFtrType: 'default',\n ...existing,\n content,\n };\n const newMap = new Map(map);\n newMap.set(defaultRef.rId, updated);\n\n const newDoc: Document = {\n ...history.state,\n package: {\n ...pkg,\n [mapKey]: newMap,\n },\n };\n history.push(newDoc);\n }\n\n setHfEditPosition(null);\n },\n [hfEditPosition, history]\n );\n\n // Handle body click while in HF editing mode — save + close\n const handleBodyClick = useCallback(() => {\n if (!hfEditPosition) return;\n // Save if dirty, then close\n const view = hfEditorRef.current?.getView();\n if (view) {\n const blocks = proseDocToBlocks(view.state.doc);\n handleHeaderFooterSave(blocks);\n } else {\n setHfEditPosition(null);\n }\n }, [hfEditPosition, handleHeaderFooterSave]);\n\n // Handle removing the header/footer entirely\n const handleRemoveHeaderFooter = useCallback(() => {\n if (!hfEditPosition || !history.state?.package) {\n setHfEditPosition(null);\n return;\n }\n\n const pkg = history.state.package;\n const sectionProps = pkg.document?.finalSectionProperties;\n const refKey = hfEditPosition === 'header' ? 'headerReferences' : 'footerReferences';\n const mapKey = hfEditPosition === 'header' ? 'headers' : 'footers';\n const refs = sectionProps?.[refKey];\n const defaultRef = refs?.find((r) => r.type === 'default');\n\n if (defaultRef?.rId) {\n const newMap = new Map(pkg[mapKey] ?? []);\n newMap.delete(defaultRef.rId);\n\n const newRefs = (refs ?? []).filter((r) => r.rId !== defaultRef.rId);\n\n const newDoc: Document = {\n ...history.state,\n package: {\n ...pkg,\n [mapKey]: newMap,\n document: pkg.document\n ? {\n ...pkg.document,\n finalSectionProperties: {\n ...sectionProps,\n [refKey]: newRefs,\n },\n }\n : pkg.document,\n },\n };\n history.push(newDoc);\n }\n\n setHfEditPosition(null);\n }, [hfEditPosition, history]);\n\n // Get the DOM element for the header/footer area on the first page\n const getHfTargetElement = useCallback((pos: 'header' | 'footer'): HTMLElement | null => {\n const pagesContainer = containerRef.current?.querySelector('.paged-editor__pages');\n if (!pagesContainer) return null;\n const className = pos === 'header' ? '.layout-page-header' : '.layout-page-footer';\n return pagesContainer.querySelector(className);\n }, []);\n\n // Container styles - using overflow: auto so sticky toolbar works\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n width: '100%',\n backgroundColor: 'var(--doc-bg-subtle)',\n ...style,\n };\n\n const mainContentStyle: CSSProperties = {\n display: 'flex',\n flex: 1,\n minHeight: 0, // Allow flex item to shrink below content size\n minWidth: 0, // Allow flex item to shrink below content width on narrow viewports\n flexDirection: 'row',\n };\n\n const editorContainerStyle: CSSProperties = {\n flex: 1,\n minHeight: 0,\n minWidth: 0, // Allow flex item to shrink below content width on narrow viewports\n overflow: 'auto', // This is the scroll container - sticky toolbar will stick to this\n position: 'relative',\n };\n\n // Render loading state\n if (state.isLoading) {\n return (\n <div\n className={`ep-root docx-editor docx-editor-loading ${className}`}\n style={containerStyle}\n data-testid=\"docx-editor\"\n >\n {loadingIndicator || <DefaultLoadingIndicator />}\n </div>\n );\n }\n\n // Render error state\n if (state.parseError) {\n return (\n <div\n className={`ep-root docx-editor docx-editor-error ${className}`}\n style={containerStyle}\n data-testid=\"docx-editor\"\n >\n <ParseError message={state.parseError} />\n </div>\n );\n }\n\n // Render placeholder when no document\n if (!history.state) {\n return (\n <div\n className={`ep-root docx-editor docx-editor-empty ${className}`}\n style={containerStyle}\n data-testid=\"docx-editor\"\n >\n {placeholder || <DefaultPlaceholder />}\n </div>\n );\n }\n\n return (\n <ErrorProvider>\n <ErrorBoundary onError={handleEditorError}>\n <div\n ref={containerRef}\n className={`ep-root docx-editor ${className}`}\n style={containerStyle}\n data-testid=\"docx-editor\"\n >\n {/* Main content area */}\n <div style={mainContentStyle}>\n {/* Wrapper for scroll container + outline overlay */}\n <div\n style={{\n position: 'relative',\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* Editor container - this is the scroll container */}\n <div style={editorContainerStyle}>\n {/* Toolbar - sticky at top of scroll container */}\n {/* Hide toolbar in read-only mode unless explicitly requested */}\n {showToolbar && !readOnly && (\n <div\n ref={toolbarRefCallback}\n className=\"sticky top-0 z-50 flex flex-col gap-0 bg-white shadow-sm\"\n >\n <Toolbar\n currentFormatting={state.selectionFormatting}\n onFormat={handleFormat}\n onUndo={undoActiveEditor}\n onRedo={redoActiveEditor}\n canUndo={true}\n canRedo={true}\n disabled={readOnly}\n documentStyles={history.state?.package.styles?.styles}\n theme={history.state?.package.theme || theme}\n showPrintButton={showPrintButton}\n onPrint={handleDirectPrint}\n showZoomControl={showZoomControl}\n zoom={state.zoom}\n onZoomChange={handleZoomChange}\n onRefocusEditor={focusActiveEditor}\n onInsertTable={handleInsertTable}\n showTableInsert={true}\n onInsertImage={handleInsertImageClick}\n onInsertPageBreak={handleInsertPageBreak}\n onInsertTOC={handleInsertTOC}\n imageContext={state.pmImageContext}\n onImageWrapType={handleImageWrapType}\n onImageTransform={handleImageTransform}\n onOpenImageProperties={handleOpenImageProperties}\n tableContext={state.pmTableContext}\n onTableAction={handleTableAction}\n >\n {toolbarExtra}\n </Toolbar>\n\n {/* Horizontal Ruler - sticky with toolbar */}\n {showRuler && (\n <div className=\"flex justify-center px-5 py-1 overflow-x-auto flex-shrink-0 bg-doc-bg\">\n <HorizontalRuler\n sectionProps={history.state?.package.document?.finalSectionProperties}\n zoom={state.zoom}\n unit={rulerUnit}\n editable={!readOnly}\n onLeftMarginChange={handleLeftMarginChange}\n onRightMarginChange={handleRightMarginChange}\n indentLeft={state.paragraphIndentLeft}\n indentRight={state.paragraphIndentRight}\n onIndentLeftChange={handleIndentLeftChange}\n onIndentRightChange={handleIndentRightChange}\n showFirstLineIndent={true}\n firstLineIndent={state.paragraphFirstLineIndent}\n hangingIndent={state.paragraphHangingIndent}\n onFirstLineIndentChange={handleFirstLineIndentChange}\n tabStops={state.paragraphTabs}\n onTabStopRemove={handleTabStopRemove}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Vertical Ruler - fixed on left edge (hidden in read-only mode) */}\n {showRuler && !readOnly && (\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n paddingTop: 20,\n zIndex: 10,\n }}\n >\n <VerticalRuler\n sectionProps={history.state?.package.document?.finalSectionProperties}\n zoom={state.zoom}\n unit={rulerUnit}\n editable={!readOnly}\n onTopMarginChange={handleTopMarginChange}\n onBottomMarginChange={handleBottomMarginChange}\n />\n </div>\n )}\n\n {/* Editor content wrapper */}\n <div style={{ display: 'flex', flex: 1, minHeight: 0, position: 'relative' }}>\n {/* Editor content area */}\n <div\n ref={editorContentRef}\n style={{ position: 'relative', flex: 1, minWidth: 0 }}\n onMouseDown={(e) => {\n // Focus editor when clicking on the background area (not the editor itself)\n // Using mouseDown for immediate response before focus can be lost\n if (e.target === e.currentTarget) {\n e.preventDefault();\n pagedEditorRef.current?.focus();\n }\n }}\n >\n <PagedEditor\n ref={pagedEditorRef}\n document={history.state}\n styles={history.state?.package.styles}\n theme={history.state?.package.theme || theme}\n sectionProperties={history.state?.package.document?.finalSectionProperties}\n headerContent={headerContent}\n footerContent={footerContent}\n onHeaderFooterDoubleClick={handleHeaderFooterDoubleClick}\n hfEditMode={hfEditPosition}\n onBodyClick={handleBodyClick}\n zoom={state.zoom}\n readOnly={readOnly}\n extensionManager={extensionManager}\n onDocumentChange={handleDocumentChange}\n onSelectionChange={(_from, _to) => {\n // Extract full selection state from PM and use the standard handler\n const view = pagedEditorRef.current?.getView();\n if (view) {\n const selectionState = extractSelectionState(view.state);\n handleSelectionChange(selectionState);\n } else {\n handleSelectionChange(null);\n }\n }}\n externalPlugins={externalPlugins}\n onReady={(ref) => {\n onEditorViewReady?.(ref.getView()!);\n }}\n onRenderedDomContextReady={onRenderedDomContextReady}\n pluginOverlays={pluginOverlays}\n />\n\n {/* Page navigation / indicator */}\n {showPageNumbers &&\n state.totalPages > 0 &&\n (enablePageNavigation ? (\n <PageNavigator\n currentPage={state.currentPage}\n totalPages={state.totalPages}\n onNavigate={handlePageNavigate}\n position={pageNumberPosition as PageNavigatorPosition}\n variant={pageNumberVariant as PageNavigatorVariant}\n floating\n />\n ) : (\n <PageNumberIndicator\n currentPage={state.currentPage}\n totalPages={state.totalPages}\n position={pageNumberPosition as PageIndicatorPosition}\n variant={pageNumberVariant as PageIndicatorVariant}\n floating\n />\n ))}\n\n {/* Inline Header/Footer Editor — positioned over the target area */}\n {hfEditPosition &&\n (hfEditPosition === 'header' ? headerContent : footerContent) &&\n (() => {\n const targetEl = getHfTargetElement(hfEditPosition);\n const parentEl = editorContentRef.current;\n if (!targetEl || !parentEl) return null;\n return (\n <InlineHeaderFooterEditor\n ref={hfEditorRef}\n headerFooter={\n (hfEditPosition === 'header'\n ? headerContent\n : footerContent) as HeaderFooter\n }\n position={hfEditPosition}\n styles={history.state?.package.styles}\n targetElement={targetEl}\n parentElement={parentEl}\n onSave={handleHeaderFooterSave}\n onClose={() => setHfEditPosition(null)}\n onSelectionChange={handleSelectionChange}\n onRemove={handleRemoveHeaderFooter}\n />\n );\n })()}\n </div>\n </div>\n {/* end editor flex wrapper */}\n </div>\n {/* end scroll container */}\n\n {/* Document outline sidebar — absolutely positioned, doesn't scroll */}\n {showOutline && (\n <DocumentOutline\n headings={outlineHeadings}\n onHeadingClick={handleHeadingInfoClick}\n onClose={() => setShowOutline(false)}\n topOffset={toolbarHeight}\n />\n )}\n\n {/* Outline toggle button — absolutely positioned below toolbar */}\n {!showOutline && (\n <button\n className=\"docx-outline-nav\"\n onClick={handleToggleOutline}\n onMouseDown={(e) => e.stopPropagation()}\n title=\"Show document outline\"\n style={{\n position: 'absolute',\n left: 48,\n top: toolbarHeight + 12,\n zIndex: 20,\n background: 'transparent',\n border: 'none',\n borderRadius: '50%',\n padding: 6,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <MaterialSymbol\n name=\"format_list_bulleted\"\n size={20}\n style={{ color: '#444746' }}\n />\n </button>\n )}\n </div>\n {/* end wrapper for scroll container + outline */}\n </div>\n\n {/* Lazy-loaded dialogs — only fetched when first opened */}\n <Suspense fallback={null}>\n {findReplace.state.isOpen && (\n <FindReplaceDialog\n isOpen={findReplace.state.isOpen}\n onClose={findReplace.close}\n onFind={handleFind}\n onFindNext={handleFindNext}\n onFindPrevious={handleFindPrevious}\n onReplace={handleReplace}\n onReplaceAll={handleReplaceAll}\n initialSearchText={findReplace.state.searchText}\n replaceMode={findReplace.state.replaceMode}\n currentResult={findResultRef.current}\n />\n )}\n {hyperlinkDialog.state.isOpen && (\n <HyperlinkDialog\n isOpen={hyperlinkDialog.state.isOpen}\n onClose={hyperlinkDialog.close}\n onSubmit={handleHyperlinkSubmit}\n onRemove={hyperlinkDialog.state.isEditing ? handleHyperlinkRemove : undefined}\n initialData={hyperlinkDialog.state.initialData}\n selectedText={hyperlinkDialog.state.selectedText}\n isEditing={hyperlinkDialog.state.isEditing}\n />\n )}\n {tablePropsOpen && (\n <TablePropertiesDialog\n isOpen={tablePropsOpen}\n onClose={() => setTablePropsOpen(false)}\n onApply={(props) => {\n const view = getActiveEditorView();\n if (view) {\n setTableProperties(props)(view.state, view.dispatch);\n }\n }}\n currentProps={\n state.pmTableContext?.table?.attrs as Record<string, unknown> | undefined\n }\n />\n )}\n {imagePositionOpen && (\n <ImagePositionDialog\n isOpen={imagePositionOpen}\n onClose={() => setImagePositionOpen(false)}\n onApply={handleApplyImagePosition}\n />\n )}\n {imagePropsOpen && (\n <ImagePropertiesDialog\n isOpen={imagePropsOpen}\n onClose={() => setImagePropsOpen(false)}\n onApply={handleApplyImageProperties}\n currentData={\n state.pmImageContext\n ? {\n alt: state.pmImageContext.alt ?? undefined,\n borderWidth: state.pmImageContext.borderWidth ?? undefined,\n borderColor: state.pmImageContext.borderColor ?? undefined,\n borderStyle: state.pmImageContext.borderStyle ?? undefined,\n }\n : undefined\n }\n />\n )}\n {footnotePropsOpen && (\n <FootnotePropertiesDialog\n isOpen={footnotePropsOpen}\n onClose={() => setFootnotePropsOpen(false)}\n onApply={handleApplyFootnoteProperties}\n footnotePr={history.state?.package.document?.finalSectionProperties?.footnotePr}\n endnotePr={history.state?.package.document?.finalSectionProperties?.endnotePr}\n />\n )}\n </Suspense>\n {/* InlineHeaderFooterEditor is rendered inside the editor content area (position:relative div) */}\n {/* Hidden file input for image insertion */}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleImageFileChange}\n />\n </div>\n </ErrorBoundary>\n </ErrorProvider>\n );\n});\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default DocxEditor;\n","/**\n * Simple imperative API for rendering a DOCX editor into a DOM element.\n *\n * Usage:\n * ```ts\n * import { renderAsync } from '@eigenpal/docx-js-editor';\n *\n * const editor = await renderAsync(docxBlob, document.getElementById('container'), {\n * readOnly: false,\n * showToolbar: true,\n * });\n *\n * // Save the edited document\n * const buffer = await editor.save();\n *\n * // Clean up\n * editor.destroy();\n * ```\n */\n\nimport React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { DocxEditor, type DocxEditorProps, type DocxEditorRef } from './components/DocxEditor';\nimport type { DocxInput } from '@eigenpal/docx-core/utils/docxInput';\nimport type { Document } from '@eigenpal/docx-core/types/document';\n\n/**\n * Options for {@link renderAsync}. A subset of DocxEditorProps minus\n * `documentBuffer` / `document` (passed as the first argument instead).\n */\nexport type RenderAsyncOptions = Omit<DocxEditorProps, 'documentBuffer' | 'document'>;\n\n/**\n * Handle returned by {@link renderAsync} for interacting with the editor.\n */\nexport interface DocxEditorHandle {\n /** Save the document and return the DOCX as an ArrayBuffer. */\n save: () => Promise<ArrayBuffer | null>;\n /** Get the current parsed document model. */\n getDocument: () => Document | null;\n /** Focus the editor. */\n focus: () => void;\n /** Set zoom level (1.0 = 100%). */\n setZoom: (zoom: number) => void;\n /** Unmount the editor and clean up. */\n destroy: () => void;\n}\n\n/**\n * Render a DOCX editor into a container element.\n *\n * @param input - DOCX data as ArrayBuffer, Uint8Array, Blob, or File\n * @param container - DOM element to render into\n * @param options - Editor configuration (toolbar, readOnly, callbacks, etc.)\n * @returns A handle with save / destroy / getDocument methods\n */\nexport function renderAsync(\n input: DocxInput,\n container: HTMLElement,\n options: RenderAsyncOptions = {}\n): Promise<DocxEditorHandle> {\n return new Promise<DocxEditorHandle>((resolve, reject) => {\n const ref = React.createRef<DocxEditorRef>();\n let root: Root | null = null;\n\n try {\n root = createRoot(container);\n } catch (err) {\n reject(err);\n return;\n }\n\n const handle: DocxEditorHandle = {\n save: () => ref.current?.save() ?? Promise.resolve(null),\n getDocument: () => ref.current?.getDocument() ?? null,\n focus: () => ref.current?.focus(),\n setZoom: (z) => ref.current?.setZoom(z),\n destroy: () => {\n root?.unmount();\n root = null;\n },\n };\n\n // Track whether we've already resolved/rejected to avoid double-calling\n let settled = false;\n\n const element = React.createElement(DocxEditor, {\n ...options,\n documentBuffer: input,\n onError: (error: Error) => {\n options.onError?.(error);\n if (!settled) {\n settled = true;\n reject(error);\n }\n },\n onChange: (doc: Document) => {\n options.onChange?.(doc);\n // First onChange means the document parsed and rendered successfully\n if (!settled) {\n settled = true;\n resolve(handle);\n }\n },\n ref,\n } as DocxEditorProps & { ref: React.Ref<DocxEditorRef> });\n\n root.render(element);\n });\n}\n","/**\n * useAutoSave Hook\n *\n * Automatically saves document state to localStorage at configurable intervals.\n *\n * Features:\n * - Configurable save interval (default: 30 seconds)\n * - Saves document JSON to localStorage\n * - Recovery of saved state on load\n * - Manual save trigger\n * - Last save timestamp tracking\n * - Save status callbacks\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { Document } from '@eigenpal/docx-core/types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Auto-save status\n */\nexport type AutoSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\n/**\n * Options for useAutoSave hook\n */\nexport interface UseAutoSaveOptions {\n /** Storage key for localStorage (default: 'docx-editor-autosave') */\n storageKey?: string;\n /** Save interval in milliseconds (default: 30000 - 30 seconds) */\n interval?: number;\n /** Whether auto-save is enabled (default: true) */\n enabled?: boolean;\n /** Maximum age of auto-save in milliseconds before it's considered stale (default: 24 hours) */\n maxAge?: number;\n /** Callback when save succeeds */\n onSave?: (timestamp: Date) => void;\n /** Callback when save fails */\n onError?: (error: Error) => void;\n /** Callback when recovery data is found */\n onRecoveryAvailable?: (savedDocument: SavedDocumentData) => void;\n /** Whether to save immediately when document changes (debounced) */\n saveOnChange?: boolean;\n /** Debounce delay for saveOnChange in milliseconds (default: 2000) */\n debounceDelay?: number;\n}\n\n/**\n * Return value of useAutoSave hook\n */\nexport interface UseAutoSaveReturn {\n /** Current auto-save status */\n status: AutoSaveStatus;\n /** Last save timestamp */\n lastSaveTime: Date | null;\n /** Manually trigger a save */\n save: () => Promise<boolean>;\n /** Clear auto-saved data from storage */\n clearAutoSave: () => void;\n /** Check if there's recoverable data */\n hasRecoveryData: boolean;\n /** Get the saved document data for recovery */\n getRecoveryData: () => SavedDocumentData | null;\n /** Accept and apply recovered data */\n acceptRecovery: () => Document | null;\n /** Dismiss recovery (clears saved data) */\n dismissRecovery: () => void;\n /** Whether auto-save is currently enabled */\n isEnabled: boolean;\n /** Enable auto-save */\n enable: () => void;\n /** Disable auto-save */\n disable: () => void;\n}\n\n/**\n * Saved document data structure\n */\nexport interface SavedDocumentData {\n /** The document JSON */\n document: Document;\n /** When the document was saved */\n savedAt: string;\n /** Version for format compatibility */\n version: number;\n /** Optional document identifier */\n documentId?: string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_STORAGE_KEY = 'docx-editor-autosave';\nconst DEFAULT_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours\nconst DEFAULT_DEBOUNCE_DELAY = 2000; // 2 seconds\nconst SAVE_VERSION = 1;\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if localStorage is available\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__docx_editor_test__';\n localStorage.setItem(testKey, 'test');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Serialize document for storage\n * Excludes the original buffer to save space\n */\nfunction serializeDocument(document: Document): string {\n const serializable = {\n ...document,\n originalBuffer: null, // Don't store the binary buffer\n };\n return JSON.stringify(serializable);\n}\n\n/**\n * Parse saved document data\n */\nfunction parseSavedData(json: string): SavedDocumentData | null {\n try {\n const data = JSON.parse(json);\n if (!data || typeof data !== 'object') return null;\n if (!data.document || !data.savedAt) return null;\n if (data.version !== SAVE_VERSION) {\n // Handle version migration in future if needed\n console.warn('Auto-save data version mismatch, may need migration');\n }\n return data as SavedDocumentData;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if saved data is stale (too old)\n */\nfunction isStale(savedAt: string, maxAge: number): boolean {\n const savedTime = new Date(savedAt).getTime();\n const now = Date.now();\n return now - savedTime > maxAge;\n}\n\n// ============================================================================\n// USE AUTO SAVE HOOK\n// ============================================================================\n\n/**\n * React hook for auto-saving document to localStorage\n */\nexport function useAutoSave(\n document: Document | null | undefined,\n options: UseAutoSaveOptions = {}\n): UseAutoSaveReturn {\n const {\n storageKey = DEFAULT_STORAGE_KEY,\n interval = DEFAULT_INTERVAL,\n enabled: initialEnabled = true,\n maxAge = DEFAULT_MAX_AGE,\n onSave,\n onError,\n onRecoveryAvailable,\n saveOnChange = true,\n debounceDelay = DEFAULT_DEBOUNCE_DELAY,\n } = options;\n\n const [status, setStatus] = useState<AutoSaveStatus>('idle');\n const [lastSaveTime, setLastSaveTime] = useState<Date | null>(null);\n const [hasRecoveryData, setHasRecoveryData] = useState(false);\n const [isEnabled, setIsEnabled] = useState(initialEnabled);\n\n const documentRef = useRef(document);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastSavedJsonRef = useRef<string | null>(null);\n const storageAvailableRef = useRef(isLocalStorageAvailable());\n\n // Keep document ref updated\n useEffect(() => {\n documentRef.current = document;\n }, [document]);\n\n /**\n * Save document to localStorage\n */\n const save = useCallback(async (): Promise<boolean> => {\n if (!storageAvailableRef.current) {\n onError?.(new Error('localStorage is not available'));\n return false;\n }\n\n const doc = documentRef.current;\n if (!doc) {\n return false;\n }\n\n setStatus('saving');\n\n try {\n const serialized = serializeDocument(doc);\n\n // Skip if document hasn't changed since last save\n if (serialized === lastSavedJsonRef.current) {\n setStatus('saved');\n return true;\n }\n\n const savedData: SavedDocumentData = {\n document: doc,\n savedAt: new Date().toISOString(),\n version: SAVE_VERSION,\n };\n\n // Serialize again with metadata (can't reuse because we stripped buffer)\n const dataToSave: SavedDocumentData = {\n document: {\n ...doc,\n originalBuffer: null as any,\n },\n savedAt: savedData.savedAt,\n version: SAVE_VERSION,\n };\n\n localStorage.setItem(storageKey, JSON.stringify(dataToSave));\n lastSavedJsonRef.current = serialized;\n\n const saveTime = new Date();\n setLastSaveTime(saveTime);\n setStatus('saved');\n onSave?.(saveTime);\n\n return true;\n } catch (error) {\n console.error('Auto-save failed:', error);\n setStatus('error');\n onError?.(error as Error);\n return false;\n }\n }, [storageKey, onSave, onError]);\n\n /**\n * Clear auto-saved data\n */\n const clearAutoSave = useCallback(() => {\n if (!storageAvailableRef.current) return;\n\n try {\n localStorage.removeItem(storageKey);\n setHasRecoveryData(false);\n lastSavedJsonRef.current = null;\n } catch (error) {\n console.error('Failed to clear auto-save:', error);\n }\n }, [storageKey]);\n\n /**\n * Get recovery data from storage\n */\n const getRecoveryData = useCallback((): SavedDocumentData | null => {\n if (!storageAvailableRef.current) return null;\n\n try {\n const savedJson = localStorage.getItem(storageKey);\n if (!savedJson) return null;\n\n const savedData = parseSavedData(savedJson);\n if (!savedData) return null;\n\n // Check if stale\n if (isStale(savedData.savedAt, maxAge)) {\n clearAutoSave();\n return null;\n }\n\n return savedData;\n } catch {\n return null;\n }\n }, [storageKey, maxAge, clearAutoSave]);\n\n /**\n * Accept and return recovered document\n */\n const acceptRecovery = useCallback((): Document | null => {\n const recoveryData = getRecoveryData();\n if (!recoveryData) return null;\n\n setHasRecoveryData(false);\n return recoveryData.document;\n }, [getRecoveryData]);\n\n /**\n * Dismiss recovery and clear saved data\n */\n const dismissRecovery = useCallback(() => {\n clearAutoSave();\n setHasRecoveryData(false);\n }, [clearAutoSave]);\n\n /**\n * Enable auto-save\n */\n const enable = useCallback(() => {\n setIsEnabled(true);\n }, []);\n\n /**\n * Disable auto-save\n */\n const disable = useCallback(() => {\n setIsEnabled(false);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n }, []);\n\n // Check for recovery data on mount\n useEffect(() => {\n if (!storageAvailableRef.current) return;\n\n const recoveryData = getRecoveryData();\n if (recoveryData) {\n setHasRecoveryData(true);\n onRecoveryAvailable?.(recoveryData);\n }\n }, [getRecoveryData, onRecoveryAvailable]);\n\n // Set up interval auto-save\n useEffect(() => {\n if (!isEnabled || !storageAvailableRef.current) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n\n intervalRef.current = setInterval(() => {\n save();\n }, interval);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isEnabled, interval, save]);\n\n // Debounced save on document change\n useEffect(() => {\n if (!isEnabled || !saveOnChange || !document || !storageAvailableRef.current) {\n return;\n }\n\n // Clear existing debounce timer\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n // Set new debounce timer\n debounceRef.current = setTimeout(() => {\n save();\n }, debounceDelay);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [isEnabled, saveOnChange, document, debounceDelay, save]);\n\n // Save on unmount if enabled\n useEffect(() => {\n return () => {\n if (isEnabled && documentRef.current && storageAvailableRef.current) {\n // Synchronous save on unmount\n try {\n const doc = documentRef.current;\n const dataToSave: SavedDocumentData = {\n document: {\n ...doc,\n originalBuffer: null as any,\n },\n savedAt: new Date().toISOString(),\n version: SAVE_VERSION,\n };\n localStorage.setItem(storageKey, JSON.stringify(dataToSave));\n } catch (error) {\n console.error('Failed to save on unmount:', error);\n }\n }\n };\n }, [isEnabled, storageKey]);\n\n return {\n status,\n lastSaveTime,\n save,\n clearAutoSave,\n hasRecoveryData,\n getRecoveryData,\n acceptRecovery,\n dismissRecovery,\n isEnabled,\n enable,\n disable,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Format last save time for display\n */\nexport function formatLastSaveTime(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n\n if (diffSec < 10) return 'Just now';\n if (diffSec < 60) return `${diffSec} seconds ago`;\n if (diffMin < 60) return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour === 1 ? '' : 's'} ago`;\n\n return date.toLocaleDateString();\n}\n\n/**\n * Get auto-save status label\n */\nexport function getAutoSaveStatusLabel(status: AutoSaveStatus): string {\n const labels: Record<AutoSaveStatus, string> = {\n idle: 'Ready',\n saving: 'Saving...',\n saved: 'Saved',\n error: 'Save failed',\n };\n return labels[status];\n}\n\n/**\n * Get storage size used by auto-save\n */\nexport function getAutoSaveStorageSize(storageKey: string = DEFAULT_STORAGE_KEY): number {\n try {\n const data = localStorage.getItem(storageKey);\n if (!data) return 0;\n return new Blob([data]).size;\n } catch {\n return 0;\n }\n}\n\n/**\n * Format storage size for display\n */\nexport function formatStorageSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Check if auto-save is supported in this environment\n */\nexport function isAutoSaveSupported(): boolean {\n return isLocalStorageAvailable();\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default useAutoSave;\n","/**\n * useWheelZoom Hook\n *\n * Enables Ctrl+scroll (or Cmd+scroll on Mac) to zoom in/out.\n * Features:\n * - Configurable zoom range and step\n * - Smooth zoom transitions\n * - Pinch-to-zoom support on trackpads\n * - Zoom reset (Ctrl+0)\n * - Zoom in/out shortcuts (Ctrl++, Ctrl+-)\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for useWheelZoom hook\n */\nexport interface UseWheelZoomOptions {\n /** Initial zoom level (default: 1.0) */\n initialZoom?: number;\n /** Minimum zoom level (default: 0.25) */\n minZoom?: number;\n /** Maximum zoom level (default: 4.0) */\n maxZoom?: number;\n /** Zoom step for each scroll event (default: 0.1) */\n zoomStep?: number;\n /** Whether zoom is enabled (default: true) */\n enabled?: boolean;\n /** Container element ref to attach wheel listener */\n containerRef?: React.RefObject<HTMLElement>;\n /** Callback when zoom changes */\n onZoomChange?: (zoom: number) => void;\n /** Whether to enable keyboard shortcuts (Ctrl++, Ctrl+-, Ctrl+0) */\n enableKeyboardShortcuts?: boolean;\n /** Whether to prevent default browser zoom behavior */\n preventDefault?: boolean;\n}\n\n/**\n * Return value of useWheelZoom hook\n */\nexport interface UseWheelZoomReturn {\n /** Current zoom level */\n zoom: number;\n /** Set zoom level directly */\n setZoom: (zoom: number) => void;\n /** Zoom in by step */\n zoomIn: () => void;\n /** Zoom out by step */\n zoomOut: () => void;\n /** Reset zoom to initial level */\n resetZoom: () => void;\n /** Reset zoom to 100% */\n zoomTo100: () => void;\n /** Zoom to fit width */\n zoomToFit: (containerWidth: number, contentWidth: number) => void;\n /** Whether currently at minimum zoom */\n isMinZoom: boolean;\n /** Whether currently at maximum zoom */\n isMaxZoom: boolean;\n /** Zoom percentage (e.g., 100 for zoom level 1.0) */\n zoomPercent: number;\n /** Wheel event handler (for manual attachment) */\n handleWheel: (event: WheelEvent) => void;\n /** Keyboard event handler (for manual attachment) */\n handleKeyDown: (event: KeyboardEvent) => void;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_INITIAL_ZOOM = 1.0;\nconst DEFAULT_MIN_ZOOM = 0.25;\nconst DEFAULT_MAX_ZOOM = 4.0;\nconst DEFAULT_ZOOM_STEP = 0.1;\n\n/**\n * Preset zoom levels for snapping\n */\nexport const ZOOM_PRESETS = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0, 4.0];\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Round zoom to 2 decimal places\n */\nfunction roundZoom(zoom: number): number {\n return Math.round(zoom * 100) / 100;\n}\n\n/**\n * Find nearest preset zoom level\n */\nfunction nearestPreset(zoom: number): number {\n let nearest = ZOOM_PRESETS[0];\n let minDiff = Math.abs(zoom - nearest);\n\n for (const preset of ZOOM_PRESETS) {\n const diff = Math.abs(zoom - preset);\n if (diff < minDiff) {\n minDiff = diff;\n nearest = preset;\n }\n }\n\n return nearest;\n}\n\n/**\n * Get next preset zoom level (for zoom in)\n */\nfunction nextPreset(currentZoom: number): number {\n for (const preset of ZOOM_PRESETS) {\n if (preset > currentZoom + 0.01) {\n return preset;\n }\n }\n return ZOOM_PRESETS[ZOOM_PRESETS.length - 1];\n}\n\n/**\n * Get previous preset zoom level (for zoom out)\n */\nfunction prevPreset(currentZoom: number): number {\n for (let i = ZOOM_PRESETS.length - 1; i >= 0; i--) {\n if (ZOOM_PRESETS[i] < currentZoom - 0.01) {\n return ZOOM_PRESETS[i];\n }\n }\n return ZOOM_PRESETS[0];\n}\n\n// ============================================================================\n// USE WHEEL ZOOM HOOK\n// ============================================================================\n\n/**\n * React hook for Ctrl+scroll zoom functionality\n */\nexport function useWheelZoom(options: UseWheelZoomOptions = {}): UseWheelZoomReturn {\n const {\n initialZoom = DEFAULT_INITIAL_ZOOM,\n minZoom = DEFAULT_MIN_ZOOM,\n maxZoom = DEFAULT_MAX_ZOOM,\n zoomStep = DEFAULT_ZOOM_STEP,\n enabled = true,\n containerRef,\n onZoomChange,\n enableKeyboardShortcuts = true,\n preventDefault = true,\n } = options;\n\n const [zoom, setZoomState] = useState(initialZoom);\n const zoomRef = useRef(zoom);\n\n // Keep ref in sync with state\n useEffect(() => {\n zoomRef.current = zoom;\n }, [zoom]);\n\n /**\n * Set zoom with clamping and callback\n */\n const setZoom = useCallback(\n (newZoom: number) => {\n const clampedZoom = roundZoom(clamp(newZoom, minZoom, maxZoom));\n if (clampedZoom !== zoomRef.current) {\n setZoomState(clampedZoom);\n onZoomChange?.(clampedZoom);\n }\n },\n [minZoom, maxZoom, onZoomChange]\n );\n\n /**\n * Zoom in by step\n */\n const zoomIn = useCallback(() => {\n setZoom(zoomRef.current + zoomStep);\n }, [zoomStep, setZoom]);\n\n /**\n * Zoom out by step\n */\n const zoomOut = useCallback(() => {\n setZoom(zoomRef.current - zoomStep);\n }, [zoomStep, setZoom]);\n\n /**\n * Reset zoom to initial level\n */\n const resetZoom = useCallback(() => {\n setZoom(initialZoom);\n }, [initialZoom, setZoom]);\n\n /**\n * Reset zoom to 100%\n */\n const zoomTo100 = useCallback(() => {\n setZoom(1.0);\n }, [setZoom]);\n\n /**\n * Zoom to fit width\n */\n const zoomToFit = useCallback(\n (containerWidth: number, contentWidth: number) => {\n if (contentWidth > 0) {\n const fitZoom = containerWidth / contentWidth;\n setZoom(fitZoom);\n }\n },\n [setZoom]\n );\n\n /**\n * Handle wheel event\n */\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!enabled) return;\n\n // Check for Ctrl/Cmd key\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n if (!isCtrlOrMeta) return;\n\n // Prevent default browser zoom\n if (preventDefault) {\n event.preventDefault();\n }\n\n // Determine zoom direction\n // deltaY > 0 means scrolling down (zoom out)\n // deltaY < 0 means scrolling up (zoom in)\n const delta = event.deltaY;\n\n if (delta < 0) {\n // Scroll up = zoom in\n setZoom(zoomRef.current + zoomStep);\n } else if (delta > 0) {\n // Scroll down = zoom out\n setZoom(zoomRef.current - zoomStep);\n }\n },\n [enabled, preventDefault, zoomStep, setZoom]\n );\n\n /**\n * Handle keyboard shortcuts\n */\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!enabled || !enableKeyboardShortcuts) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n if (!isCtrlOrMeta) return;\n\n // Ctrl+0 - Reset zoom to 100%\n if (event.key === '0') {\n event.preventDefault();\n zoomTo100();\n return;\n }\n\n // Ctrl++ or Ctrl+= - Zoom in\n if (event.key === '+' || event.key === '=') {\n event.preventDefault();\n zoomIn();\n return;\n }\n\n // Ctrl+- - Zoom out\n if (event.key === '-') {\n event.preventDefault();\n zoomOut();\n return;\n }\n },\n [enabled, enableKeyboardShortcuts, zoomIn, zoomOut, zoomTo100]\n );\n\n // Attach wheel listener to container\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef?.current;\n if (!container) return;\n\n // Use passive: false to allow preventDefault\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [enabled, containerRef, handleWheel]);\n\n // Attach keyboard listener\n useEffect(() => {\n if (!enabled || !enableKeyboardShortcuts) return;\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [enabled, enableKeyboardShortcuts, handleKeyDown]);\n\n return {\n zoom,\n setZoom,\n zoomIn,\n zoomOut,\n resetZoom,\n zoomTo100,\n zoomToFit,\n isMinZoom: zoom <= minZoom,\n isMaxZoom: zoom >= maxZoom,\n zoomPercent: Math.round(zoom * 100),\n handleWheel,\n handleKeyDown,\n };\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get zoom presets\n */\nexport function getZoomPresets(): number[] {\n return [...ZOOM_PRESETS];\n}\n\n/**\n * Find nearest zoom preset\n */\nexport function findNearestZoomPreset(zoom: number): number {\n return nearestPreset(zoom);\n}\n\n/**\n * Get next zoom preset (for zoom in)\n */\nexport function getNextZoomPreset(zoom: number): number {\n return nextPreset(zoom);\n}\n\n/**\n * Get previous zoom preset (for zoom out)\n */\nexport function getPreviousZoomPreset(zoom: number): number {\n return prevPreset(zoom);\n}\n\n/**\n * Format zoom level for display\n */\nexport function formatZoom(zoom: number): string {\n return `${Math.round(zoom * 100)}%`;\n}\n\n/**\n * Parse zoom from percentage string\n */\nexport function parseZoom(zoomString: string): number | null {\n const match = zoomString.match(/(\\d+(\\.\\d+)?)/);\n if (match) {\n const value = parseFloat(match[1]);\n if (!isNaN(value)) {\n return value / 100;\n }\n }\n return null;\n}\n\n/**\n * Check if zoom level is at a preset\n */\nexport function isZoomPreset(zoom: number): boolean {\n return ZOOM_PRESETS.some((preset) => Math.abs(preset - zoom) < 0.01);\n}\n\n/**\n * Clamp zoom to valid range\n */\nexport function clampZoom(\n zoom: number,\n minZoom: number = DEFAULT_MIN_ZOOM,\n maxZoom: number = DEFAULT_MAX_ZOOM\n): number {\n return roundZoom(clamp(zoom, minZoom, maxZoom));\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default useWheelZoom;\n","/**\n * Selection Highlight Hook\n *\n * A React hook that manages visual selection highlighting across multiple runs.\n * Uses a combination of CSS ::selection pseudo-element styling and optional\n * overlay rectangles for complex scenarios.\n *\n * Features:\n * - Consistent selection highlighting across all text runs\n * - Support for text with different backgrounds (highlighted, dark bg)\n * - Optional overlay rectangles for custom highlight effects\n * - Debounced updates for performance\n */\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport type { CSSProperties } from 'react';\nimport {\n HighlightRect,\n SelectionHighlightConfig,\n DEFAULT_SELECTION_STYLE,\n getMergedSelectionRects,\n hasActiveSelection,\n getSelectedText,\n isSelectionWithin,\n injectSelectionStyles,\n areSelectionStylesInjected,\n} from '@eigenpal/docx-core/utils/selectionHighlight';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Options for the useSelectionHighlight hook\n */\nexport interface UseSelectionHighlightOptions {\n /** Reference to the container element */\n containerRef: React.RefObject<HTMLElement>;\n /** Whether to enable selection highlighting */\n enabled?: boolean;\n /** Custom highlight configuration */\n config?: SelectionHighlightConfig;\n /** Whether to use overlay rectangles (default: false, uses CSS) */\n useOverlay?: boolean;\n /** Debounce delay for rect updates in ms (default: 16) */\n debounceMs?: number;\n /** Callback when selection changes */\n onSelectionChange?: (hasSelection: boolean, text: string) => void;\n}\n\n/**\n * Return value from the useSelectionHighlight hook\n */\nexport interface UseSelectionHighlightReturn {\n /** Whether there is an active selection */\n hasSelection: boolean;\n /** The selected text */\n selectedText: string;\n /** Highlight rectangles (only populated if useOverlay is true) */\n highlightRects: HighlightRect[];\n /** Whether selection is within the container */\n isSelectionInContainer: boolean;\n /** Refresh the highlight state */\n refresh: () => void;\n /** Get styles for a highlight rect overlay */\n getOverlayStyle: (rect: HighlightRect) => CSSProperties;\n}\n\n// ============================================================================\n// HOOK IMPLEMENTATION\n// ============================================================================\n\n/**\n * Hook to manage selection highlighting in the editor\n */\nexport function useSelectionHighlight(\n options: UseSelectionHighlightOptions\n): UseSelectionHighlightReturn {\n const {\n containerRef,\n enabled = true,\n config = DEFAULT_SELECTION_STYLE,\n useOverlay = false,\n debounceMs = 16,\n onSelectionChange,\n } = options;\n\n // State\n const [hasSelectionState, setHasSelectionState] = useState(false);\n const [selectedText, setSelectedText] = useState('');\n const [highlightRects, setHighlightRects] = useState<HighlightRect[]>([]);\n const [isSelectionInContainer, setIsSelectionInContainer] = useState(false);\n\n // Refs for debouncing\n const debounceTimeoutRef = useRef<number | null>(null);\n const lastUpdateRef = useRef<number>(0);\n\n /**\n * Update selection state\n */\n const updateSelectionState = useCallback(() => {\n const container = containerRef.current;\n const hasActive = hasActiveSelection();\n const text = getSelectedText();\n const inContainer = container ? isSelectionWithin(container) : false;\n\n setHasSelectionState(hasActive);\n setSelectedText(text);\n setIsSelectionInContainer(inContainer);\n\n // Update overlay rects if enabled\n if (useOverlay && inContainer) {\n const rects = getMergedSelectionRects(container);\n setHighlightRects(rects);\n } else {\n setHighlightRects([]);\n }\n\n // Notify callback\n if (onSelectionChange) {\n onSelectionChange(hasActive && inContainer, text);\n }\n }, [containerRef, useOverlay, onSelectionChange]);\n\n /**\n * Debounced update\n */\n const debouncedUpdate = useCallback(() => {\n const now = performance.now();\n\n // Skip if updated too recently\n if (now - lastUpdateRef.current < debounceMs) {\n // Schedule delayed update\n if (debounceTimeoutRef.current !== null) {\n clearTimeout(debounceTimeoutRef.current);\n }\n debounceTimeoutRef.current = window.setTimeout(() => {\n lastUpdateRef.current = performance.now();\n updateSelectionState();\n debounceTimeoutRef.current = null;\n }, debounceMs);\n return;\n }\n\n lastUpdateRef.current = now;\n updateSelectionState();\n }, [debounceMs, updateSelectionState]);\n\n /**\n * Force refresh\n */\n const refresh = useCallback(() => {\n updateSelectionState();\n }, [updateSelectionState]);\n\n /**\n * Get overlay style for a highlight rect\n */\n const getOverlayStyle = useCallback(\n (rect: HighlightRect): CSSProperties => ({\n position: 'absolute',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n backgroundColor: config.backgroundColor,\n borderRadius: config.borderRadius ? `${config.borderRadius}px` : undefined,\n border: config.borderColor ? `1px solid ${config.borderColor}` : undefined,\n zIndex: config.zIndex ?? 0,\n opacity: config.opacity ?? 1,\n mixBlendMode: config.mixBlendMode,\n pointerEvents: 'none',\n userSelect: 'none',\n }),\n [config]\n );\n\n // Inject CSS styles on mount\n useEffect(() => {\n if (enabled && !areSelectionStylesInjected()) {\n injectSelectionStyles(config);\n }\n\n return () => {\n // Only remove if we're the last one using them\n // In practice, we keep them for the lifetime of the app\n };\n }, [enabled, config]);\n\n // Listen for selection changes\n useEffect(() => {\n if (!enabled) return;\n\n const handleSelectionChange = () => {\n debouncedUpdate();\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n\n // Also listen for mouseup in case selectionchange doesn't fire\n document.addEventListener('mouseup', handleSelectionChange);\n\n // Initial update\n updateSelectionState();\n\n return () => {\n document.removeEventListener('selectionchange', handleSelectionChange);\n document.removeEventListener('mouseup', handleSelectionChange);\n\n if (debounceTimeoutRef.current !== null) {\n clearTimeout(debounceTimeoutRef.current);\n }\n };\n }, [enabled, debouncedUpdate, updateSelectionState]);\n\n return {\n hasSelection: hasSelectionState,\n selectedText,\n highlightRects,\n isSelectionInContainer,\n refresh,\n getOverlayStyle,\n };\n}\n\n// ============================================================================\n// OVERLAY COMPONENT HELPER\n// ============================================================================\n\n/**\n * Props for selection overlay component\n */\nexport interface SelectionOverlayProps {\n /** Highlight rectangles to render */\n rects: HighlightRect[];\n /** Style configuration */\n config?: SelectionHighlightConfig;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Generate selection overlay elements (for use in JSX)\n *\n * Usage:\n * ```tsx\n * const { highlightRects } = useSelectionHighlight({ ... });\n * return (\n * <div style={{ position: 'relative' }}>\n * {generateOverlayElements(highlightRects)}\n * <div>... content ...</div>\n * </div>\n * );\n * ```\n */\nexport function generateOverlayElements(\n rects: HighlightRect[],\n config: SelectionHighlightConfig = DEFAULT_SELECTION_STYLE\n): React.ReactNode[] {\n return rects.map((rect, index) =>\n React.createElement('div', {\n key: `selection-overlay-${index}`,\n style: {\n position: 'absolute' as const,\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n backgroundColor: config.backgroundColor,\n borderRadius: config.borderRadius ? `${config.borderRadius}px` : undefined,\n border: config.borderColor ? `1px solid ${config.borderColor}` : undefined,\n zIndex: config.zIndex ?? 0,\n opacity: config.opacity ?? 1,\n mixBlendMode: config.mixBlendMode,\n pointerEvents: 'none' as const,\n userSelect: 'none' as const,\n },\n })\n );\n}\n\nexport default useSelectionHighlight;\n","/**\n * useClipboard Hook\n *\n * React hook for managing clipboard operations in the editor with formatting preservation.\n *\n * Features:\n * - Copy: Copies selected runs/paragraphs to clipboard with formatting as HTML\n * - Cut: Copies and removes selected content\n * - Paste: Parses clipboard HTML/text and applies formatting\n * - Handles Word-pasted content (cleans Word-specific markup)\n * - Keyboard shortcuts (Ctrl+C, Ctrl+X, Ctrl+V)\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { Run } from '@eigenpal/docx-core/types/document';\nimport {\n copyRuns,\n handlePasteEvent,\n runsToClipboardContent,\n type ParsedClipboardContent,\n} from '@eigenpal/docx-core/utils/clipboard';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Selection data for clipboard operations\n */\nexport interface ClipboardSelection {\n /** Selected text (plain text) */\n text: string;\n /** Selected runs */\n runs: Run[];\n /** Start position */\n startParagraphIndex: number;\n startRunIndex: number;\n startOffset: number;\n /** End position */\n endParagraphIndex: number;\n endRunIndex: number;\n endOffset: number;\n /** Whether selection spans multiple paragraphs */\n isMultiParagraph: boolean;\n}\n\n/**\n * Options for useClipboard hook\n */\nexport interface UseClipboardOptions {\n /** Callback when content is copied */\n onCopy?: (selection: ClipboardSelection) => void;\n /** Callback when content is cut */\n onCut?: (selection: ClipboardSelection) => void;\n /** Callback when content is pasted */\n onPaste?: (content: ParsedClipboardContent, asPlainText: boolean) => void;\n /** Whether to clean Word-specific formatting */\n cleanWordFormatting?: boolean;\n /** Whether the editor is editable */\n editable?: boolean;\n /** Callback for errors */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return value of useClipboard hook\n */\nexport interface UseClipboardReturn {\n /** Copy the current selection to clipboard */\n copy: (selection: ClipboardSelection) => Promise<boolean>;\n /** Cut the current selection to clipboard */\n cut: (selection: ClipboardSelection) => Promise<boolean>;\n /** Paste from clipboard */\n paste: (asPlainText?: boolean) => Promise<ParsedClipboardContent | null>;\n /** Handle copy event from DOM */\n handleCopy: (event: ClipboardEvent) => void;\n /** Handle cut event from DOM */\n handleCut: (event: ClipboardEvent) => void;\n /** Handle paste event from DOM */\n handlePaste: (event: ClipboardEvent) => void;\n /** Handle keyboard shortcuts */\n handleKeyDown: (event: KeyboardEvent) => void;\n /** Whether a clipboard operation is in progress */\n isProcessing: boolean;\n /** Last pasted content */\n lastPastedContent: ParsedClipboardContent | null;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Get selected runs from the current DOM selection\n */\nexport function getSelectionRuns(): Run[] {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) {\n return [];\n }\n\n const runs: Run[] = [];\n const range = selection.getRangeAt(0);\n\n // Find all run elements within the selection\n const container = range.commonAncestorContainer;\n const containerElement =\n container.nodeType === Node.ELEMENT_NODE ? (container as HTMLElement) : container.parentElement;\n\n if (!containerElement) return runs;\n\n // Get all docx-run elements within the range\n const runElements = containerElement.querySelectorAll('.docx-run');\n\n runElements.forEach((runEl) => {\n if (range.intersectsNode(runEl)) {\n // Extract text content and formatting from the run\n const text = getSelectedTextFromRun(runEl, range);\n if (text) {\n const formatting = extractFormattingFromElement(runEl as HTMLElement);\n runs.push({\n type: 'run',\n formatting,\n content: [{ type: 'text', text }],\n });\n }\n }\n });\n\n // If no runs found, just get the selected text\n if (runs.length === 0) {\n const selectedText = selection.toString();\n if (selectedText) {\n runs.push({\n type: 'run',\n content: [{ type: 'text', text: selectedText }],\n });\n }\n }\n\n return runs;\n}\n\n/**\n * Get selected text from a run element, considering partial selection\n */\nfunction getSelectedTextFromRun(runEl: Node, range: Range): string {\n const runRange = document.createRange();\n runRange.selectNodeContents(runEl);\n\n // Check if the run is fully or partially selected\n const startInRun =\n range.compareBoundaryPoints(Range.START_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, runRange) <= 0;\n const endInRun =\n range.compareBoundaryPoints(Range.END_TO_START, runRange) >= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, runRange) <= 0;\n\n if (startInRun && endInRun) {\n // Selection is entirely within this run\n return range.toString();\n } else if (startInRun) {\n // Selection starts in this run\n const tempRange = document.createRange();\n tempRange.setStart(range.startContainer, range.startOffset);\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(runRange.endContainer, runRange.endOffset);\n return tempRange.toString();\n } else if (endInRun) {\n // Selection ends in this run\n const tempRange = document.createRange();\n tempRange.selectNodeContents(runEl);\n tempRange.setEnd(range.endContainer, range.endOffset);\n tempRange.setStart(runRange.startContainer, runRange.startOffset);\n return tempRange.toString();\n } else if (range.intersectsNode(runEl)) {\n // Run is entirely within selection\n return runEl.textContent || '';\n }\n\n return '';\n}\n\n/**\n * Extract formatting from an HTML element's computed styles\n */\nfunction extractFormattingFromElement(element: HTMLElement): Run['formatting'] {\n const style = window.getComputedStyle(element);\n const formatting: Run['formatting'] = {};\n\n // Bold\n if (style.fontWeight === 'bold' || parseInt(style.fontWeight) >= 700) {\n formatting.bold = true;\n }\n\n // Italic\n if (style.fontStyle === 'italic') {\n formatting.italic = true;\n }\n\n // Underline\n const textDecoration = style.textDecoration || style.textDecorationLine;\n if (textDecoration && textDecoration.includes('underline')) {\n formatting.underline = { style: 'single' };\n }\n\n // Strikethrough\n if (textDecoration && textDecoration.includes('line-through')) {\n formatting.strike = true;\n }\n\n // Font size (convert px to half-points)\n const fontSize = parseFloat(style.fontSize);\n if (!isNaN(fontSize) && fontSize > 0) {\n // 1pt = 1.333px at 96dpi, font size in OOXML is in half-points\n formatting.fontSize = Math.round((fontSize / 1.333) * 2);\n }\n\n // Font family\n const fontFamily = style.fontFamily.replace(/[\"']/g, '').split(',')[0].trim();\n if (fontFamily) {\n formatting.fontFamily = { ascii: fontFamily };\n }\n\n // Color\n const color = style.color;\n if (color && color !== 'rgb(0, 0, 0)') {\n const hex = rgbToHex(color);\n if (hex) {\n formatting.color = { rgb: hex };\n }\n }\n\n // Background color\n const bgColor = style.backgroundColor;\n if (bgColor && bgColor !== 'transparent' && bgColor !== 'rgba(0, 0, 0, 0)') {\n const hex = rgbToHex(bgColor);\n if (hex) {\n formatting.shading = { fill: { rgb: hex } };\n }\n }\n\n return Object.keys(formatting).length > 0 ? formatting : undefined;\n}\n\n/**\n * Convert RGB color string to hex\n */\nfunction rgbToHex(color: string): string | null {\n if (!color || color === 'transparent' || color === 'inherit') {\n return null;\n }\n\n // Already hex\n if (color.startsWith('#')) {\n return color.slice(1).toUpperCase();\n }\n\n // RGB/RGBA\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');\n const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');\n const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');\n return (r + g + b).toUpperCase();\n }\n\n return null;\n}\n\n/**\n * Create a selection object from the current DOM selection\n */\nexport function createSelectionFromDOM(): ClipboardSelection | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) {\n return null;\n }\n\n const runs = getSelectionRuns();\n if (runs.length === 0) {\n return null;\n }\n\n const text = selection.toString();\n\n // Find paragraph indices from data attributes\n const range = selection.getRangeAt(0);\n const startPara = findParagraphElement(range.startContainer);\n const endPara = findParagraphElement(range.endContainer);\n\n const startParagraphIndex = startPara\n ? parseInt(startPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n const endParagraphIndex = endPara\n ? parseInt(endPara.getAttribute('data-paragraph-index') || '0', 10)\n : 0;\n\n return {\n text,\n runs,\n startParagraphIndex,\n startRunIndex: 0,\n startOffset: range.startOffset,\n endParagraphIndex,\n endRunIndex: 0,\n endOffset: range.endOffset,\n isMultiParagraph: startParagraphIndex !== endParagraphIndex,\n };\n}\n\n/**\n * Find the paragraph element containing a node\n */\nfunction findParagraphElement(node: Node): HTMLElement | null {\n let current: Node | null = node;\n while (current) {\n if (current.nodeType === Node.ELEMENT_NODE) {\n const element = current as HTMLElement;\n if (element.hasAttribute('data-paragraph-index')) {\n return element;\n }\n }\n current = current.parentNode;\n }\n return null;\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\n/**\n * React hook for clipboard operations\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardReturn {\n const { onCopy, onCut, onPaste, cleanWordFormatting = true, editable = true, onError } = options;\n\n const isProcessingRef = useRef<boolean>(false);\n const lastPastedContentRef = useRef<ParsedClipboardContent | null>(null);\n\n /**\n * Copy selection to clipboard\n */\n const copy = useCallback(\n async (selection: ClipboardSelection): Promise<boolean> => {\n if (isProcessingRef.current) return false;\n\n isProcessingRef.current = true;\n try {\n const success = await copyRuns(selection.runs, { onError });\n if (success) {\n onCopy?.(selection);\n }\n return success;\n } finally {\n isProcessingRef.current = false;\n }\n },\n [onCopy, onError]\n );\n\n /**\n * Cut selection to clipboard\n */\n const cut = useCallback(\n async (selection: ClipboardSelection): Promise<boolean> => {\n if (isProcessingRef.current || !editable) return false;\n\n isProcessingRef.current = true;\n try {\n const success = await copyRuns(selection.runs, { onError });\n if (success) {\n onCut?.(selection);\n }\n return success;\n } finally {\n isProcessingRef.current = false;\n }\n },\n [onCut, editable, onError]\n );\n\n /**\n * Paste from clipboard\n */\n const paste = useCallback(\n async (asPlainText = false): Promise<ParsedClipboardContent | null> => {\n if (isProcessingRef.current || !editable) return null;\n\n isProcessingRef.current = true;\n try {\n // Try to read from clipboard\n if (navigator.clipboard && navigator.clipboard.read) {\n const items = await navigator.clipboard.read();\n let html = '';\n let plainText = '';\n\n for (const item of items) {\n if (item.types.includes('text/html')) {\n const blob = await item.getType('text/html');\n html = await blob.text();\n }\n if (item.types.includes('text/plain')) {\n const blob = await item.getType('text/plain');\n plainText = await blob.text();\n }\n }\n\n // If paste as plain text requested, only use plain text\n if (asPlainText) {\n html = '';\n }\n\n const content = parseClipboardContent(html, plainText, cleanWordFormatting);\n lastPastedContentRef.current = content;\n onPaste?.(content, asPlainText);\n return content;\n }\n\n return null;\n } catch (error) {\n onError?.(error as Error);\n return null;\n } finally {\n isProcessingRef.current = false;\n }\n },\n [editable, cleanWordFormatting, onPaste, onError]\n );\n\n /**\n * Handle copy event from DOM\n */\n const handleCopy = useCallback(\n (event: ClipboardEvent) => {\n const selection = createSelectionFromDOM();\n if (!selection) return;\n\n event.preventDefault();\n\n const content = runsToClipboardContent(selection.runs);\n\n if (event.clipboardData) {\n event.clipboardData.setData('text/plain', content.plainText);\n event.clipboardData.setData('text/html', content.html);\n if (content.internal) {\n event.clipboardData.setData('application/x-docx-editor', content.internal);\n }\n }\n\n onCopy?.(selection);\n },\n [onCopy]\n );\n\n /**\n * Handle cut event from DOM\n */\n const handleCut = useCallback(\n (event: ClipboardEvent) => {\n if (!editable) return;\n\n const selection = createSelectionFromDOM();\n if (!selection) return;\n\n event.preventDefault();\n\n const content = runsToClipboardContent(selection.runs);\n\n if (event.clipboardData) {\n event.clipboardData.setData('text/plain', content.plainText);\n event.clipboardData.setData('text/html', content.html);\n if (content.internal) {\n event.clipboardData.setData('application/x-docx-editor', content.internal);\n }\n }\n\n onCut?.(selection);\n },\n [editable, onCut]\n );\n\n /**\n * Handle paste event from DOM\n */\n const handlePaste = useCallback(\n (event: ClipboardEvent) => {\n if (!editable) return;\n\n event.preventDefault();\n\n const content = handlePasteEvent(event, { cleanWordFormatting });\n if (content) {\n lastPastedContentRef.current = content;\n const asPlainText = (event as unknown as KeyboardEvent).shiftKey ?? false; // Shift+V = paste as plain text\n onPaste?.(content, asPlainText);\n }\n },\n [editable, cleanWordFormatting, onPaste]\n );\n\n /**\n * Handle keyboard shortcuts\n */\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n if (!isCtrlOrMeta) return;\n\n // Note: We let the native copy/cut/paste events handle the actual clipboard\n // operations. This function is for cases where we need to manually trigger.\n }, []);\n\n return {\n copy,\n cut,\n paste,\n handleCopy,\n handleCut,\n handlePaste,\n handleKeyDown,\n isProcessing: isProcessingRef.current,\n lastPastedContent: lastPastedContentRef.current,\n };\n}\n\n/**\n * Parse clipboard content (helper for async paste)\n */\nfunction parseClipboardContent(\n html: string,\n plainText: string,\n cleanWordFormatting: boolean\n): ParsedClipboardContent {\n const { parseClipboardHtml } = require('@eigenpal/docx-core/utils/clipboard');\n return parseClipboardHtml(html, plainText, cleanWordFormatting);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default useClipboard;\n","/**\n * PluginHost Component\n *\n * Wraps the editor and renders plugin panels.\n * Completely decoupled from editor internals.\n */\n\nimport {\n useEffect,\n useState,\n useCallback,\n useRef,\n useMemo,\n forwardRef,\n useImperativeHandle,\n cloneElement,\n} from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport type { Plugin as ProseMirrorPlugin } from 'prosemirror-state';\nimport type { EditorPlugin, PluginHostProps, PluginHostRef, PanelConfig } from './types';\n\n// Default panel configuration\nconst DEFAULT_PANEL_CONFIG: Required<PanelConfig> = {\n position: 'right',\n defaultSize: 280,\n minSize: 200,\n maxSize: 500,\n resizable: true,\n collapsible: true,\n defaultCollapsed: false,\n};\n\n/**\n * Injects CSS styles into the document head.\n */\nfunction injectStyles(pluginId: string, css: string): () => void {\n const styleId = `plugin-styles-${pluginId}`;\n\n // Remove existing styles if any\n const existing = document.getElementById(styleId);\n if (existing) {\n existing.remove();\n }\n\n // Inject new styles\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = css;\n document.head.appendChild(style);\n\n // Return cleanup function\n return () => {\n const el = document.getElementById(styleId);\n if (el) {\n el.remove();\n }\n };\n}\n\n// Default styles for PluginHost - defined here so it can be used in the component\nconst PLUGIN_HOST_STYLES = `\n.plugin-host {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: visible;\n position: relative;\n}\n\n.plugin-host-editor {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n overflow: visible;\n}\n\n\n.plugin-panels-left,\n.plugin-panels-right {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n background: #f8f9fa;\n border-color: #e9ecef;\n}\n\n.plugin-panels-left {\n border-right: 1px solid #e9ecef;\n}\n\n.plugin-panels-right {\n border-left: 1px solid #e9ecef;\n}\n\n.plugin-panels-bottom {\n border-top: 1px solid #e9ecef;\n background: #f8f9fa;\n}\n\n.plugin-panel {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: width 0.2s ease, height 0.2s ease;\n}\n\n.plugin-panel.collapsed {\n overflow: visible;\n}\n\n.plugin-panel-toggle {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.plugin-panel.collapsed .plugin-panel-toggle {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n flex-direction: column;\n height: 100%;\n padding: 8px 6px;\n}\n\n.plugin-panel-toggle:hover {\n background: #e9ecef;\n color: #495057;\n}\n\n.plugin-panel-toggle-icon {\n font-weight: bold;\n font-size: 14px;\n}\n\n.plugin-panel.collapsed .plugin-panel-toggle-icon {\n transform: rotate(90deg);\n}\n\n.plugin-panel-toggle-label {\n font-weight: 500;\n}\n\n.plugin-panel-content {\n flex: 1;\n overflow: auto;\n}\n\n/* Right panel rendered inside viewport - scrolls with content */\n.plugin-panel-in-viewport {\n position: absolute;\n top: 0;\n /* Position is set dynamically via inline styles based on page edge */\n width: 220px;\n pointer-events: auto;\n z-index: 10;\n overflow: visible;\n}\n\n.plugin-panel-in-viewport.collapsed {\n width: 32px;\n}\n\n.plugin-panel-in-viewport .plugin-panel-toggle {\n position: sticky;\n top: 0;\n background: rgba(255, 255, 255, 0.95);\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.plugin-panel-in-viewport-content {\n overflow: visible;\n position: relative;\n}\n\n/* Plugin overlay container for rendering highlights/decorations */\n.plugin-overlays-container {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n z-index: 5;\n}\n\n.plugin-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n\n.plugin-overlay > * {\n pointer-events: auto;\n}\n`;\n\n/**\n * PluginHost Component\n *\n * Wraps the editor and provides:\n * - Plugin state management\n * - Panel rendering for each plugin\n * - CSS injection for plugin styles\n * - Callbacks for editor interaction\n */\nexport const PluginHost = forwardRef<PluginHostRef, PluginHostProps>(function PluginHost(\n { plugins, children, className = '' },\n ref\n) {\n // Editor view reference\n const [editorView, setEditorView] = useState<EditorView | null>(null);\n\n // Store children.props in a ref to avoid infinite re-render loops\n // when the child editor has unstable callback references\n const childrenPropsRef = useRef(children.props);\n childrenPropsRef.current = children.props;\n\n // Rendered DOM context (received from PagedEditor)\n const [renderedDomContext, setRenderedDomContext] = useState<\n import('./types').RenderedDomContext | null\n >(null);\n\n // Plugin states (map of pluginId -> state)\n const pluginStatesRef = useRef<Map<string, unknown>>(new Map());\n // State version counter - incremented when plugin states change, used as dependency for overlays\n const [stateVersion, setStateVersion] = useState(0);\n const forceUpdate = useCallback(() => setStateVersion((v) => v + 1), []);\n\n // Panel collapsed states\n const [collapsedPanels, setCollapsedPanels] = useState<Set<string>>(() => {\n const collapsed = new Set<string>();\n for (const plugin of plugins) {\n const config = { ...DEFAULT_PANEL_CONFIG, ...plugin.panelConfig };\n if (config.defaultCollapsed) {\n collapsed.add(plugin.id);\n }\n }\n return collapsed;\n });\n\n // Panel sizes (for resizable panels)\n const [panelSizes] = useState<Map<string, number>>(() => {\n const sizes = new Map<string, number>();\n for (const plugin of plugins) {\n const config = { ...DEFAULT_PANEL_CONFIG, ...plugin.panelConfig };\n sizes.set(plugin.id, config.defaultSize);\n }\n return sizes;\n });\n\n // Initialize plugin states\n useEffect(() => {\n for (const plugin of plugins) {\n if (plugin.initialize && !pluginStatesRef.current.has(plugin.id)) {\n pluginStatesRef.current.set(plugin.id, plugin.initialize(editorView));\n }\n }\n forceUpdate();\n }, [plugins, editorView]);\n\n // Inject base PluginHost styles\n useEffect(() => {\n const cleanup = injectStyles('plugin-host-base', PLUGIN_HOST_STYLES);\n return cleanup;\n }, []);\n\n // Inject plugin styles\n useEffect(() => {\n const cleanupFns: (() => void)[] = [];\n\n for (const plugin of plugins) {\n if (plugin.styles) {\n cleanupFns.push(injectStyles(plugin.id, plugin.styles));\n }\n }\n\n return () => {\n for (const cleanup of cleanupFns) {\n cleanup();\n }\n };\n }, [plugins]);\n\n // Call plugin destroy on unmount\n useEffect(() => {\n return () => {\n for (const plugin of plugins) {\n if (plugin.destroy) {\n plugin.destroy();\n }\n }\n };\n }, [plugins]);\n\n // Update plugin states when editor state changes\n useEffect(() => {\n if (!editorView) return;\n\n // We need to hook into state changes - use DOM events\n // as a lightweight way to detect changes\n const updatePluginStates = () => {\n let anyChanged = false;\n for (const plugin of plugins) {\n if (plugin.onStateChange) {\n const newState = plugin.onStateChange(editorView);\n if (newState !== undefined) {\n pluginStatesRef.current.set(plugin.id, newState);\n anyChanged = true;\n }\n }\n }\n // Only trigger re-render if at least one plugin state actually changed\n if (anyChanged) {\n forceUpdate();\n }\n };\n\n // Initial state update\n updatePluginStates();\n\n // Listen for editor updates via DOM events\n const editorDom = editorView.dom;\n editorDom.addEventListener('input', updatePluginStates);\n editorDom.addEventListener('focus', updatePluginStates);\n editorDom.addEventListener('click', updatePluginStates);\n\n // Debounced update for transactions (hover/select from panels)\n let pendingUpdate: number | null = null;\n const debouncedUpdate = () => {\n if (pendingUpdate) cancelAnimationFrame(pendingUpdate);\n pendingUpdate = requestAnimationFrame(updatePluginStates);\n };\n\n // Wrap dispatch to catch hover/select transactions from panels\n const originalDispatch = editorView.dispatch.bind(editorView);\n editorView.dispatch = (tr) => {\n originalDispatch(tr);\n // Update on non-doc-changing transactions (hover/select) or after doc changes\n debouncedUpdate();\n };\n\n return () => {\n editorDom.removeEventListener('input', updatePluginStates);\n editorDom.removeEventListener('focus', updatePluginStates);\n editorDom.removeEventListener('click', updatePluginStates);\n if (pendingUpdate) cancelAnimationFrame(pendingUpdate);\n editorView.dispatch = originalDispatch;\n };\n }, [editorView, plugins]);\n\n // Callbacks for panel interaction\n const scrollToPosition = useCallback(\n (pos: number) => {\n if (!editorView) return;\n\n // Get the coordinates for the position\n const coords = editorView.coordsAtPos(pos);\n if (coords) {\n // Scroll the editor to show the position\n editorView.dom.scrollIntoView({ block: 'center', inline: 'nearest' });\n\n // Also set selection to the position\n const { state } = editorView;\n const resolved = state.doc.resolve(Math.min(pos, state.doc.content.size));\n const tr = state.tr.setSelection(TextSelection.near(resolved));\n editorView.dispatch(tr);\n editorView.focus();\n }\n },\n [editorView]\n );\n\n const selectRange = useCallback(\n (from: number, to: number) => {\n if (!editorView) return;\n\n const { state } = editorView;\n const maxPos = state.doc.content.size;\n const safeFrom = Math.max(0, Math.min(from, maxPos));\n const safeTo = Math.max(0, Math.min(to, maxPos));\n const tr = state.tr.setSelection(TextSelection.create(state.doc, safeFrom, safeTo));\n editorView.dispatch(tr);\n editorView.focus();\n },\n [editorView]\n );\n\n // Get plugin state helper\n const getPluginState = useCallback(<T,>(pluginId: string): T | undefined => {\n return pluginStatesRef.current.get(pluginId) as T | undefined;\n }, []);\n\n // Set plugin state helper\n const setPluginState = useCallback(<T,>(pluginId: string, state: T) => {\n pluginStatesRef.current.set(pluginId, state);\n forceUpdate();\n }, []);\n\n // Refresh all plugin states\n const refreshPluginStates = useCallback(() => {\n if (!editorView) return;\n\n for (const plugin of plugins) {\n if (plugin.onStateChange) {\n const newState = plugin.onStateChange(editorView);\n if (newState !== undefined) {\n pluginStatesRef.current.set(plugin.id, newState);\n }\n }\n }\n forceUpdate();\n }, [editorView, plugins]);\n\n // Expose ref methods\n useImperativeHandle(\n ref,\n () => ({\n getPluginState,\n setPluginState,\n getEditorView: () => editorView,\n refreshPluginStates,\n }),\n [getPluginState, setPluginState, editorView, refreshPluginStates]\n );\n\n // Collect all ProseMirror plugins from plugins\n const externalProseMirrorPlugins = useMemo(() => {\n const pmPlugins: ProseMirrorPlugin[] = [];\n for (const plugin of plugins) {\n if (plugin.proseMirrorPlugins) {\n pmPlugins.push(...plugin.proseMirrorPlugins);\n }\n }\n return pmPlugins;\n }, [plugins]);\n\n // Handle panel collapse toggle\n const togglePanelCollapsed = useCallback((pluginId: string) => {\n setCollapsedPanels((prev) => {\n const next = new Set(prev);\n if (next.has(pluginId)) {\n next.delete(pluginId);\n } else {\n next.add(pluginId);\n }\n return next;\n });\n }, []);\n\n // State for panel position (calculated from page bounds)\n const [panelLeftPosition, setPanelLeftPosition] = useState<number | null>(null);\n\n // Calculate panel position relative to page right edge\n useEffect(() => {\n if (!renderedDomContext) {\n setPanelLeftPosition(null);\n return;\n }\n\n const calculatePanelPosition = () => {\n const pagesContainer = renderedDomContext.pagesContainer;\n const firstPage = pagesContainer.querySelector('.layout-page') as HTMLElement;\n if (!firstPage) {\n setPanelLeftPosition(null);\n return;\n }\n\n // Get the container offset (position of pagesContainer in the overlay coordinate system)\n const containerOffset = renderedDomContext.getContainerOffset();\n\n // Get the first page's position and width relative to pagesContainer\n const pageRect = firstPage.getBoundingClientRect();\n const containerRect = pagesContainer.getBoundingClientRect();\n\n // Calculate the page's right edge relative to pagesContainer\n const pageRightInContainer = (pageRect.right - containerRect.left) / renderedDomContext.zoom;\n\n // Position the panel 20px to the right of the page edge, plus container offset\n const panelLeft = containerOffset.x + pageRightInContainer + 5;\n setPanelLeftPosition(panelLeft);\n };\n\n // Initial calculation\n calculatePanelPosition();\n\n // Recalculate on resize\n const handleResize = () => {\n requestAnimationFrame(calculatePanelPosition);\n };\n\n window.addEventListener('resize', handleResize);\n\n // Also observe the pagesContainer for size changes\n const observer = new ResizeObserver(() => {\n requestAnimationFrame(calculatePanelPosition);\n });\n observer.observe(renderedDomContext.pagesContainer);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n observer.disconnect();\n };\n }, [renderedDomContext]);\n\n // Generate overlay elements for plugins that have renderOverlay OR right panels\n // Right panels are rendered inside the viewport so they scroll with the content\n const pluginOverlays = useMemo(() => {\n const overlays: React.ReactNode[] = [];\n\n // Add renderOverlay content\n if (renderedDomContext) {\n for (const plugin of plugins) {\n if (plugin.renderOverlay) {\n const pluginState = pluginStatesRef.current.get(plugin.id);\n overlays.push(\n <div key={`overlay-${plugin.id}`} className=\"plugin-overlay\" data-plugin-id={plugin.id}>\n {plugin.renderOverlay(renderedDomContext, pluginState, editorView)}\n </div>\n );\n }\n }\n }\n\n // Add right panel content (rendered inside viewport to scroll with content)\n for (const plugin of plugins) {\n if (!plugin.Panel) continue;\n const position = plugin.panelConfig?.position ?? 'right';\n if (position !== 'right') continue;\n\n const config = { ...DEFAULT_PANEL_CONFIG, ...plugin.panelConfig };\n const isCollapsed = collapsedPanels.has(plugin.id);\n const size = panelSizes.get(plugin.id) ?? config.defaultSize;\n const Panel = plugin.Panel;\n const pluginState = pluginStatesRef.current.get(plugin.id);\n\n // Use calculated position, fall back to a default if not ready\n const leftStyle = panelLeftPosition !== null ? `${panelLeftPosition}px` : 'calc(50% + 428px)';\n\n overlays.push(\n <div\n key={`panel-overlay-${plugin.id}`}\n className={`plugin-panel-in-viewport ${isCollapsed ? 'collapsed' : ''}`}\n style={{ width: isCollapsed ? '32px' : `${size}px`, left: leftStyle }}\n data-plugin-id={plugin.id}\n >\n {config.collapsible && (\n <button\n className=\"plugin-panel-toggle\"\n onClick={() => togglePanelCollapsed(plugin.id)}\n title={isCollapsed ? `Show ${plugin.name}` : `Hide ${plugin.name}`}\n aria-label={isCollapsed ? `Show ${plugin.name}` : `Hide ${plugin.name}`}\n >\n <span className=\"plugin-panel-toggle-icon\">{isCollapsed ? '‹' : '›'}</span>\n </button>\n )}\n {!isCollapsed && renderedDomContext && (\n <div className=\"plugin-panel-in-viewport-content\">\n <Panel\n editorView={editorView}\n doc={editorView?.state.doc ?? null}\n scrollToPosition={scrollToPosition}\n selectRange={selectRange}\n pluginState={pluginState}\n panelWidth={size}\n renderedDomContext={renderedDomContext}\n />\n </div>\n )}\n </div>\n );\n }\n\n return overlays.length > 0 ? overlays : null;\n }, [\n renderedDomContext,\n plugins,\n stateVersion,\n editorView,\n collapsedPanels,\n panelSizes,\n scrollToPosition,\n selectRange,\n togglePanelCollapsed,\n panelLeftPosition,\n ]);\n\n // Callback to receive rendered DOM context from editor\n // Uses ref to avoid infinite loops when child has unstable callbacks\n const handleRenderedDomContextReady = useCallback(\n (context: import('./types').RenderedDomContext) => {\n setRenderedDomContext(context);\n // Call original callback if any - use ref to avoid dependency issues\n const originalCallback = (childrenPropsRef.current as Record<string, unknown>)\n ?.onRenderedDomContextReady;\n if (typeof originalCallback === 'function') {\n originalCallback(context);\n }\n },\n []\n // NOTE: children.props removed from dependencies - accessed via ref to prevent infinite loops\n );\n\n // Clone the child editor with additional props\n // Define the props we're injecting into the child editor\n type InjectedEditorProps = {\n externalPlugins?: ProseMirrorPlugin[];\n pluginOverlays?: React.ReactNode;\n onRenderedDomContextReady?: (context: import('./types').RenderedDomContext) => void;\n onEditorViewReady?: (view: EditorView) => void;\n };\n\n const editorElement = useMemo(() => {\n return cloneElement(children as React.ReactElement<InjectedEditorProps>, {\n externalPlugins: externalProseMirrorPlugins,\n pluginOverlays,\n onRenderedDomContextReady: handleRenderedDomContextReady,\n onEditorViewReady: (view: EditorView) => {\n setEditorView(view);\n // Call original callback if any - use ref to avoid dependency issues\n const originalCallback = (childrenPropsRef.current as Record<string, unknown>)\n ?.onEditorViewReady;\n if (typeof originalCallback === 'function') {\n originalCallback(view);\n }\n },\n });\n }, [children, externalProseMirrorPlugins, pluginOverlays, handleRenderedDomContextReady]);\n\n // Group plugins by panel position\n const pluginsByPosition = useMemo(() => {\n const left: EditorPlugin[] = [];\n const right: EditorPlugin[] = [];\n const bottom: EditorPlugin[] = [];\n\n for (const plugin of plugins) {\n if (!plugin.Panel) continue;\n const position = plugin.panelConfig?.position ?? 'right';\n if (position === 'left') left.push(plugin);\n else if (position === 'bottom') bottom.push(plugin);\n else right.push(plugin);\n }\n\n return { left, right, bottom };\n }, [plugins]);\n\n // Render a plugin panel\n const renderPanel = (plugin: EditorPlugin) => {\n if (!plugin.Panel) return null;\n\n const config = { ...DEFAULT_PANEL_CONFIG, ...plugin.panelConfig };\n const isCollapsed = collapsedPanels.has(plugin.id);\n const size = panelSizes.get(plugin.id) ?? config.defaultSize;\n\n const Panel = plugin.Panel;\n const pluginState = pluginStatesRef.current.get(plugin.id);\n\n return (\n <div\n key={plugin.id}\n className={`plugin-panel plugin-panel-${config.position} ${isCollapsed ? 'collapsed' : ''}`}\n style={{\n [config.position === 'bottom' ? 'height' : 'width']: isCollapsed ? '32px' : `${size}px`,\n minWidth:\n config.position !== 'bottom'\n ? isCollapsed\n ? '32px'\n : `${config.minSize}px`\n : undefined,\n maxWidth: config.position !== 'bottom' ? `${config.maxSize}px` : undefined,\n minHeight:\n config.position === 'bottom'\n ? isCollapsed\n ? '32px'\n : `${config.minSize}px`\n : undefined,\n maxHeight: config.position === 'bottom' ? `${config.maxSize}px` : undefined,\n }}\n data-plugin-id={plugin.id}\n >\n {config.collapsible && (\n <button\n className=\"plugin-panel-toggle\"\n onClick={() => togglePanelCollapsed(plugin.id)}\n title={isCollapsed ? `Show ${plugin.name}` : `Hide ${plugin.name}`}\n aria-label={isCollapsed ? `Show ${plugin.name}` : `Hide ${plugin.name}`}\n >\n <span className=\"plugin-panel-toggle-icon\">{isCollapsed ? '›' : '‹'}</span>\n {isCollapsed && <span className=\"plugin-panel-toggle-label\">{plugin.name}</span>}\n </button>\n )}\n {!isCollapsed && (\n <div className=\"plugin-panel-content\">\n <Panel\n editorView={editorView}\n doc={editorView?.state.doc ?? null}\n scrollToPosition={scrollToPosition}\n selectRange={selectRange}\n pluginState={pluginState}\n panelWidth={size}\n renderedDomContext={renderedDomContext ?? null}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`plugin-host ${className}`}>\n {/* Left panels */}\n {pluginsByPosition.left.length > 0 && (\n <div className=\"plugin-panels-left\">{pluginsByPosition.left.map(renderPanel)}</div>\n )}\n\n {/* Main editor area */}\n <div className=\"plugin-host-editor\">\n {editorElement}\n\n {/* Bottom panels */}\n {pluginsByPosition.bottom.length > 0 && (\n <div className=\"plugin-panels-bottom\">{pluginsByPosition.bottom.map(renderPanel)}</div>\n )}\n </div>\n\n {/* Right panels are now rendered inside pluginOverlays to scroll with content */}\n </div>\n );\n});\n\n// Export the styles constant for external use\nexport { PLUGIN_HOST_STYLES };\n\nexport default PluginHost;\n"]}
|