@eigenpal/docx-js-editor 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
- package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
- package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
- package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
- package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
- package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
- package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
- package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
- package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
- package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
- package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
- package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
- package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
- package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
- package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
- package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
- package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
- package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
- package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
- package/dist/chunk-2Y6FLZ5Q.js +3 -0
- package/dist/chunk-32HMU2UV.js +111 -0
- package/dist/chunk-4CUGBNL2.cjs +1 -0
- package/dist/chunk-5GFXHUMP.js +1 -0
- package/dist/chunk-6NDMKJIE.js +9 -0
- package/dist/chunk-6NYA53QC.cjs +258 -0
- package/dist/chunk-7KJ3YVDQ.js +10 -0
- package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
- package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
- package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
- package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
- package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
- package/dist/chunk-EH3NY2DQ.cjs +26 -0
- package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
- package/dist/chunk-FXJAIFPR.js +59 -0
- package/dist/chunk-GICVJSFJ.cjs +9 -0
- package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
- package/dist/chunk-HT2Z33YM.cjs +111 -0
- package/dist/chunk-JRRTZZ72.cjs +1 -0
- package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
- package/dist/chunk-P3AEZKQO.cjs +3 -0
- package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
- package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
- package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
- package/dist/chunk-Q7YYC75E.js +258 -0
- package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
- package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
- package/dist/chunk-USRMBYI6.js +3 -0
- package/dist/chunk-UTWPV2I4.js +26 -0
- package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
- package/dist/chunk-XQNCLN4T.cjs +3 -0
- package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
- package/dist/chunk-Y6QBJGMO.cjs +59 -0
- package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
- package/dist/chunk-ZTVQA46Q.js +1 -0
- package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
- package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
- package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
- package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
- package/dist/core-plugins-reexport.cjs +1 -2
- package/dist/core-plugins-reexport.d.cts +4 -4
- package/dist/core-plugins-reexport.d.ts +4 -4
- package/dist/core-plugins-reexport.js +1 -2
- package/dist/core-reexport.cjs +1 -2
- package/dist/core-reexport.d.cts +10 -10
- package/dist/core-reexport.d.ts +10 -10
- package/dist/core-reexport.js +1 -2
- package/dist/executor-JGWZ7S6Z.cjs +1 -0
- package/dist/executor-L2MVKMXO.js +1 -0
- package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
- package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
- package/dist/headless-reexport.cjs +4 -5
- package/dist/headless-reexport.d.cts +7 -7
- package/dist/headless-reexport.d.ts +7 -7
- package/dist/headless-reexport.js +4 -5
- package/dist/index.cjs +6 -7
- package/dist/index.css +0 -1
- package/dist/index.d.cts +12 -12
- package/dist/index.d.ts +12 -12
- package/dist/index.js +6 -7
- package/dist/lib-GD2QD2JK.js +1 -0
- package/dist/lib-HOLGQI5K.cjs +1 -0
- package/dist/mcp-reexport.cjs +9 -10
- package/dist/mcp-reexport.d.cts +2 -2
- package/dist/mcp-reexport.d.ts +2 -2
- package/dist/mcp-reexport.js +4 -5
- package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
- package/dist/processTemplate-BXZKWRQD.cjs +1 -0
- package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
- package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
- package/dist/react.cjs +1 -2
- package/dist/react.css +0 -1
- package/dist/react.d.cts +5 -5
- package/dist/react.d.ts +5 -5
- package/dist/react.js +1 -2
- package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
- package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
- package/dist/selectionRects-7QU337P5.cjs +1 -0
- package/dist/selectionRects-V5RC2BYX.js +1 -0
- package/dist/styles.css +1 -1
- package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
- package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
- package/dist/ui.cjs +1 -2
- package/dist/ui.d.cts +32 -85
- package/dist/ui.d.ts +32 -85
- package/dist/ui.js +1 -2
- package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
- package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
- package/package.json +2 -1
- package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
- package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
- package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
- package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
- package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
- package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
- package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
- package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
- package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
- package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
- package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
- package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
- package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
- package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
- package/dist/chunk-2CHPKB5A.cjs +0 -112
- package/dist/chunk-2CHPKB5A.cjs.map +0 -1
- package/dist/chunk-2QOEHCBX.js.map +0 -1
- package/dist/chunk-4QT5LPBA.cjs.map +0 -1
- package/dist/chunk-5DYSI4O4.cjs +0 -60
- package/dist/chunk-5DYSI4O4.cjs.map +0 -1
- package/dist/chunk-5FJXHXFV.cjs +0 -2
- package/dist/chunk-5FJXHXFV.cjs.map +0 -1
- package/dist/chunk-6FEWNF6B.js +0 -4
- package/dist/chunk-6FEWNF6B.js.map +0 -1
- package/dist/chunk-6LF5HZCV.js +0 -10
- package/dist/chunk-6LF5HZCV.js.map +0 -1
- package/dist/chunk-7JSPKVOW.js.map +0 -1
- package/dist/chunk-C33XDRDJ.cjs +0 -28
- package/dist/chunk-C33XDRDJ.cjs.map +0 -1
- package/dist/chunk-CV5WFE7K.js.map +0 -1
- package/dist/chunk-CXJRNISO.js +0 -2
- package/dist/chunk-CXJRNISO.js.map +0 -1
- package/dist/chunk-DJAEBZ33.cjs.map +0 -1
- package/dist/chunk-DP6Q75ZD.js +0 -28
- package/dist/chunk-DP6Q75ZD.js.map +0 -1
- package/dist/chunk-FDANI5P4.cjs.map +0 -1
- package/dist/chunk-FGVGZLBL.js.map +0 -1
- package/dist/chunk-GJ4GKSDU.cjs +0 -2
- package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
- package/dist/chunk-GWBTKVFD.cjs.map +0 -1
- package/dist/chunk-JOYPFQW2.js.map +0 -1
- package/dist/chunk-L54YNLSE.js +0 -2
- package/dist/chunk-L54YNLSE.js.map +0 -1
- package/dist/chunk-LPGMLJMO.js +0 -259
- package/dist/chunk-LPGMLJMO.js.map +0 -1
- package/dist/chunk-M2T6XKT5.js.map +0 -1
- package/dist/chunk-OHG7ROFC.js +0 -11
- package/dist/chunk-OHG7ROFC.js.map +0 -1
- package/dist/chunk-PANKMCFX.cjs +0 -4
- package/dist/chunk-PANKMCFX.cjs.map +0 -1
- package/dist/chunk-Q6HUGWO6.js.map +0 -1
- package/dist/chunk-QDV75OJ4.js +0 -112
- package/dist/chunk-QDV75OJ4.js.map +0 -1
- package/dist/chunk-QEBO3EQP.cjs.map +0 -1
- package/dist/chunk-QVIZ775M.cjs +0 -259
- package/dist/chunk-QVIZ775M.cjs.map +0 -1
- package/dist/chunk-RMUMR42R.cjs +0 -10
- package/dist/chunk-RMUMR42R.cjs.map +0 -1
- package/dist/chunk-S26DZVRQ.cjs.map +0 -1
- package/dist/chunk-T2HQYRA7.cjs.map +0 -1
- package/dist/chunk-ULXNEG66.js +0 -60
- package/dist/chunk-ULXNEG66.js.map +0 -1
- package/dist/chunk-WD2HTKRR.cjs.map +0 -1
- package/dist/chunk-XZNOV52K.cjs.map +0 -1
- package/dist/chunk-Y6VCTLCJ.js.map +0 -1
- package/dist/core-plugins-reexport.cjs.map +0 -1
- package/dist/core-plugins-reexport.js.map +0 -1
- package/dist/core-reexport.cjs.map +0 -1
- package/dist/core-reexport.js.map +0 -1
- package/dist/executor-K5RXUTTR.js +0 -2
- package/dist/executor-K5RXUTTR.js.map +0 -1
- package/dist/executor-XIPIU3H4.cjs +0 -2
- package/dist/executor-XIPIU3H4.cjs.map +0 -1
- package/dist/headless-reexport.cjs.map +0 -1
- package/dist/headless-reexport.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mcp-reexport.cjs.map +0 -1
- package/dist/mcp-reexport.js.map +0 -1
- package/dist/processTemplate-G37IM66O.js.map +0 -1
- package/dist/processTemplate-RFBGVH7T.cjs +0 -2
- package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.css.map +0 -1
- package/dist/react.js.map +0 -1
- package/dist/selectionRects-6DU7HN7E.js +0 -2
- package/dist/selectionRects-6DU7HN7E.js.map +0 -1
- package/dist/selectionRects-YZSC24ZP.cjs +0 -2
- package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
- package/dist/ui.cjs.map +0 -1
- package/dist/ui.js.map +0 -1
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/utils/textSelection.ts","../../core/src/utils/keyboardNavigation.ts","../src/plugins/template/prosemirror-plugin.ts","../src/plugins/template/components/AnnotationPanel.tsx","../src/plugins/template/components/TemplateHighlightOverlay.tsx","../src/plugins/template/index.ts","../src/index.ts"],"names":["WORD_CHAR_REGEX","WHITESPACE_REGEX","isWordCharacter","char","isWhitespace","findWordBoundaries","text","position","charAtPosition","start","end","getWordAt","findWordAt","selectWordAtCursor","selection","range","container","wordStart","wordEnd","element","textNodes","getTextNodesIn","offset","targetNode","targetOffset","child","childTextNodes","newRange","selectWordInTextNode","textNode","expandSelectionToWordBoundaries","startContainer","endContainer","newStartOffset","newEndOffset","e","selectParagraphAtCursor","paragraphElement","findParagraphElement","node","current","walker","clickCount","clickTimer","lastClickTarget","MULTI_CLICK_TIMEOUT","resetClickCount","handleClickForMultiClick","event","createDoubleClickWordSelector","createTripleClickParagraphSelector","isPunctuation","findWordStart","pos","findWordEnd","findNextWordStart","findPreviousWordStart","findVisualLineStart","currentTop","mid","rect","findVisualLineEnd","textLength","getSelectionInfo","setSelectionPosition","maxOffset","extendSelectionTo","moveByWord","direction","extend","focusNode","currentOffset","newOffset","moveToLineEdge","edge","result","parseNavigationAction","key","ctrlKey","metaKey","shiftKey","_altKey","isModifier","handleNavigationKey","options","action","isNavigationKey","expandSelectionToWord","getWordAtCursor","matchesShortcut","shortcut","eventModifier","shortcutModifier","NAVIGATION_SHORTCUTS","describeShortcut","parts","isMac","keyName","getNavigationShortcutDescriptions","TAG_REGEX","templatePluginKey","PluginKey","stableId","type","name","occurrence","findTags","doc","combined","posMap","i","tags","sectionStack","occurrences","match","rawTag","prefix","from","to","occ","tag","getColor","createDecorations","hoveredId","selectedId","decorations","isHovered","isSelected","color","classes","Decoration","DecorationSet","tagsStructureEqual","a","b","createTemplatePlugin","Plugin","_","state","tr","value","_oldState","newState","newTags","structureSame","meta","newHovered","newSelected","view","clicked","t","id","getTemplateTags","setHoveredElement","setSelectedElement","TEMPLATE_DECORATION_STYLES","COLORS","getLabel","AnnotationPanel","editorView","pluginState","renderedDomContext","layoutVersion","setLayoutVersion","useState","containerRef","useRef","chipRefs","lastPositionsRef","visibleTags","useMemo","computePositions","useCallback","newPositions","containerOffset","lastPosMap","rects","top","lastTop","minGap","prev","curr","prevChipEl","prevHeight","positions","useEffect","observer","v","handleResize","lastMeasuredTagsKey","tagsKey","timer","handleHover","handleClick","TextSelection","jsx","label","isSection","jsxs","el","ANNOTATION_PANEL_STYLES","HIGHLIGHT_COLORS","HOVER_COLORS","TemplateHighlightOverlay","context","onHover","onSelect","computeHighlights","tagRects","highlights","index","TEMPLATE_HIGHLIGHT_OVERLAY_STYLES","MemoizedAnnotationPanel","React","next","prevState","nextState","prevTags","nextTags","createPlugin","_view","templatePlugin","VERSION"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Text Selection Utilities\n *\n * Utilities for word-level and paragraph-level text selection.\n * Used for double-click (word) and triple-click (paragraph) selection.\n */\n\n// ============================================================================\n// WORD BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Regular expression for word characters.\n * Includes letters, numbers, and common word-internal punctuation (apostrophes, hyphens).\n */\nconst WORD_CHAR_REGEX = /[\\p{L}\\p{N}''\\-]/u;\n\n/**\n * Regular expression for whitespace characters\n */\nconst WHITESPACE_REGEX = /\\s/;\n\n/**\n * Check if a character is a word character\n */\nexport function isWordCharacter(char: string): boolean {\n if (!char || char.length === 0) return false;\n return WORD_CHAR_REGEX.test(char);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(char: string): boolean {\n if (!char || char.length === 0) return false;\n return WHITESPACE_REGEX.test(char);\n}\n\n/**\n * Find word boundaries around a position in text\n * Returns [startIndex, endIndex] inclusive start, exclusive end\n */\nexport function findWordBoundaries(text: string, position: number): [number, number] {\n if (!text || text.length === 0) {\n return [0, 0];\n }\n\n // Clamp position to valid range\n position = Math.max(0, Math.min(position, text.length - 1));\n\n const charAtPosition = text[position];\n\n // If on whitespace, select the whitespace run\n if (isWhitespace(charAtPosition)) {\n let start = position;\n let end = position;\n\n // Expand backwards through whitespace\n while (start > 0 && isWhitespace(text[start - 1])) {\n start--;\n }\n\n // Expand forwards through whitespace\n while (end < text.length && isWhitespace(text[end])) {\n end++;\n }\n\n return [start, end];\n }\n\n // If on a word character, find the word\n if (isWordCharacter(charAtPosition)) {\n let start = position;\n let end = position;\n\n // Expand backwards through word characters\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n // Expand forwards through word characters\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n return [start, end];\n }\n\n // On punctuation or other non-word character, just select that character\n return [position, position + 1];\n}\n\n/**\n * Get the word at a position in text\n */\nexport function getWordAt(text: string, position: number): string {\n const [start, end] = findWordBoundaries(text, position);\n return text.slice(start, end);\n}\n\n/**\n * Word selection result\n */\nexport interface WordSelectionResult {\n /** The selected word */\n word: string;\n /** Start index in the text (inclusive) */\n startIndex: number;\n /** End index in the text (exclusive) */\n endIndex: number;\n}\n\n/**\n * Find the word at a position and return detailed info\n */\nexport function findWordAt(text: string, position: number): WordSelectionResult {\n const [start, end] = findWordBoundaries(text, position);\n return {\n word: text.slice(start, end),\n startIndex: start,\n endIndex: end,\n };\n}\n\n// ============================================================================\n// DOM-BASED SELECTION\n// ============================================================================\n\n/**\n * Select a word at the current cursor position using the browser's native APIs.\n * This works reliably across different browsers and handles contentEditable well.\n */\nexport function selectWordAtCursor(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n // Get the current range (cursor position)\n const range = selection.getRangeAt(0);\n\n // The container node where the selection is\n const container = range.startContainer;\n\n // If we're in a text node, we can select the word\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || '';\n const position = range.startOffset;\n\n // Find word boundaries\n const [wordStart, wordEnd] = findWordBoundaries(text, position);\n\n // If we found a word, select it\n if (wordEnd > wordStart) {\n range.setStart(container, wordStart);\n range.setEnd(container, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n }\n\n // For element nodes or other cases, try to find the text node\n if (container.nodeType === Node.ELEMENT_NODE) {\n // Try to get the text content and find the text node\n const element = container as Element;\n const textNodes = getTextNodesIn(element);\n\n if (textNodes.length > 0) {\n // Find which text node we're near\n const offset = range.startOffset;\n let targetNode: Text | null = null;\n let targetOffset = offset;\n\n // If offset is a child index, get that child's text node\n if (offset < element.childNodes.length) {\n const child = element.childNodes[offset];\n if (child.nodeType === Node.TEXT_NODE) {\n targetNode = child as Text;\n targetOffset = 0;\n } else if (child instanceof Element) {\n const childTextNodes = getTextNodesIn(child);\n if (childTextNodes.length > 0) {\n targetNode = childTextNodes[0];\n targetOffset = 0;\n }\n }\n }\n\n // Fallback to first text node\n if (!targetNode && textNodes.length > 0) {\n targetNode = textNodes[0];\n targetOffset = 0;\n }\n\n if (targetNode) {\n const text = targetNode.textContent || '';\n const [wordStart, wordEnd] = findWordBoundaries(text, targetOffset);\n\n if (wordEnd > wordStart) {\n const newRange = document.createRange();\n newRange.setStart(targetNode, wordStart);\n newRange.setEnd(targetNode, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Select a word in a specific text node at the given offset\n */\nexport function selectWordInTextNode(textNode: Text, offset: number): boolean {\n const selection = window.getSelection();\n if (!selection) return false;\n\n const text = textNode.textContent || '';\n const [wordStart, wordEnd] = findWordBoundaries(text, offset);\n\n if (wordEnd > wordStart) {\n const range = document.createRange();\n range.setStart(textNode, wordStart);\n range.setEnd(textNode, wordEnd);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n\n return false;\n}\n\n/**\n * Expand the current selection to word boundaries.\n * If there's a collapsed selection (cursor), selects the word at cursor.\n * If there's an existing selection, expands to include complete words.\n */\nexport function expandSelectionToWordBoundaries(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n\n // If collapsed, use selectWordAtCursor\n if (range.collapsed) {\n return selectWordAtCursor();\n }\n\n // For non-collapsed selections, expand both ends to word boundaries\n const startContainer = range.startContainer;\n const endContainer = range.endContainer;\n\n let newStartOffset = range.startOffset;\n let newEndOffset = range.endOffset;\n\n // Expand start to word boundary\n if (startContainer.nodeType === Node.TEXT_NODE) {\n const text = startContainer.textContent || '';\n const [wordStart] = findWordBoundaries(text, range.startOffset);\n newStartOffset = wordStart;\n }\n\n // Expand end to word boundary\n if (endContainer.nodeType === Node.TEXT_NODE) {\n const text = endContainer.textContent || '';\n const position = Math.max(0, range.endOffset - 1);\n const [, wordEnd] = findWordBoundaries(text, position);\n newEndOffset = wordEnd;\n }\n\n // Apply the expanded selection\n try {\n range.setStart(startContainer, newStartOffset);\n range.setEnd(endContainer, newEndOffset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n } catch (e) {\n // Selection manipulation can throw in some edge cases\n console.warn('Could not expand selection to word boundaries:', e);\n return false;\n }\n}\n\n// ============================================================================\n// PARAGRAPH SELECTION\n// ============================================================================\n\n/**\n * Select the entire paragraph containing the current selection.\n * Looks for the nearest element with [data-paragraph-index] attribute.\n */\nexport function selectParagraphAtCursor(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n\n // Find the paragraph element\n const paragraphElement = findParagraphElement(container);\n\n if (paragraphElement) {\n const newRange = document.createRange();\n newRange.selectNodeContents(paragraphElement);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n return true;\n }\n\n return false;\n}\n\n/**\n * Find the paragraph element containing a node.\n * Looks for elements with [data-paragraph-index] attribute.\n */\nfunction findParagraphElement(node: Node | null): Element | null {\n if (!node) return null;\n\n let current: Node | null = node;\n while (current) {\n if (current instanceof Element) {\n if (current.hasAttribute('data-paragraph-index')) {\n return current;\n }\n }\n current = current.parentNode;\n }\n\n return null;\n}\n\n/**\n * Get all text nodes within an element\n */\nfunction getTextNodesIn(element: Element): Text[] {\n const textNodes: Text[] = [];\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null);\n\n let node: Node | null;\n while ((node = walker.nextNode())) {\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.push(node as Text);\n }\n }\n\n return textNodes;\n}\n\n// ============================================================================\n// DOUBLE/TRIPLE CLICK HANDLERS\n// ============================================================================\n\n/**\n * Track click count for double/triple click detection\n */\nlet clickCount = 0;\nlet clickTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastClickTarget: EventTarget | null = null;\n\nconst MULTI_CLICK_TIMEOUT = 500; // ms\n\n/**\n * Reset click count\n */\nfunction resetClickCount(): void {\n clickCount = 0;\n lastClickTarget = null;\n if (clickTimer) {\n clearTimeout(clickTimer);\n clickTimer = null;\n }\n}\n\n/**\n * Handle click event for multi-click detection.\n * Call this in your click handler.\n * Returns the click count (1 = single, 2 = double, 3 = triple).\n */\nexport function handleClickForMultiClick(event: MouseEvent): number {\n // Reset if clicking different target\n if (event.target !== lastClickTarget) {\n resetClickCount();\n }\n\n clickCount++;\n lastClickTarget = event.target;\n\n // Reset timer\n if (clickTimer) {\n clearTimeout(clickTimer);\n }\n\n clickTimer = setTimeout(resetClickCount, MULTI_CLICK_TIMEOUT);\n\n // Cap at 3 clicks\n return Math.min(clickCount, 3);\n}\n\n/**\n * Create a double-click handler that selects words.\n * Returns a function that should be called on dblclick events.\n */\nexport function createDoubleClickWordSelector(): (event: MouseEvent) => void {\n return (event: MouseEvent) => {\n // Prevent default double-click behavior (which might be too aggressive)\n // We'll implement our own word selection\n\n // Don't interfere if user is holding modifiers\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // Select the word at the click position\n selectWordAtCursor();\n };\n}\n\n/**\n * Create a triple-click handler that selects paragraphs.\n * This uses our custom click counting since browsers have inconsistent triple-click.\n */\nexport function createTripleClickParagraphSelector(): (event: MouseEvent) => void {\n return (event: MouseEvent) => {\n const clickNum = handleClickForMultiClick(event);\n\n if (clickNum === 3) {\n // Don't interfere with modifier keys\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // Select the paragraph\n selectParagraphAtCursor();\n }\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n isWordCharacter,\n isWhitespace,\n findWordBoundaries,\n getWordAt,\n findWordAt,\n selectWordAtCursor,\n selectWordInTextNode,\n expandSelectionToWordBoundaries,\n selectParagraphAtCursor,\n handleClickForMultiClick,\n createDoubleClickWordSelector,\n createTripleClickParagraphSelector,\n};\n","/**\n * Keyboard Navigation Utilities\n *\n * Provides enhanced keyboard navigation for the editor:\n * - Ctrl+Left/Right: Move by word\n * - Home/End: Move to start/end of line\n * - Ctrl+Home/End: Move to start/end of document\n * - Ctrl+Shift+Left/Right: Select by word\n * - Shift+Home/End: Select to start/end of line\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Navigation direction\n */\nexport type NavigationDirection = 'left' | 'right' | 'up' | 'down';\n\n/**\n * Navigation unit\n */\nexport type NavigationUnit = 'character' | 'word' | 'line' | 'paragraph' | 'document';\n\n/**\n * Keyboard navigation action\n */\nexport interface NavigationAction {\n /** Direction to navigate */\n direction: NavigationDirection;\n /** Unit of movement */\n unit: NavigationUnit;\n /** Whether to extend selection */\n extend: boolean;\n}\n\n/**\n * Keyboard shortcut definition\n */\nexport interface KeyboardShortcut {\n key: string;\n ctrlKey?: boolean;\n metaKey?: boolean;\n shiftKey?: boolean;\n altKey?: boolean;\n}\n\n// ============================================================================\n// WORD BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Check if a character is a word character (letter, digit, or underscore)\n */\nexport function isWordCharacter(char: string): boolean {\n if (!char) return false;\n // Word characters: letters (including unicode), digits, underscore\n return /[\\p{L}\\p{N}_]/u.test(char);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(char: string): boolean {\n if (!char) return false;\n return /\\s/.test(char);\n}\n\n/**\n * Check if a character is a punctuation character\n */\nexport function isPunctuation(char: string): boolean {\n if (!char) return false;\n return /[\\p{P}]/u.test(char);\n}\n\n/**\n * Find the start of the current or previous word\n */\nexport function findWordStart(text: string, position: number): number {\n if (position <= 0) return 0;\n if (position > text.length) position = text.length;\n\n let pos = position;\n\n // If we're in the middle of whitespace, skip to the end of whitespace\n while (pos > 0 && isWhitespace(text[pos - 1])) {\n pos--;\n }\n\n // If we hit the start while skipping whitespace, return 0\n if (pos === 0) return 0;\n\n // Now find the start of the word\n while (pos > 0 && isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n return pos;\n}\n\n/**\n * Find the end of the current or next word\n */\nexport function findWordEnd(text: string, position: number): number {\n if (position >= text.length) return text.length;\n if (position < 0) position = 0;\n\n let pos = position;\n\n // If we're at a word character, find the end of this word\n while (pos < text.length && isWordCharacter(text[pos])) {\n pos++;\n }\n\n // Skip whitespace to reach the start of next word\n while (pos < text.length && isWhitespace(text[pos])) {\n pos++;\n }\n\n return pos;\n}\n\n/**\n * Find the next word start (for Ctrl+Right navigation)\n */\nexport function findNextWordStart(text: string, position: number): number {\n if (position >= text.length) return text.length;\n\n let pos = position;\n\n // If we're on a word character, move to end of current word\n while (pos < text.length && isWordCharacter(text[pos])) {\n pos++;\n }\n\n // Skip whitespace and punctuation to reach next word\n while (pos < text.length && !isWordCharacter(text[pos])) {\n pos++;\n }\n\n return pos;\n}\n\n/**\n * Find the previous word start (for Ctrl+Left navigation)\n */\nexport function findPreviousWordStart(text: string, position: number): number {\n if (position <= 0) return 0;\n\n let pos = position;\n\n // Skip whitespace and punctuation going backwards\n while (pos > 0 && !isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n // Move to start of word\n while (pos > 0 && isWordCharacter(text[pos - 1])) {\n pos--;\n }\n\n return pos;\n}\n\n// ============================================================================\n// LINE BOUNDARY DETECTION\n// ============================================================================\n\n/**\n * Find the start of the current line in a text node\n * Uses visual line detection based on bounding rectangles\n */\nexport function findVisualLineStart(\n container: Node,\n offset: number\n): { node: Node; offset: number } | null {\n const selection = window.getSelection();\n if (!selection) return null;\n\n // Get the current caret position's bounding rect\n const range = document.createRange();\n\n if (container.nodeType === Node.TEXT_NODE) {\n // Handle text node\n range.setStart(container, Math.min(offset, container.textContent?.length || 0));\n range.collapse(true);\n\n const currentRect = range.getBoundingClientRect();\n const currentTop = currentRect.top;\n\n // Binary search to find line start\n let start = 0;\n let end = offset;\n\n while (start < end) {\n const mid = Math.floor((start + end) / 2);\n range.setStart(container, mid);\n range.collapse(true);\n const rect = range.getBoundingClientRect();\n\n if (Math.abs(rect.top - currentTop) < 2) {\n // Same line, search left\n end = mid;\n } else {\n // Different line, search right\n start = mid + 1;\n }\n }\n\n return { node: container, offset: start };\n }\n\n return null;\n}\n\n/**\n * Find the end of the current line in a text node\n * Uses visual line detection based on bounding rectangles\n */\nexport function findVisualLineEnd(\n container: Node,\n offset: number\n): { node: Node; offset: number } | null {\n const selection = window.getSelection();\n if (!selection) return null;\n\n const textLength = container.textContent?.length || 0;\n\n // Get the current caret position's bounding rect\n const range = document.createRange();\n\n if (container.nodeType === Node.TEXT_NODE) {\n range.setStart(container, Math.min(offset, textLength));\n range.collapse(true);\n\n const currentRect = range.getBoundingClientRect();\n const currentTop = currentRect.top;\n\n // Binary search to find line end\n let start = offset;\n let end = textLength;\n\n while (start < end) {\n const mid = Math.ceil((start + end) / 2);\n range.setStart(container, mid);\n range.collapse(true);\n const rect = range.getBoundingClientRect();\n\n if (Math.abs(rect.top - currentTop) < 2) {\n // Same line, search right\n start = mid;\n } else {\n // Different line, search left\n end = mid - 1;\n }\n }\n\n return { node: container, offset: start };\n }\n\n return null;\n}\n\n// ============================================================================\n// DOM SELECTION UTILITIES\n// ============================================================================\n\n/**\n * Get the current selection info\n */\nexport function getSelectionInfo(): {\n node: Node;\n offset: number;\n anchorNode: Node | null;\n anchorOffset: number;\n focusNode: Node | null;\n focusOffset: number;\n isCollapsed: boolean;\n text: string;\n} | null {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n\n return {\n node: range.startContainer,\n offset: range.startOffset,\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset,\n isCollapsed: selection.isCollapsed,\n text: selection.toString(),\n };\n}\n\n/**\n * Set the selection to a specific position\n */\nexport function setSelectionPosition(node: Node, offset: number): void {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n const maxOffset =\n node.nodeType === Node.TEXT_NODE ? node.textContent?.length || 0 : node.childNodes.length;\n\n range.setStart(node, Math.min(offset, maxOffset));\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Extend selection to a specific position\n */\nexport function extendSelectionTo(node: Node, offset: number): void {\n const selection = window.getSelection();\n if (!selection || !selection.anchorNode) return;\n\n try {\n selection.extend(node, Math.min(offset, node.textContent?.length || 0));\n } catch {\n // If extend fails (e.g., different containers), fall back to setBaseAndExtent\n const maxOffset =\n node.nodeType === Node.TEXT_NODE ? node.textContent?.length || 0 : node.childNodes.length;\n\n selection.setBaseAndExtent(\n selection.anchorNode,\n selection.anchorOffset,\n node,\n Math.min(offset, maxOffset)\n );\n }\n}\n\n/**\n * Move selection by word in a text node\n */\nexport function moveByWord(direction: 'left' | 'right', extend: boolean = false): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return false;\n\n const text = focusNode.textContent || '';\n const currentOffset = selection.focusOffset;\n\n let newOffset: number;\n if (direction === 'left') {\n newOffset = findPreviousWordStart(text, currentOffset);\n } else {\n newOffset = findNextWordStart(text, currentOffset);\n }\n\n if (extend) {\n extendSelectionTo(focusNode, newOffset);\n } else {\n setSelectionPosition(focusNode, newOffset);\n }\n\n return true;\n}\n\n/**\n * Move to start/end of line\n */\nexport function moveToLineEdge(edge: 'start' | 'end', extend: boolean = false): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode) return false;\n\n // For text nodes, find visual line boundaries\n if (focusNode.nodeType === Node.TEXT_NODE) {\n const result =\n edge === 'start'\n ? findVisualLineStart(focusNode, selection.focusOffset)\n : findVisualLineEnd(focusNode, selection.focusOffset);\n\n if (result) {\n if (extend) {\n extendSelectionTo(result.node, result.offset);\n } else {\n setSelectionPosition(result.node, result.offset);\n }\n return true;\n }\n }\n\n // Fallback: move to start/end of the focus node's text content\n const text = focusNode.textContent || '';\n const newOffset = edge === 'start' ? 0 : text.length;\n\n if (extend) {\n extendSelectionTo(focusNode, newOffset);\n } else {\n setSelectionPosition(focusNode, newOffset);\n }\n\n return true;\n}\n\n// ============================================================================\n// KEYBOARD EVENT HANDLING\n// ============================================================================\n\n/**\n * Parse a keyboard event into a navigation action\n */\nexport function parseNavigationAction(event: KeyboardEvent): NavigationAction | null {\n const { key, ctrlKey, metaKey, shiftKey, altKey: _altKey } = event;\n\n // Use Ctrl on Windows/Linux, Meta (Cmd) on Mac\n const isModifier = ctrlKey || metaKey;\n\n switch (key) {\n case 'ArrowLeft':\n if (isModifier) {\n return {\n direction: 'left',\n unit: 'word',\n extend: shiftKey,\n };\n }\n break;\n\n case 'ArrowRight':\n if (isModifier) {\n return {\n direction: 'right',\n unit: 'word',\n extend: shiftKey,\n };\n }\n break;\n\n case 'Home':\n if (isModifier) {\n return {\n direction: 'left',\n unit: 'document',\n extend: shiftKey,\n };\n }\n return {\n direction: 'left',\n unit: 'line',\n extend: shiftKey,\n };\n\n case 'End':\n if (isModifier) {\n return {\n direction: 'right',\n unit: 'document',\n extend: shiftKey,\n };\n }\n return {\n direction: 'right',\n unit: 'line',\n extend: shiftKey,\n };\n }\n\n return null;\n}\n\n/**\n * Handle a keyboard navigation event\n * Returns true if the event was handled\n */\nexport function handleNavigationKey(\n event: KeyboardEvent,\n options?: {\n onDocumentStart?: () => void;\n onDocumentEnd?: () => void;\n }\n): boolean {\n const action = parseNavigationAction(event);\n if (!action) return false;\n\n switch (action.unit) {\n case 'word':\n // moveByWord only supports horizontal directions\n if (\n (action.direction === 'left' || action.direction === 'right') &&\n moveByWord(action.direction, action.extend)\n ) {\n event.preventDefault();\n return true;\n }\n break;\n\n case 'line':\n const edge = action.direction === 'left' ? 'start' : 'end';\n if (moveToLineEdge(edge, action.extend)) {\n event.preventDefault();\n return true;\n }\n break;\n\n case 'document':\n // Document navigation needs to be handled by the editor component\n // as it involves cross-paragraph movement\n if (action.direction === 'left' && options?.onDocumentStart) {\n event.preventDefault();\n options.onDocumentStart();\n return true;\n }\n if (action.direction === 'right' && options?.onDocumentEnd) {\n event.preventDefault();\n options.onDocumentEnd();\n return true;\n }\n break;\n }\n\n return false;\n}\n\n/**\n * Check if an event is a navigation key event\n */\nexport function isNavigationKey(event: KeyboardEvent): boolean {\n const { key, ctrlKey, metaKey } = event;\n const isModifier = ctrlKey || metaKey;\n\n // Arrow keys with Ctrl/Cmd\n if (isModifier && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n return true;\n }\n\n // Home/End keys\n if (key === 'Home' || key === 'End') {\n return true;\n }\n\n return false;\n}\n\n// ============================================================================\n// SELECTION WORD EXPANSION\n// ============================================================================\n\n/**\n * Expand selection to word boundaries\n * Used for double-click word selection\n */\nexport function expandSelectionToWord(): boolean {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return false;\n\n const text = focusNode.textContent || '';\n const offset = selection.focusOffset;\n\n // Find word boundaries around the cursor\n let start = offset;\n let end = offset;\n\n // Expand backwards to word start\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n // Expand forwards to word end\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n // If we didn't find a word (cursor on whitespace), don't expand\n if (start === end) return false;\n\n // Create the selection\n const range = document.createRange();\n range.setStart(focusNode, start);\n range.setEnd(focusNode, end);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n}\n\n/**\n * Get the word at the current cursor position\n */\nexport function getWordAtCursor(): string | null {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const focusNode = selection.focusNode;\n if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE) return null;\n\n const text = focusNode.textContent || '';\n const offset = selection.focusOffset;\n\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordCharacter(text[start - 1])) {\n start--;\n }\n\n while (end < text.length && isWordCharacter(text[end])) {\n end++;\n }\n\n if (start === end) return null;\n\n return text.slice(start, end);\n}\n\n// ============================================================================\n// KEYBOARD SHORTCUT MATCHING\n// ============================================================================\n\n/**\n * Check if a keyboard event matches a shortcut definition\n */\nexport function matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n // Handle both Ctrl and Meta (Cmd on Mac)\n const eventModifier = event.ctrlKey || event.metaKey;\n const shortcutModifier = shortcut.ctrlKey || shortcut.metaKey;\n\n return (\n event.key.toLowerCase() === shortcut.key.toLowerCase() &&\n eventModifier === !!shortcutModifier &&\n event.shiftKey === !!shortcut.shiftKey &&\n event.altKey === !!shortcut.altKey\n );\n}\n\n/**\n * Common navigation shortcuts\n */\nexport const NAVIGATION_SHORTCUTS = {\n // Word navigation\n wordLeft: { key: 'ArrowLeft', ctrlKey: true } as KeyboardShortcut,\n wordRight: { key: 'ArrowRight', ctrlKey: true } as KeyboardShortcut,\n selectWordLeft: { key: 'ArrowLeft', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n selectWordRight: { key: 'ArrowRight', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n\n // Line navigation\n lineStart: { key: 'Home' } as KeyboardShortcut,\n lineEnd: { key: 'End' } as KeyboardShortcut,\n selectToLineStart: { key: 'Home', shiftKey: true } as KeyboardShortcut,\n selectToLineEnd: { key: 'End', shiftKey: true } as KeyboardShortcut,\n\n // Document navigation\n documentStart: { key: 'Home', ctrlKey: true } as KeyboardShortcut,\n documentEnd: { key: 'End', ctrlKey: true } as KeyboardShortcut,\n selectToDocumentStart: { key: 'Home', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n selectToDocumentEnd: { key: 'End', ctrlKey: true, shiftKey: true } as KeyboardShortcut,\n} as const;\n\n/**\n * Get a human-readable description of a shortcut\n */\nexport function describeShortcut(shortcut: KeyboardShortcut): string {\n const parts: string[] = [];\n\n if (shortcut.ctrlKey || shortcut.metaKey) {\n // Use Cmd symbol on Mac, Ctrl on others\n const isMac = typeof navigator !== 'undefined' && /Mac/i.test(navigator.platform);\n parts.push(isMac ? '⌘' : 'Ctrl');\n }\n if (shortcut.shiftKey) parts.push('Shift');\n if (shortcut.altKey) parts.push('Alt');\n\n // Format the key\n let keyName = shortcut.key;\n if (keyName === 'ArrowLeft') keyName = '←';\n else if (keyName === 'ArrowRight') keyName = '→';\n else if (keyName === 'ArrowUp') keyName = '↑';\n else if (keyName === 'ArrowDown') keyName = '↓';\n\n parts.push(keyName);\n\n return parts.join('+');\n}\n\n/**\n * Get all navigation shortcuts with descriptions\n */\nexport function getNavigationShortcutDescriptions(): Array<{\n action: string;\n shortcut: string;\n}> {\n return [\n { action: 'Move by word (left)', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.wordLeft) },\n { action: 'Move by word (right)', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.wordRight) },\n {\n action: 'Select word (left)',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectWordLeft),\n },\n {\n action: 'Select word (right)',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectWordRight),\n },\n { action: 'Go to line start', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.lineStart) },\n { action: 'Go to line end', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.lineEnd) },\n {\n action: 'Select to line start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToLineStart),\n },\n {\n action: 'Select to line end',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToLineEnd),\n },\n {\n action: 'Go to document start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.documentStart),\n },\n { action: 'Go to document end', shortcut: describeShortcut(NAVIGATION_SHORTCUTS.documentEnd) },\n {\n action: 'Select to document start',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToDocumentStart),\n },\n {\n action: 'Select to document end',\n shortcut: describeShortcut(NAVIGATION_SHORTCUTS.selectToDocumentEnd),\n },\n ];\n}\n","/**\n * Template ProseMirror Plugin\n *\n * Simple plugin that finds template tags using regex and creates decorations.\n * No separate parsing layer - everything happens here.\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport type { Node as ProseMirrorNode } from 'prosemirror-model';\n\n/**\n * Template tag types\n */\nexport type TagType = 'variable' | 'sectionStart' | 'sectionEnd' | 'invertedStart' | 'raw';\n\n/**\n * A found template tag\n */\nexport interface TemplateTag {\n id: string;\n type: TagType;\n name: string;\n rawTag: string;\n from: number;\n to: number;\n /** For sections: nested variable names */\n nestedVars?: string[];\n /** True if this variable is inside a section (shown in section's nested vars) */\n insideSection?: boolean;\n}\n\n/**\n * Plugin state\n */\ninterface TemplatePluginState {\n tags: TemplateTag[];\n decorations: DecorationSet;\n hoveredId?: string;\n selectedId?: string;\n}\n\n/**\n * Regex to match template tags: {name}, {#name}, {/name}, {^name}, {@name}\n */\nconst TAG_REGEX = /\\{([#/^@]?)([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}/g;\n\n/**\n * Plugin key\n */\nexport const templatePluginKey = new PluginKey<TemplatePluginState>('template');\n\n/**\n * Generate a stable tag ID based on content, not a counter.\n * This ensures React keys remain stable across re-parses,\n * preventing DOM destruction/recreation (which causes blinking).\n */\nfunction stableId(type: TagType, name: string, occurrence: number): string {\n return `${type}:${name}:${occurrence}`;\n}\n\n/**\n * Find all template tags in the document\n */\nfunction findTags(doc: ProseMirrorNode): TemplateTag[] {\n // Collect all text with positions\n const parts: { text: string; pos: number }[] = [];\n doc.descendants((node, pos) => {\n if (node.isText && node.text) {\n parts.push({ text: node.text, pos });\n }\n return true;\n });\n\n // Build combined text and position map\n let combined = '';\n const posMap: number[] = [];\n for (const p of parts) {\n for (let i = 0; i < p.text.length; i++) {\n posMap.push(p.pos + i);\n }\n combined += p.text;\n }\n\n // Find tags\n const tags: TemplateTag[] = [];\n const sectionStack: TemplateTag[] = [];\n const occurrences = new Map<string, number>();\n let match: RegExpExecArray | null;\n\n TAG_REGEX.lastIndex = 0;\n while ((match = TAG_REGEX.exec(combined)) !== null) {\n const [rawTag, prefix, name] = match;\n const from = posMap[match.index];\n const to = posMap[match.index + rawTag.length - 1] + 1;\n\n let type: TagType;\n if (prefix === '#') type = 'sectionStart';\n else if (prefix === '/') type = 'sectionEnd';\n else if (prefix === '^') type = 'invertedStart';\n else if (prefix === '@') type = 'raw';\n else type = 'variable';\n\n const key = `${type}:${name}`;\n const occ = occurrences.get(key) ?? 0;\n occurrences.set(key, occ + 1);\n\n const tag: TemplateTag = { id: stableId(type, name, occ), type, name, rawTag, from, to };\n\n // Track nested variables in sections\n if (type === 'sectionStart' || type === 'invertedStart') {\n tag.nestedVars = [];\n sectionStack.push(tag);\n } else if (type === 'sectionEnd') {\n // Pop matching section\n for (let i = sectionStack.length - 1; i >= 0; i--) {\n if (sectionStack[i].name === name) {\n sectionStack.splice(i, 1);\n break;\n }\n }\n } else if (type === 'variable' && sectionStack.length > 0) {\n // Add to nearest section's nested vars and mark as inside section\n const section = sectionStack[sectionStack.length - 1];\n section.nestedVars?.push(name);\n tag.insideSection = true;\n }\n\n tags.push(tag);\n }\n\n return tags;\n}\n\n/**\n * Get color for tag type\n */\nfunction getColor(type: TagType): string {\n switch (type) {\n case 'sectionStart':\n case 'sectionEnd':\n return '#3b82f6';\n case 'invertedStart':\n return '#8b5cf6';\n case 'raw':\n return '#ef4444';\n default:\n return '#f59e0b';\n }\n}\n\n/**\n * Create decorations for tags\n */\nfunction createDecorations(\n doc: ProseMirrorNode,\n tags: TemplateTag[],\n hoveredId?: string,\n selectedId?: string\n): DecorationSet {\n const decorations: Decoration[] = [];\n\n for (const tag of tags) {\n const isHovered = tag.id === hoveredId;\n const isSelected = tag.id === selectedId;\n const color = getColor(tag.type);\n\n const classes = ['docx-template-tag'];\n if (isHovered) classes.push('hovered');\n if (isSelected) classes.push('selected');\n\n decorations.push(\n Decoration.inline(tag.from, tag.to, {\n class: classes.join(' '),\n 'data-tag-id': tag.id,\n style: `background-color: ${color}22; border-radius: 2px;`,\n })\n );\n }\n\n return DecorationSet.create(doc, decorations);\n}\n\n/**\n * Compare two tag arrays for structural equality (same tag IDs in same order).\n * Position shifts (from/to) are expected during typing and don't count as structural changes.\n */\nfunction tagsStructureEqual(a: TemplateTag[], b: TemplateTag[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].id !== b[i].id) return false;\n }\n return true;\n}\n\n/**\n * Create the template plugin\n */\nexport function createTemplatePlugin(): Plugin<TemplatePluginState> {\n return new Plugin<TemplatePluginState>({\n key: templatePluginKey,\n\n state: {\n init(_, state) {\n const tags = findTags(state.doc);\n return {\n tags,\n decorations: createDecorations(state.doc, tags),\n };\n },\n\n apply(tr, value, _oldState, newState) {\n // Re-parse on doc change\n if (tr.docChanged) {\n const newTags = findTags(newState.doc);\n\n // When tag structure is unchanged (same IDs, just shifted positions),\n // map existing decorations instead of rebuilding from scratch.\n // Tags still get updated positions for overlay rendering.\n const structureSame = tagsStructureEqual(value.tags, newTags);\n\n return {\n tags: newTags,\n decorations: structureSame\n ? value.decorations.map(tr.mapping, tr.doc)\n : createDecorations(newState.doc, newTags, value.hoveredId, value.selectedId),\n hoveredId: value.hoveredId,\n selectedId: value.selectedId,\n };\n }\n\n // Handle hover/select changes\n const meta = tr.getMeta(templatePluginKey);\n if (meta) {\n const newHovered = meta.hoveredId ?? value.hoveredId;\n const newSelected = meta.selectedId ?? value.selectedId;\n return {\n ...value,\n hoveredId: newHovered,\n selectedId: newSelected,\n decorations: createDecorations(newState.doc, value.tags, newHovered, newSelected),\n };\n }\n\n // Map decorations\n return {\n ...value,\n decorations: value.decorations.map(tr.mapping, tr.doc),\n };\n },\n },\n\n props: {\n decorations(state) {\n return templatePluginKey.getState(state)?.decorations ?? DecorationSet.empty;\n },\n\n handleClick(view: EditorView, pos: number) {\n const tags = templatePluginKey.getState(view.state)?.tags ?? [];\n const clicked = tags.find((t) => pos >= t.from && pos <= t.to);\n\n if (clicked) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: clicked.id }));\n return true;\n }\n\n const current = templatePluginKey.getState(view.state)?.selectedId;\n if (current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: undefined }));\n }\n return false;\n },\n\n handleDOMEvents: {\n mouseover(view: EditorView, event) {\n const el = (event.target as HTMLElement).closest?.('[data-tag-id]');\n const id = el?.getAttribute('data-tag-id') || undefined;\n const current = templatePluginKey.getState(view.state)?.hoveredId;\n\n if (id !== current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: id }));\n }\n return false;\n },\n\n mouseout(view: EditorView, event: MouseEvent) {\n const related = event.relatedTarget as HTMLElement;\n if (!related?.closest?.('[data-tag-id]')) {\n const current = templatePluginKey.getState(view.state)?.hoveredId;\n if (current) {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: undefined }));\n }\n }\n return false;\n },\n },\n },\n });\n}\n\n/**\n * Get tags from editor state\n */\nexport function getTemplateTags(state: import('prosemirror-state').EditorState): TemplateTag[] {\n return templatePluginKey.getState(state)?.tags ?? [];\n}\n\n/**\n * Set hovered tag\n */\nexport function setHoveredElement(view: EditorView, id: string | undefined): void {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { hoveredId: id }));\n}\n\n/**\n * Set selected tag\n */\nexport function setSelectedElement(view: EditorView, id: string | undefined): void {\n view.dispatch(view.state.tr.setMeta(templatePluginKey, { selectedId: id }));\n}\n\n/**\n * CSS styles for template decorations\n */\nexport const TEMPLATE_DECORATION_STYLES = `\n.docx-template-tag {\n cursor: pointer;\n transition: background-color 0.1s;\n}\n\n.docx-template-tag:hover,\n.docx-template-tag.hovered {\n filter: brightness(0.95);\n}\n\n.docx-template-tag.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);\n}\n`;\n","/**\n * Annotation Panel Component\n *\n * Displays template tags anchored to their positions in the document.\n */\n\nimport { useMemo, useEffect, useState, useRef, useCallback } from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { PluginPanelProps } from '../../../plugin-api/types';\nimport type { TemplateTag, TagType } from '../prosemirror-plugin';\nimport { setHoveredElement, setSelectedElement } from '../prosemirror-plugin';\n\ninterface PluginState {\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n}\n\nexport interface AnnotationPanelProps extends PluginPanelProps<PluginState> {}\n\ninterface TagPosition {\n tag: TemplateTag;\n top: number;\n}\n\n/** Colors for tag types */\nconst COLORS: Record<TagType, string> = {\n variable: '#f59e0b',\n sectionStart: '#3b82f6',\n sectionEnd: '#3b82f6',\n invertedStart: '#8b5cf6',\n raw: '#ef4444',\n};\n\n/** Labels for tag types */\nfunction getLabel(type: TagType): string {\n switch (type) {\n case 'sectionStart':\n return 'LOOP / IF';\n case 'invertedStart':\n return 'IF NOT';\n case 'raw':\n return 'HTML';\n default:\n return '';\n }\n}\n\nexport function AnnotationPanel({\n editorView,\n pluginState,\n renderedDomContext,\n}: AnnotationPanelProps) {\n const tags = pluginState?.tags ?? [];\n const hoveredId = pluginState?.hoveredId;\n const selectedId = pluginState?.selectedId;\n\n const [layoutVersion, setLayoutVersion] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const chipRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n // Cache last known good positions so chips never disappear during layout transitions\n const lastPositionsRef = useRef<TagPosition[]>([]);\n\n // Filter to show only variables and section starts (not ends or vars inside sections)\n const visibleTags = useMemo(() => {\n return tags.filter((t) => t.type !== 'sectionEnd' && !t.insideSection);\n }, [tags]);\n\n // Compute positions synchronously to avoid blank-frame blink\n const computePositions = useCallback((): TagPosition[] => {\n if (visibleTags.length === 0 || !renderedDomContext) {\n return lastPositionsRef.current;\n }\n\n const newPositions: TagPosition[] = [];\n const containerOffset = renderedDomContext.getContainerOffset();\n // Build lookup of last known positions by tag ID\n const lastPosMap = new Map<string, number>();\n for (const pos of lastPositionsRef.current) {\n lastPosMap.set(pos.tag.id, pos.top);\n }\n\n for (const tag of visibleTags) {\n const rects = renderedDomContext.getRectsForRange(tag.from, tag.from + 1);\n if (rects.length > 0) {\n const top = rects[0].y + containerOffset.y - 40;\n newPositions.push({ tag, top });\n } else {\n // Fallback: keep last known position so chip doesn't disappear\n const lastTop = lastPosMap.get(tag.id);\n if (lastTop !== undefined) {\n newPositions.push({ tag, top: lastTop });\n }\n }\n }\n\n // Sort and prevent overlaps using measured heights\n newPositions.sort((a, b) => a.top - b.top);\n const minGap = 6;\n\n for (let i = 1; i < newPositions.length; i++) {\n const prev = newPositions[i - 1];\n const curr = newPositions[i];\n\n const prevChipEl = chipRefs.current.get(prev.tag.id);\n let prevHeight = 32;\n if (prevChipEl) {\n prevHeight = prevChipEl.offsetHeight;\n } else if (prev.tag.nestedVars && prev.tag.nestedVars.length > 0) {\n prevHeight = 32 + 10 + prev.tag.nestedVars.length * 26;\n }\n\n if (curr.top < prev.top + prevHeight + minGap) {\n curr.top = prev.top + prevHeight + minGap;\n }\n }\n\n lastPositionsRef.current = newPositions;\n return newPositions;\n }, [visibleTags, renderedDomContext]);\n\n const positions = useMemo(() => computePositions(), [computePositions, layoutVersion]);\n\n // ResizeObserver for zoom/layout changes\n useEffect(() => {\n if (!renderedDomContext) return;\n\n const observer = new ResizeObserver(() => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n });\n observer.observe(renderedDomContext.pagesContainer);\n return () => observer.disconnect();\n }, [renderedDomContext]);\n\n // Window resize handler\n useEffect(() => {\n const handleResize = () => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Second pass: recalculate once after initial render to use measured chip heights\n const lastMeasuredTagsKey = useRef<string>('');\n useEffect(() => {\n const tagsKey = visibleTags.map((t) => t.id).join(',');\n if (tagsKey && lastMeasuredTagsKey.current !== tagsKey) {\n const timer = setTimeout(() => {\n lastMeasuredTagsKey.current = tagsKey;\n setLayoutVersion((v) => v + 1);\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [visibleTags]);\n\n const handleHover = (id: string | undefined) => {\n if (editorView) setHoveredElement(editorView, id);\n };\n\n const handleClick = (tag: TemplateTag) => {\n if (!editorView) return;\n setSelectedElement(editorView, tag.id);\n // Select the tag in editor\n const { state } = editorView;\n const tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(tag.from)));\n editorView.dispatch(tr);\n editorView.focus();\n };\n\n if (visibleTags.length === 0) return null;\n\n return (\n <div className=\"template-panel\" ref={containerRef}>\n <div className=\"template-panel-annotations\">\n {positions.map(({ tag, top }) => {\n const label = getLabel(tag.type);\n const color = COLORS[tag.type];\n const isSection = tag.type === 'sectionStart' || tag.type === 'invertedStart';\n const isHovered = tag.id === hoveredId;\n const isSelected = tag.id === selectedId;\n\n return (\n <div key={tag.id} className=\"template-annotation-anchor\" style={{ top: `${top}px` }}>\n <div className=\"template-annotation-connector\" />\n <div\n ref={(el) => {\n if (el) chipRefs.current.set(tag.id, el);\n else chipRefs.current.delete(tag.id);\n }}\n className={`template-annotation-chip ${isHovered ? 'hovered' : ''} ${isSelected ? 'selected' : ''}`}\n style={{ borderLeftColor: color }}\n onMouseEnter={() => handleHover(tag.id)}\n onMouseLeave={() => handleHover(undefined)}\n onClick={() => handleClick(tag)}\n title={\n isSection\n ? `${tag.rawTag}\\nIterates over ${tag.name}[]. Access nested properties via ${tag.name}.property`\n : tag.rawTag\n }\n >\n {label && (\n <span className=\"template-chip-badge\" style={{ background: color }}>\n {label}\n </span>\n )}\n {!label && (\n <span className=\"template-chip-dot\" style={{ color }}>\n ●\n </span>\n )}\n <span className=\"template-chip-name\">{tag.name}</span>\n\n {isSection && tag.nestedVars && tag.nestedVars.length > 0 && (\n <div className=\"template-chip-nested\">\n {tag.nestedVars.map((v, i) => (\n <span\n key={i}\n className=\"template-nested-var\"\n title={`Access: ${tag.name}.${v}`}\n >\n {v.includes('.') ? v.split('.').pop() : v}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const ANNOTATION_PANEL_STYLES = `\n.template-panel {\n display: flex;\n min-height: 100%;\n background: transparent;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\n.template-panel-annotations {\n flex: 1;\n position: relative;\n overflow: visible;\n min-height: 100%;\n pointer-events: none;\n will-change: transform;\n}\n\n.template-panel-annotations > * {\n pointer-events: auto;\n}\n\n.template-annotation-anchor {\n position: absolute;\n left: 0;\n right: 0;\n display: flex;\n align-items: flex-start;\n transition: top 0.15s ease-out;\n}\n\n.template-annotation-connector {\n width: 20px;\n height: 1px;\n background: #d0d0d0;\n margin-top: 12px;\n margin-right: 4px;\n flex-shrink: 0;\n}\n\n.template-annotation-anchor:hover .template-annotation-connector {\n background: #3b82f6;\n}\n\n.template-annotation-chip {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 5px 10px;\n background: white;\n border: 1px solid #e2e8f0;\n border-left: 3px solid #6c757d;\n border-radius: 4px;\n font-size: 11px;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n max-width: 200px;\n}\n\n.template-annotation-chip:hover,\n.template-annotation-chip.hovered {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n border-color: #cbd5e1;\n}\n\n.template-annotation-chip.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);\n}\n\n.template-chip-badge {\n font-size: 9px;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 3px;\n color: white;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.template-chip-dot {\n font-size: 8px;\n}\n\n.template-chip-name {\n color: #334155;\n font-weight: 500;\n}\n\n.template-chip-nested {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n width: 100%;\n margin-top: 4px;\n padding-top: 4px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n}\n\n.template-nested-var {\n font-size: 10px;\n color: #64748b;\n background: rgba(0, 0, 0, 0.04);\n padding: 2px 6px;\n border-radius: 3px;\n}\n\n.template-nested-var:hover {\n background: rgba(59, 130, 246, 0.15);\n color: #1e40af;\n}\n`;\n","/**\n * Template Highlight Overlay Component\n *\n * Renders highlight rectangles for template tags on the visible pages.\n * Uses RenderedDomContext to get accurate positioning.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RenderedDomContext } from '../../../plugin-api/types';\nimport type { TemplateTag, TagType } from '../prosemirror-plugin';\n\ninterface TemplateHighlightOverlayProps {\n context: RenderedDomContext;\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n onHover?: (id: string | undefined) => void;\n onSelect?: (id: string) => void;\n}\n\n/** Colors for tag types (matching AnnotationPanel) */\nconst HIGHLIGHT_COLORS: Record<TagType, string> = {\n variable: 'rgba(245, 158, 11, 0.3)',\n sectionStart: 'rgba(59, 130, 246, 0.3)',\n sectionEnd: 'rgba(59, 130, 246, 0.3)',\n invertedStart: 'rgba(139, 92, 246, 0.3)',\n raw: 'rgba(239, 68, 68, 0.3)',\n};\n\nconst HOVER_COLORS: Record<TagType, string> = {\n variable: 'rgba(245, 158, 11, 0.5)',\n sectionStart: 'rgba(59, 130, 246, 0.5)',\n sectionEnd: 'rgba(59, 130, 246, 0.5)',\n invertedStart: 'rgba(139, 92, 246, 0.5)',\n raw: 'rgba(239, 68, 68, 0.5)',\n};\n\ninterface HighlightRect {\n tagId: string;\n tagType: TagType;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function TemplateHighlightOverlay({\n context,\n tags,\n hoveredId,\n selectedId,\n onHover,\n onSelect,\n}: TemplateHighlightOverlayProps) {\n // Version counter bumped by resize/layout changes to trigger recompute\n const [layoutVersion, setLayoutVersion] = useState(0);\n\n // Compute highlight rectangles synchronously during render (no blank frames)\n const computeHighlights = useCallback((): HighlightRect[] => {\n const containerOffset = context.getContainerOffset();\n const rects: HighlightRect[] = [];\n\n for (const tag of tags) {\n const tagRects = context.getRectsForRange(tag.from, tag.to);\n for (const rect of tagRects) {\n rects.push({\n tagId: tag.id,\n tagType: tag.type,\n x: rect.x + containerOffset.x,\n y: rect.y + containerOffset.y,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n\n return rects;\n }, [context, tags]);\n\n // Compute synchronously — no useEffect gap that causes blinking\n\n const highlights = useMemo(() => computeHighlights(), [computeHighlights, layoutVersion]);\n\n // Recompute on window resize\n useEffect(() => {\n const handleResize = () => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Also observe the pagesContainer for size changes (zoom, layout changes)\n useEffect(() => {\n const observer = new ResizeObserver(() => {\n requestAnimationFrame(() => setLayoutVersion((v) => v + 1));\n });\n observer.observe(context.pagesContainer);\n return () => observer.disconnect();\n }, [context.pagesContainer]);\n\n // Show all highlights, with enhanced styling for hovered/selected\n if (highlights.length === 0) {\n return null;\n }\n\n return (\n <div className=\"template-highlight-overlay\">\n {highlights.map((rect, index) => {\n const isHovered = rect.tagId === hoveredId;\n const isSelected = rect.tagId === selectedId;\n const color =\n isHovered || isSelected ? HOVER_COLORS[rect.tagType] : HIGHLIGHT_COLORS[rect.tagType];\n\n return (\n <div\n key={`${rect.tagId}-${index}`}\n className={`template-highlight ${isHovered ? 'hovered' : ''} ${isSelected ? 'selected' : ''}`}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: rect.width,\n height: rect.height,\n backgroundColor: color,\n borderRadius: 2,\n cursor: 'pointer',\n }}\n onMouseEnter={() => onHover?.(rect.tagId)}\n onMouseLeave={() => onHover?.(undefined)}\n onClick={() => onSelect?.(rect.tagId)}\n />\n );\n })}\n </div>\n );\n}\n\nexport const TEMPLATE_HIGHLIGHT_OVERLAY_STYLES = `\n.template-highlight-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n}\n\n.template-highlight {\n pointer-events: auto;\n transition: background-color 0.1s ease;\n}\n\n.template-highlight:hover,\n.template-highlight.hovered {\n filter: brightness(0.9);\n}\n\n.template-highlight.selected {\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.6);\n}\n`;\n","/**\n * Template Plugin\n *\n * Docxtemplater template support as a plugin for the DOCX Editor.\n *\n * Features:\n * - Full docxtemplater syntax detection (variables, loops, conditionals)\n * - Schema annotation panel showing template structure\n * - Differentiated visual highlighting by element type\n *\n * @example\n * ```tsx\n * import { PluginHost } from '@docx-editor/plugin-api';\n * import { templatePlugin } from '@docx-editor/plugins/template';\n *\n * function MyEditor() {\n * return (\n * <PluginHost plugins={[templatePlugin]}>\n * <DocxEditor document={doc} onChange={handleChange} />\n * </PluginHost>\n * );\n * }\n * ```\n */\n\nimport React from 'react';\nimport { TextSelection } from 'prosemirror-state';\nimport type { ReactEditorPlugin, RenderedDomContext } from '../../plugin-api/types';\nimport type { EditorView } from 'prosemirror-view';\nimport type { TemplateTag } from './prosemirror-plugin';\nimport {\n createTemplatePlugin,\n templatePluginKey,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n} from './prosemirror-plugin';\nimport { AnnotationPanel, ANNOTATION_PANEL_STYLES } from './components/AnnotationPanel';\nimport type { AnnotationPanelProps } from './components/AnnotationPanel';\nimport {\n TemplateHighlightOverlay,\n TEMPLATE_HIGHLIGHT_OVERLAY_STYLES,\n} from './components/TemplateHighlightOverlay';\n\n/**\n * Memoized AnnotationPanel that only re-renders when tag structure\n * or hover/selected state changes — not on every keystroke position shift.\n */\nconst MemoizedAnnotationPanel = React.memo<AnnotationPanelProps>(AnnotationPanel, (prev, next) => {\n const prevState = prev.pluginState;\n const nextState = next.pluginState;\n\n // Re-render if hover/selected changed\n if (prevState?.hoveredId !== nextState?.hoveredId) return false;\n if (prevState?.selectedId !== nextState?.selectedId) return false;\n\n // Re-render if tag structure changed (different count or IDs)\n const prevTags = prevState?.tags ?? [];\n const nextTags = nextState?.tags ?? [];\n if (prevTags.length !== nextTags.length) return false;\n for (let i = 0; i < prevTags.length; i++) {\n if (prevTags[i].id !== nextTags[i].id) return false;\n }\n\n // Re-render if rendered DOM context changed (initial load)\n if (prev.renderedDomContext !== next.renderedDomContext) return false;\n\n // Otherwise skip re-render (positions shifted but structure is the same)\n return true;\n});\n\n/**\n * Plugin state interface\n */\ninterface TemplatePluginState {\n tags: TemplateTag[];\n hoveredId?: string;\n selectedId?: string;\n}\n\n/**\n * Create the template plugin instance.\n *\n * @param options - Plugin configuration options\n */\nexport function createPlugin(\n options: {\n /** Initial panel collapsed state */\n defaultCollapsed?: boolean;\n\n /** Panel position */\n panelPosition?: 'left' | 'right';\n\n /** Panel default width */\n panelWidth?: number;\n } = {}\n): ReactEditorPlugin<TemplatePluginState> {\n // Create the ProseMirror plugin\n const pmPlugin = createTemplatePlugin();\n\n return {\n id: 'template',\n name: 'Template',\n\n proseMirrorPlugins: [pmPlugin],\n\n Panel: MemoizedAnnotationPanel,\n\n panelConfig: {\n position: options.panelPosition ?? 'right',\n defaultSize: options.panelWidth ?? 280,\n minSize: 200,\n maxSize: 400,\n resizable: true,\n collapsible: true,\n defaultCollapsed: options.defaultCollapsed ?? false,\n },\n\n onStateChange: (view: EditorView): TemplatePluginState | undefined => {\n const pluginState = templatePluginKey.getState(view.state);\n if (!pluginState) return undefined;\n\n return {\n tags: pluginState.tags,\n hoveredId: pluginState.hoveredId,\n selectedId: pluginState.selectedId,\n };\n },\n\n initialize: (_view: EditorView | null): TemplatePluginState => {\n return {\n tags: [],\n };\n },\n\n renderOverlay: (\n context: RenderedDomContext,\n state: TemplatePluginState | undefined,\n editorView: EditorView | null\n ): React.ReactNode => {\n if (!state || state.tags.length === 0) {\n return null;\n }\n\n return React.createElement(TemplateHighlightOverlay, {\n context,\n tags: state.tags,\n hoveredId: state.hoveredId,\n selectedId: state.selectedId,\n onHover: (id: string | undefined) => {\n if (editorView) setHoveredElement(editorView, id);\n },\n onSelect: (id: string) => {\n if (editorView) {\n setSelectedElement(editorView, id);\n // Find the tag and scroll to it\n const tag = state.tags.find((t) => t.id === id);\n if (tag) {\n const tr = editorView.state.tr.setSelection(\n TextSelection.near(editorView.state.doc.resolve(tag.from))\n );\n editorView.dispatch(tr);\n editorView.focus();\n }\n }\n },\n });\n },\n\n styles: `\n${TEMPLATE_DECORATION_STYLES}\n${ANNOTATION_PANEL_STYLES}\n${TEMPLATE_HIGHLIGHT_OVERLAY_STYLES}\n`,\n };\n}\n\n/**\n * Default template plugin instance.\n * Use this for quick setup without custom configuration.\n */\nexport const templatePlugin = createPlugin();\n\n// Re-export types and utilities from prosemirror-plugin\nexport type { TemplateTag, TagType } from './prosemirror-plugin';\nexport {\n createTemplatePlugin,\n templatePluginKey,\n getTemplateTags,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n} from './prosemirror-plugin';\n\nexport { AnnotationPanel, ANNOTATION_PANEL_STYLES } from './components/AnnotationPanel';\n","/**\n * @eigenpal/docx-js-editor\n *\n * A complete WYSIWYG DOCX editor with full Microsoft Word fidelity.\n *\n * Features:\n * - Full text and paragraph formatting\n * - Tables, images, shapes, text boxes\n * - Hyperlinks, bookmarks, fields\n * - Footnotes, lists, headers/footers\n * - Page layout with margins and columns\n * - DocumentAgent API for programmatic editing\n * - Template variable substitution\n * - AI-powered context menu\n *\n * CSS Styles:\n * For optimal cursor visibility and selection highlighting, import the editor styles:\n * ```\n * import '@eigenpal/docx-js-editor/styles/editor.css';\n * ```\n */\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '0.0.2';\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport { DocxEditor, type DocxEditorProps, type DocxEditorRef } from './components/DocxEditor';\nexport { renderAsync, type RenderAsyncOptions, type DocxEditorHandle } from './renderAsync';\nexport { type DocxInput, toArrayBuffer } from '@eigenpal/docx-core/utils/docxInput';\n\n// ============================================================================\n// AGENT API\n// ============================================================================\n\nexport { DocumentAgent } from '@eigenpal/docx-core/agent/DocumentAgent';\nexport { executeCommand, executeCommands } from '@eigenpal/docx-core/agent/executor';\nexport {\n getAgentContext,\n getDocumentSummary,\n type AgentContextOptions,\n} from '@eigenpal/docx-core/agent/context';\nexport {\n buildSelectionContext,\n buildExtendedSelectionContext,\n type SelectionContextOptions,\n type ExtendedSelectionContext,\n} from '@eigenpal/docx-core/agent/selectionContext';\n\n// ============================================================================\n// PARSER / SERIALIZER\n// ============================================================================\n\nexport { parseDocx } from '@eigenpal/docx-core/docx/parser';\nexport {\n serializeDocument as serializeDocx,\n serializeDocumentBody,\n serializeSectionProperties,\n} from '@eigenpal/docx-core/docx/serializer/documentSerializer';\nexport {\n processTemplate,\n processTemplateDetailed,\n processTemplateAsBlob,\n getTemplateTags,\n validateTemplate,\n type ProcessTemplateOptions,\n type ProcessTemplateResult,\n} from '@eigenpal/docx-core/utils/processTemplate';\n\n// ============================================================================\n// DOCUMENT CREATION\n// ============================================================================\n\nexport {\n createEmptyDocument,\n createDocumentWithText,\n type CreateEmptyDocumentOptions,\n} from '@eigenpal/docx-core/utils/createDocument';\n\n// ============================================================================\n// FONT LOADER\n// ============================================================================\n\nexport {\n loadFont,\n loadFonts,\n loadFontFromBuffer,\n isFontLoaded,\n isLoading as isFontsLoading,\n getLoadedFonts,\n onFontsLoaded,\n canRenderFont,\n preloadCommonFonts,\n} from '@eigenpal/docx-core/utils/fontLoader';\n\n// ============================================================================\n// UI COMPONENTS\n// ============================================================================\n\nexport {\n Toolbar,\n type ToolbarProps,\n ToolbarButton,\n ToolbarGroup,\n ToolbarSeparator,\n} from './components/Toolbar';\nexport {\n ContextMenu,\n type ContextMenuProps,\n useContextMenu,\n getActionShortcut,\n isActionAvailable,\n getDefaultActions,\n getAllActions,\n} from './components/ContextMenu';\nexport {\n ResponsePreview,\n type ResponsePreviewProps,\n useResponsePreview,\n type ResponsePreviewState,\n createMockResponse,\n createErrorResponse,\n} from './components/ResponsePreview';\nexport {\n TextContextMenu,\n type TextContextMenuProps,\n type TextContextAction,\n type TextContextMenuItem,\n type UseTextContextMenuOptions,\n type UseTextContextMenuReturn,\n useTextContextMenu,\n getTextActionLabel,\n getTextActionShortcut,\n getDefaultTextContextMenuItems,\n isTextActionAvailable,\n} from './components/TextContextMenu';\n\n// ============================================================================\n// ERROR HANDLING\n// ============================================================================\n\nexport {\n ErrorBoundary,\n type ErrorBoundaryProps,\n ErrorProvider,\n useErrorNotifications,\n type ErrorContextValue,\n type ErrorNotification,\n type ErrorSeverity,\n ParseErrorDisplay,\n type ParseErrorDisplayProps,\n UnsupportedFeatureWarning,\n type UnsupportedFeatureWarningProps,\n isParseError,\n getUserFriendlyMessage,\n} from './components/ErrorBoundary';\n\n// ============================================================================\n// UI CONTROLS\n// ============================================================================\n\nexport { ZoomControl, type ZoomControlProps } from './components/ui/ZoomControl';\nexport {\n PageNumberIndicator,\n type PageNumberIndicatorProps,\n type PageIndicatorPosition,\n type PageIndicatorVariant,\n formatPageOrdinal,\n createPageFormat,\n getPageProgress,\n isFirstPage,\n isLastPage,\n calculateVisiblePage,\n calculateScrollToPage,\n} from './components/ui/PageNumberIndicator';\nexport {\n PageNavigator,\n type PageNavigatorProps,\n type PageNavigatorPosition,\n type PageNavigatorVariant,\n parsePageInput,\n isValidPageNumber,\n clampPageNumber,\n getNavigationShortcuts,\n formatPageRange,\n calculateProgress,\n} from './components/ui/PageNavigator';\nexport { FontPicker, type FontPickerProps, type FontOption } from './components/ui/FontPicker';\nexport { FontSizePicker, type FontSizePickerProps } from './components/ui/FontSizePicker';\nexport {\n LineSpacingPicker,\n type LineSpacingPickerProps,\n type LineSpacingOption,\n} from './components/ui/LineSpacingPicker';\nexport { ColorPicker, type ColorPickerProps, type ColorOption } from './components/ui/ColorPicker';\nexport { StylePicker, type StylePickerProps, type StyleOption } from './components/ui/StylePicker';\nexport { AlignmentButtons, type AlignmentButtonsProps } from './components/ui/AlignmentButtons';\nexport {\n ListButtons,\n type ListButtonsProps,\n type ListState,\n createDefaultListState,\n} from './components/ui/ListButtons';\nexport {\n TableToolbar,\n type TableToolbarProps,\n type TableContext,\n type TableSelection,\n type TableAction,\n createTableContext,\n addRow,\n deleteRow,\n addColumn,\n deleteColumn,\n mergeCells,\n splitCell,\n getColumnCount,\n getCellAt,\n} from './components/ui/TableToolbar';\nexport {\n HorizontalRuler,\n type HorizontalRulerProps,\n getRulerDimensions,\n getMarginInUnits,\n parseMarginFromUnits,\n positionToMargin,\n} from './components/ui/HorizontalRuler';\nexport {\n PrintButton,\n type PrintButtonProps,\n PrintStyles,\n type PrintOptions,\n triggerPrint,\n openPrintWindow,\n getDefaultPrintOptions,\n parsePageRange,\n formatPageRange as formatPrintPageRange,\n isPrintSupported,\n} from './components/ui/PrintPreview';\nexport { TableBorderPicker, type TableBorderPickerProps } from './components/ui/TableBorderPicker';\nexport {\n TableBorderColorPicker,\n type TableBorderColorPickerProps,\n} from './components/ui/TableBorderColorPicker';\nexport {\n TableBorderWidthPicker,\n type TableBorderWidthPickerProps,\n} from './components/ui/TableBorderWidthPicker';\nexport {\n TableCellFillPicker,\n type TableCellFillPickerProps,\n} from './components/ui/TableCellFillPicker';\nexport { TableMergeButton, type TableMergeButtonProps } from './components/ui/TableMergeButton';\nexport {\n TableInsertButtons,\n type TableInsertButtonsProps,\n} from './components/ui/TableInsertButtons';\nexport { TableMoreDropdown, type TableMoreDropdownProps } from './components/ui/TableMoreDropdown';\nexport {\n CellBackgroundPicker,\n type CellBackgroundPickerProps,\n type CellColorOption,\n getDefaultCellColors,\n createCellColorOption,\n isDefaultCellColor,\n getCellColorName,\n createShadingFromColor,\n getColorFromShading,\n getContrastingTextColor,\n DEFAULT_CELL_COLORS,\n} from './components/ui/CellBackgroundPicker';\nexport {\n UnsavedIndicator,\n type UnsavedIndicatorProps,\n type IndicatorVariant,\n type IndicatorPosition,\n type UseUnsavedChangesOptions,\n type UseUnsavedChangesReturn,\n useUnsavedChanges,\n getVariantLabel,\n getAllVariants as getAllIndicatorVariants,\n getAllPositions as getAllIndicatorPositions,\n createChangeTracker,\n} from './components/ui/UnsavedIndicator';\nexport {\n LoadingIndicator,\n type LoadingIndicatorProps,\n type LoadingVariant,\n type LoadingSize,\n type UseLoadingOptions,\n type UseLoadingReturn,\n type LoadingOperation,\n useLoading,\n useLoadingOperations,\n getLoadingVariantLabel,\n getAllLoadingVariants,\n getAllLoadingSizes,\n delay,\n} from './components/ui/LoadingIndicator';\nexport {\n ResponsiveToolbar,\n type ResponsiveToolbarProps,\n type ToolbarItem,\n type ToolbarItemPriority,\n type UseResponsiveToolbarOptions,\n type UseResponsiveToolbarReturn,\n ToolbarGroup as ResponsiveToolbarGroup,\n type ToolbarGroupProps as ResponsiveToolbarGroupProps,\n useResponsiveToolbar,\n createToolbarItem,\n createToolbarItems,\n getRecommendedPriority,\n} from './components/ui/ResponsiveToolbar';\n\n// ============================================================================\n// DIALOGS\n// ============================================================================\n\nexport {\n FindReplaceDialog,\n type FindReplaceDialogProps,\n type FindReplaceOptions,\n type FindOptions,\n type FindMatch,\n type FindResult,\n type FindReplaceState,\n type UseFindReplaceReturn,\n useFindReplace,\n findInDocument,\n findInParagraph,\n findAllMatches,\n scrollToMatch,\n createDefaultFindOptions,\n createSearchPattern,\n replaceAllInContent,\n replaceFirstInContent,\n getMatchCountText,\n isEmptySearch,\n escapeRegexString,\n getDefaultHighlightOptions,\n type HighlightOptions,\n} from './components/dialogs/FindReplaceDialog';\nexport {\n HyperlinkDialog,\n type HyperlinkDialogProps,\n type HyperlinkData,\n useHyperlinkDialog,\n} from './components/dialogs/HyperlinkDialog';\nexport {\n InsertTableDialog,\n type InsertTableDialogProps,\n type TableConfig,\n useInsertTableDialog,\n createDefaultTableConfig,\n isValidTableConfig,\n clampTableConfig,\n formatTableDimensions,\n getTablePresets,\n} from './components/dialogs/InsertTableDialog';\nexport {\n InsertImageDialog,\n type InsertImageDialogProps,\n type ImageData,\n useInsertImageDialog,\n isValidImageFile,\n getSupportedImageExtensions,\n getImageAcceptString,\n calculateFitDimensions,\n dataUrlToBlob,\n getImageDimensions,\n formatFileSize,\n} from './components/dialogs/InsertImageDialog';\nexport {\n InsertSymbolDialog,\n type InsertSymbolDialogProps,\n type SymbolCategory,\n useInsertSymbolDialog,\n getSymbolCategories,\n getSymbolsByCategory,\n getSymbolInfo as getSymbolUnicodeInfo,\n searchSymbols,\n symbolFromCodePoint,\n SYMBOL_CATEGORIES,\n} from './components/dialogs/InsertSymbolDialog';\nexport {\n PasteSpecialDialog,\n type PasteSpecialDialogProps,\n type PasteOption,\n type UsePasteSpecialReturn,\n type UsePasteSpecialOptions,\n usePasteSpecial,\n getPasteOption,\n getAllPasteOptions,\n getDefaultPasteOption,\n isPasteSpecialShortcut,\n} from './components/dialogs/PasteSpecialDialog';\nexport {\n KeyboardShortcutsDialog,\n type KeyboardShortcutsDialogProps,\n type KeyboardShortcut as DialogKeyboardShortcut,\n type ShortcutCategory,\n type UseKeyboardShortcutsDialogOptions,\n type UseKeyboardShortcutsDialogReturn,\n useKeyboardShortcutsDialog,\n getDefaultShortcuts,\n getShortcutsByCategory,\n getCommonShortcuts,\n getCategoryLabel,\n getAllCategories,\n formatShortcutKeys,\n} from './components/dialogs/KeyboardShortcutsDialog';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Document types\nexport type {\n Document,\n DocxPackage,\n DocumentBody,\n BlockContent,\n Paragraph,\n Run,\n RunContent,\n TextContent,\n Table,\n TableRow,\n TableCell,\n Image,\n Shape,\n TextBox,\n Hyperlink,\n BookmarkStart,\n BookmarkEnd,\n Field,\n Theme,\n ThemeColorScheme,\n ThemeFont,\n ThemeFontScheme,\n Style,\n StyleDefinitions,\n TextFormatting,\n ParagraphFormatting,\n SectionProperties,\n HeaderFooter,\n HeaderReference,\n FooterReference,\n Footnote,\n Endnote,\n ListLevel,\n NumberingDefinitions,\n Relationship,\n} from '@eigenpal/docx-core/types/document';\n\n// Agent API types\nexport type {\n AIAction,\n AIActionRequest,\n AgentResponse,\n AgentContext,\n SelectionContext,\n Range,\n Position,\n ParagraphContext,\n SuggestedAction,\n AgentCommand,\n InsertTextCommand,\n ReplaceTextCommand,\n DeleteTextCommand,\n FormatTextCommand,\n InsertTableCommand,\n InsertImageCommand,\n InsertHyperlinkCommand,\n SetVariableCommand,\n ApplyStyleCommand,\n} from '@eigenpal/docx-core/types/agentApi';\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport {\n useTableSelection,\n TABLE_DATA_ATTRIBUTES,\n type TableSelectionState,\n type UseTableSelectionReturn,\n type UseTableSelectionOptions,\n} from './hooks/useTableSelection';\n\nexport {\n useAutoSave,\n formatLastSaveTime,\n getAutoSaveStatusLabel,\n getAutoSaveStorageSize,\n formatStorageSize,\n isAutoSaveSupported,\n type AutoSaveStatus,\n type UseAutoSaveOptions,\n type UseAutoSaveReturn,\n type SavedDocumentData,\n} from './hooks/useAutoSave';\n\nexport {\n useWheelZoom,\n getZoomPresets,\n findNearestZoomPreset,\n getNextZoomPreset,\n getPreviousZoomPreset,\n formatZoom,\n parseZoom,\n isZoomPreset,\n clampZoom,\n ZOOM_PRESETS,\n type UseWheelZoomOptions,\n type UseWheelZoomReturn,\n} from './hooks/useWheelZoom';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nexport {\n twipsToPixels,\n pixelsToTwips,\n formatPx,\n emuToPixels,\n pointsToPixels,\n halfPointsToPixels,\n pixelsToEmu,\n emuToTwips,\n twipsToEmu,\n} from '@eigenpal/docx-core/utils/units';\nexport {\n resolveColor,\n resolveHighlightColor,\n resolveShadingColor,\n parseColorString,\n createThemeColor,\n createRgbColor,\n darkenColor,\n lightenColor,\n blendColors,\n getContrastingColor,\n isBlack,\n isWhite,\n colorsEqual,\n} from '@eigenpal/docx-core/utils/colorResolver';\nexport {\n createPageBreak,\n createColumnBreak,\n createLineBreak,\n createPageBreakRun,\n createPageBreakParagraph,\n insertPageBreak,\n createHorizontalRule,\n insertHorizontalRule,\n isPageBreak,\n isColumnBreak,\n isLineBreak,\n isBreakContent,\n hasPageBreakBefore,\n countPageBreaks,\n findPageBreaks,\n removePageBreak,\n type InsertPosition,\n} from '@eigenpal/docx-core/utils/insertOperations';\n\n// Selection highlighting\nexport {\n useSelectionHighlight,\n generateOverlayElements,\n type UseSelectionHighlightOptions,\n type UseSelectionHighlightReturn,\n type SelectionOverlayProps,\n} from './hooks/useSelectionHighlight';\n\nexport {\n DEFAULT_SELECTION_STYLE,\n HIGH_CONTRAST_SELECTION_STYLE,\n SELECTION_CSS_VARS,\n getSelectionRects,\n mergeAdjacentRects,\n getMergedSelectionRects,\n getHighlightRectStyle,\n generateSelectionCSS,\n hasActiveSelection,\n getSelectedText,\n isSelectionWithin,\n getSelectionBoundingRect,\n highlightTextRange,\n selectRange,\n clearSelection,\n isSelectionBackwards,\n normalizeSelectionDirection,\n injectSelectionStyles,\n removeSelectionStyles,\n areSelectionStylesInjected,\n createSelectionChangeHandler,\n type HighlightRect,\n type SelectionHighlightConfig,\n type SelectionRange,\n} from '@eigenpal/docx-core/utils/selectionHighlight';\n\n// Text selection utilities for word/paragraph selection\nexport {\n isWordCharacter,\n isWhitespace,\n findWordBoundaries,\n getWordAt,\n findWordAt,\n selectWordAtCursor,\n selectWordInTextNode,\n expandSelectionToWordBoundaries,\n selectParagraphAtCursor,\n handleClickForMultiClick,\n createDoubleClickWordSelector,\n createTripleClickParagraphSelector,\n type WordSelectionResult,\n} from '@eigenpal/docx-core/utils/textSelection';\n\n// Keyboard navigation\nexport {\n // Types\n type NavigationDirection,\n type NavigationUnit,\n type NavigationAction,\n type KeyboardShortcut,\n // Word boundary detection\n isWordCharacter as isWordChar,\n isWhitespace as isWhitespaceChar,\n isPunctuation,\n findWordStart,\n findWordEnd,\n findNextWordStart,\n findPreviousWordStart,\n // Line boundary detection\n findVisualLineStart,\n findVisualLineEnd,\n // DOM selection utilities\n getSelectionInfo,\n setSelectionPosition,\n extendSelectionTo,\n moveByWord,\n moveToLineEdge,\n // Keyboard event handling\n parseNavigationAction,\n handleNavigationKey,\n isNavigationKey,\n // Selection word expansion\n expandSelectionToWord,\n getWordAtCursor,\n // Keyboard shortcut utilities\n matchesShortcut,\n NAVIGATION_SHORTCUTS,\n describeShortcut,\n getNavigationShortcutDescriptions,\n} from '@eigenpal/docx-core/utils/keyboardNavigation';\n\n// Clipboard utilities\nexport {\n useClipboard,\n createSelectionFromDOM,\n getSelectionRuns,\n type ClipboardSelection,\n type UseClipboardOptions,\n type UseClipboardReturn,\n} from './hooks/useClipboard';\n\nexport {\n copyRuns,\n copyParagraphs,\n readFromClipboard,\n handlePasteEvent,\n htmlToRuns,\n cleanWordHtml,\n isWordHtml,\n isEditorHtml,\n createClipboardHandlers,\n runsToClipboardContent,\n paragraphsToClipboardContent,\n writeToClipboard,\n parseClipboardHtml,\n INTERNAL_CLIPBOARD_TYPE,\n CLIPBOARD_TYPES,\n type ClipboardContent,\n type ParsedClipboardContent,\n type ClipboardOptions,\n} from '@eigenpal/docx-core/utils/clipboard';\n\n// ============================================================================\n// PLUGIN API\n// ============================================================================\n\nexport {\n PluginHost,\n PLUGIN_HOST_STYLES,\n type EditorPlugin,\n type PluginPanelProps,\n type PanelConfig,\n type PluginContext,\n type PluginHostProps,\n type PluginHostRef,\n type RenderedDomContext,\n type PositionCoordinates,\n} from './plugin-api';\n\n// ============================================================================\n// PLUGINS\n// ============================================================================\n\n// Template Plugin (Editor UI)\nexport {\n templatePlugin,\n createPlugin as createTemplatePlugin,\n createTemplatePlugin as createTemplateProseMirrorPlugin,\n templatePluginKey,\n getTemplateTags as getTemplatePluginTags,\n setHoveredElement,\n setSelectedElement,\n TEMPLATE_DECORATION_STYLES,\n AnnotationPanel,\n ANNOTATION_PANEL_STYLES,\n type TemplateTag,\n type TagType,\n} from './plugins/template';\n\n// ============================================================================\n// CORE PLUGIN SYSTEM\n// ============================================================================\n\nexport {\n pluginRegistry,\n PluginRegistry,\n registerPlugins,\n docxtemplaterPlugin,\n type CorePlugin,\n type McpToolDefinition,\n type McpToolHandler,\n type McpToolResult,\n type McpSession,\n} from '@eigenpal/docx-core/core-plugins';\n"]}
|
package/dist/index.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/prosemirror/editor.css"],"sourcesContent":["/**\n * ProseMirror Editor Styles\n *\n * Provides page-like layout similar to Word/Google Docs\n */\n\n/* Outer wrapper - handles scrolling and background */\n.prosemirror-editor-wrapper {\n min-height: 100%;\n /* overflow, background, and padding set via inline styles */\n}\n\n/* Zoom container - sized to match scaled content for proper scrolling */\n.prosemirror-zoom-container {\n /* Width, height, margin set via inline styles based on zoom */\n}\n\n/* Editor container - the transform target */\n.prosemirror-editor {\n /* Transform applied via inline styles for zoom */\n /* CSS variables (--page-width, etc.) set via inline styles */\n /* Width is set to page width so transform scales correctly */\n width: var(--page-width, 8.5in);\n}\n\n/* Editor content area (the actual editable content) */\n.prosemirror-editor .ProseMirror {\n background: white;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n /* Use CSS variables for page layout, with fallbacks */\n width: var(--page-width, 8.5in);\n /* min-height creates a single page appearance */\n min-height: var(--page-height, 11in);\n padding-top: var(--margin-top, 72px);\n padding-bottom: var(--margin-bottom, 72px);\n padding-left: var(--margin-left, 72px);\n padding-right: var(--margin-right, 72px);\n /* Remove max-width constraint - let the page be its natural size */\n outline: none;\n /* Default font - will be overridden by inline styles from DOCX */\n font-family: 'Calibri', 'Arial', sans-serif;\n font-size: 11pt;\n /* DO NOT set line-height here - it overrides inline paragraph styles */\n /* line-height is set per-paragraph via inline styles from paragraphAttrsToDOMStyle */\n color: #000;\n white-space: pre-wrap;\n word-wrap: break-word;\n /* Tab size for proper tab character rendering (0.5 inch = 48px at 96dpi) */\n -o-tab-size: 48;\n tab-size: 48;\n -moz-tab-size: 48;\n /* Ensure box-sizing includes padding in width calculation */\n box-sizing: border-box;\n /* Page break behavior - show page breaks visually */\n position: relative;\n}\n\n/* ============================================================================\n PAGE BREAK STYLES - Visual page boundaries like Word/Google Docs\n ============================================================================ */\n\n/* Page break indicator - inserted by PageBreakPlugin */\n.prosemirror-editor .ProseMirror .docx-page-break {\n display: block;\n position: relative;\n height: 40px;\n margin: 0 calc(-1 * var(--margin-left, 72px));\n margin-right: calc(-1 * var(--margin-right, 72px));\n background: var(--doc-bg);\n border: none;\n pointer-events: none;\n}\n\n/* Top shadow of next page */\n.prosemirror-editor .ProseMirror .docx-page-break::before {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 8px;\n background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.08));\n}\n\n/* Bottom shadow of previous page */\n.prosemirror-editor .ProseMirror .docx-page-break::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 8px;\n background: linear-gradient(to top, transparent, rgba(0, 0, 0, 0.08));\n}\n\n/* Explicit page break (from DOCX pageBreakBefore) */\n.prosemirror-editor .ProseMirror [data-page-break-before='true'] {\n -moz-column-break-before: page;\n break-before: page;\n}\n\n/* Page break dashed line indicator (alternative style) */\n.prosemirror-editor .ProseMirror .docx-page-break-line {\n display: block;\n position: relative;\n height: 1px;\n margin: 20px calc(-1 * var(--margin-left, 72px));\n margin-right: calc(-1 * var(--margin-right, 72px));\n border-top: 1px dashed var(--doc-border);\n}\n\n.prosemirror-editor .ProseMirror .docx-page-break-line::before {\n content: 'Page Break';\n position: absolute;\n top: -10px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--doc-bg);\n padding: 0 8px;\n font-size: 10px;\n color: var(--doc-text-muted);\n white-space: nowrap;\n}\n\n/* Focus state */\n.prosemirror-editor .ProseMirror:focus {\n outline: none;\n}\n\n/* Paragraphs - ensure they display as blocks with proper spacing */\n/* IMPORTANT: Do NOT set margin, line-height, or font here - use inline styles from DOCX */\n.prosemirror-editor .ProseMirror p {\n display: block;\n /* Default margin only when no inline style is set */\n margin: 0;\n padding: 0;\n min-height: 1em;\n white-space: pre-wrap;\n word-wrap: break-word;\n /* Default line height - can be overridden by inline styles */\n line-height: normal;\n}\n\n/* Empty paragraph placeholder */\n.prosemirror-editor .ProseMirror p:empty::before {\n content: '\\00a0';\n}\n\n/* Inline spans for formatting - ensure they don't break layout */\n.prosemirror-editor .ProseMirror span {\n display: inline;\n white-space: pre-wrap;\n}\n\n/* List styles */\n.prosemirror-editor .ProseMirror .docx-list-bullet,\n.prosemirror-editor .ProseMirror .docx-list-numbered {\n position: relative;\n /* Increased padding to accommodate longer markers like \"1.1.1.\" */\n padding-left: 48px;\n}\n\n/* Use the computed marker from DOCX when available */\n.prosemirror-editor .ProseMirror [data-list-marker]::before {\n content: attr(data-list-marker);\n position: absolute;\n /* Position marker at right edge of the marker area so it aligns with content */\n left: 0;\n width: 44px;\n text-align: right;\n white-space: nowrap;\n}\n\n/* Fallback for bullet lists without marker */\n.prosemirror-editor .ProseMirror .docx-list-bullet:not([data-list-marker])::before {\n content: '•';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n/* Fallback for numbered lists without marker - use CSS counters */\n.prosemirror-editor .ProseMirror .docx-list-numbered:not([data-list-marker]) {\n counter-increment: list-counter;\n}\n\n.prosemirror-editor .ProseMirror .docx-list-decimal:not([data-list-marker])::before {\n content: counter(list-counter) '.';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n.prosemirror-editor .ProseMirror .docx-list-lower-roman:not([data-list-marker])::before {\n content: counter(list-counter, lower-roman) '.';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n.prosemirror-editor .ProseMirror .docx-list-upper-roman:not([data-list-marker])::before {\n content: counter(list-counter, upper-roman) '.';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n.prosemirror-editor .ProseMirror .docx-list-lower-alpha:not([data-list-marker])::before {\n content: counter(list-counter, lower-alpha) '.';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n.prosemirror-editor .ProseMirror .docx-list-upper-alpha:not([data-list-marker])::before {\n content: counter(list-counter, upper-alpha) '.';\n position: absolute;\n left: 0;\n width: 44px;\n text-align: right;\n}\n\n/* Reset counter at level 0 for fallback */\n.prosemirror-editor .ProseMirror .docx-list-level-0:not([data-list-marker]):first-of-type {\n counter-reset: list-counter;\n}\n\n/* Indent levels */\n.prosemirror-editor .ProseMirror .docx-list-level-1 {\n margin-left: 0.5in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-2 {\n margin-left: 1in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-3 {\n margin-left: 1.5in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-4 {\n margin-left: 2in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-5 {\n margin-left: 2.5in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-6 {\n margin-left: 3in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-7 {\n margin-left: 3.5in;\n}\n.prosemirror-editor .ProseMirror .docx-list-level-8 {\n margin-left: 4in;\n}\n\n/* Selection styling */\n.prosemirror-editor .ProseMirror ::-moz-selection {\n background: rgba(66, 133, 244, 0.3);\n}\n.prosemirror-editor .ProseMirror ::selection {\n background: rgba(66, 133, 244, 0.3);\n}\n\n/* Placeholder styling */\n.prosemirror-editor[data-placeholder]::before {\n content: attr(data-placeholder);\n color: #aaa;\n position: absolute;\n pointer-events: none;\n}\n\n/* ============================================================================\n IMAGE STYLES - Word-like image rendering\n ============================================================================\n\n DOCX images have three main display modes:\n 1. Inline - flows with text like a character (displayMode='inline')\n 2. Float - text wraps around image (displayMode='float', cssFloat='left'|'right')\n 3. Block - centered on its own line (displayMode='block')\n*/\n\n/* Base image styling - all images */\n.prosemirror-editor .ProseMirror img.docx-image {\n /* IMPORTANT: Override global CSS reset that sets img { display: block } */\n /* Default to inline for inline images - block/float set via inline style */\n display: inline;\n /* Dimensions set via inline styles, but constrain to page */\n max-width: 100%;\n /* Maintain aspect ratio when width-constrained */\n -o-object-fit: contain;\n object-fit: contain;\n /* Vertical alignment for inline images - aligns bottom of image with text baseline */\n vertical-align: baseline;\n /* Prevent selection outline issues */\n outline: none;\n}\n\n/* Floating images - text wraps around */\n.prosemirror-editor .ProseMirror img.docx-image-float {\n /* Float direction set via inline style */\n /* Margins set via inline style based on wrap distances */\n}\n\n/* Left-floated images - text wraps on right side */\n.prosemirror-editor .ProseMirror img.docx-image-float-left {\n clear: left;\n}\n\n/* Right-floated images - text wraps on left side */\n.prosemirror-editor .ProseMirror img.docx-image-float-right {\n clear: right;\n}\n\n/* Block images - centered on their own line */\n.prosemirror-editor .ProseMirror img.docx-image-block {\n /* display:block and margin:auto set via inline style */\n clear: both;\n}\n\n/* Paragraphs containing only a block image: remove text-indent and center */\n.prosemirror-editor .ProseMirror p:has(> img.docx-image-block:only-child) {\n text-indent: 0 !important;\n text-align: center;\n}\n\n/* Clear floats after paragraphs containing floated images */\n.prosemirror-editor .ProseMirror p:has(img.docx-image-float)::after {\n content: '';\n display: table;\n clear: both;\n}\n\n/* Selected image indicator */\n.prosemirror-editor .ProseMirror img.docx-image.ProseMirror-selectednode {\n outline: 2px solid var(--doc-primary, #4285f4);\n outline-offset: 2px;\n cursor: grab;\n}\n\n/* Image dragging state */\n.prosemirror-editor .ProseMirror.pm-image-dragging img.docx-image.ProseMirror-selectednode {\n opacity: 0.4;\n outline: 2px dashed var(--doc-primary, #4285f4);\n cursor: grabbing;\n}\n\n/* Fallback for images without docx-image class */\n.prosemirror-editor .ProseMirror img:not(.docx-image) {\n max-width: 100%;\n height: auto;\n}\n\n/* Shapes */\n.prosemirror-editor .ProseMirror .docx-shape {\n display: inline-block;\n vertical-align: middle;\n line-height: 0;\n cursor: pointer;\n}\n\n.prosemirror-editor .ProseMirror .docx-shape.ProseMirror-selectednode {\n outline: 2px solid var(--doc-primary, #4285f4);\n outline-offset: 2px;\n}\n\n/* Text boxes */\n.prosemirror-editor .ProseMirror .docx-textbox {\n border-radius: 2px;\n margin: 4px 0;\n cursor: text;\n}\n\n.prosemirror-editor .ProseMirror .docx-textbox.ProseMirror-selectednode {\n outline: 2px solid var(--doc-primary, #4285f4);\n outline-offset: 2px;\n}\n\n/* Links */\n.prosemirror-editor .ProseMirror a {\n color: var(--doc-link);\n text-decoration: underline;\n}\n\n.prosemirror-editor .ProseMirror a:hover {\n color: var(--doc-primary-hover);\n}\n\n/* Footnote/Endnote references */\n.prosemirror-editor .ProseMirror .docx-footnote-ref,\n.prosemirror-editor .ProseMirror .docx-endnote-ref {\n color: var(--doc-link, #0066cc);\n cursor: pointer;\n vertical-align: super;\n font-size: smaller;\n}\n\n.prosemirror-editor .ProseMirror .docx-footnote-ref:hover,\n.prosemirror-editor .ProseMirror .docx-endnote-ref:hover {\n text-decoration: underline;\n}\n\n/* Horizontal rule */\n.prosemirror-editor .ProseMirror hr {\n border: none;\n border-top: 1px solid #000;\n margin: 12pt 0;\n height: 0;\n}\n\n/* ============================================================================\n TABLE STYLES\n ============================================================================ */\n\n/* Table container */\n.prosemirror-editor .ProseMirror table.docx-table {\n border-collapse: collapse;\n margin: 12pt 0;\n /* Constrain table to fit within the page - prevent overflow */\n max-width: 100%;\n}\n\n/* Table cells */\n.prosemirror-editor .ProseMirror td.docx-table-cell,\n.prosemirror-editor .ProseMirror th.docx-table-header {\n /* Borders are set via inline styles from DOCX - no default border here */\n /* to avoid conflicting with per-side border styling */\n padding: 4px 8px;\n vertical-align: top;\n min-width: 30px;\n /* Text wrapping handled via inline styles based on noWrap attribute */\n}\n\n/* Table header cells - styling comes from inline styles, not CSS defaults */\n.prosemirror-editor .ProseMirror th.docx-table-header {\n font-weight: bold;\n text-align: left;\n}\n\n/* Cell content - paragraphs inside cells */\n.prosemirror-editor .ProseMirror td p,\n.prosemirror-editor .ProseMirror th p {\n margin: 0;\n padding: 0;\n min-height: auto;\n}\n\n/* First paragraph in cell shouldn't have top margin */\n.prosemirror-editor .ProseMirror td p:first-child,\n.prosemirror-editor .ProseMirror th p:first-child {\n margin-top: 0;\n}\n\n/* Last paragraph in cell shouldn't have bottom margin */\n.prosemirror-editor .ProseMirror td p:last-child,\n.prosemirror-editor .ProseMirror th p:last-child {\n margin-bottom: 0;\n}\n\n/* Active cell (cursor is inside this cell) — subtle outline so user knows which cell will be affected */\n.prosemirror-editor .ProseMirror .activeCell {\n outline: 2px solid rgba(66, 133, 244, 0.5);\n outline-offset: -2px;\n}\n\n/* Selected cell highlight (multi-cell CellSelection) */\n.prosemirror-editor .ProseMirror .selectedCell {\n background-color: rgba(66, 133, 244, 0.15);\n}\n\n/* Table selection */\n.prosemirror-editor .ProseMirror .selectedCell::after {\n content: '';\n position: absolute;\n inset: 0;\n background: rgba(66, 133, 244, 0.1);\n pointer-events: none;\n}\n\n/* Nested tables */\n.prosemirror-editor .ProseMirror table table {\n margin: 4px 0;\n}\n\n/* ============================================================================\n TABLE COLUMN RESIZE\n ============================================================================ */\n\n/* Column resize handle - visible on hover */\n.prosemirror-editor .ProseMirror .column-resize-handle {\n position: absolute;\n right: -2px;\n top: 0;\n bottom: 0;\n width: 4px;\n background-color: rgba(66, 133, 244, 0.5);\n cursor: col-resize;\n z-index: 20;\n}\n\n/* Make cells position relative for resize handle positioning */\n.prosemirror-editor .ProseMirror td.docx-table-cell,\n.prosemirror-editor .ProseMirror th.docx-table-header {\n position: relative;\n}\n\n/* Cursor change when resizing */\n.prosemirror-editor .ProseMirror.resize-cursor {\n cursor: col-resize;\n}\n\n/* Hide resize handle when not hovering the table, show on hover */\n.prosemirror-editor .ProseMirror table:not(:hover) .column-resize-handle {\n background-color: transparent;\n}\n\n.prosemirror-editor .ProseMirror table:hover .column-resize-handle {\n background-color: rgba(66, 133, 244, 0.3);\n}\n\n/* Highlight resize handle on direct hover */\n.prosemirror-editor .ProseMirror .column-resize-handle:hover {\n background-color: rgba(66, 133, 244, 0.7);\n}\n\n/* ============================================================================\n TAB STYLES\n ============================================================================ */\n\n/* Tab character - renders as inline block with minimum width */\n.prosemirror-editor .ProseMirror span.docx-tab {\n display: inline-block;\n min-width: 48px; /* 0.5 inch default tab stop */\n white-space: pre;\n /* Align to tab grid using CSS */\n background: transparent;\n}\n\n/* Tab leader styles (for future enhancement) */\n.prosemirror-editor .ProseMirror span.docx-tab[data-leader='dot']::before {\n content: '...........';\n position: absolute;\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.prosemirror-editor .ProseMirror span.docx-tab[data-leader='hyphen']::before {\n content: '-----------';\n position: absolute;\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.prosemirror-editor .ProseMirror span.docx-tab[data-leader='underscore']::before {\n content: '___________';\n position: absolute;\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n}\n\n/* ============================================================================\n TEXT TRANSFORM STYLES - All caps, small caps\n ============================================================================ */\n\n/* All caps (w:caps) - transforms text to uppercase */\n.prosemirror-editor .ProseMirror .docx-run-all-caps {\n text-transform: uppercase;\n}\n\n/* Small caps (w:smallCaps) - displays lowercase as smaller capitals */\n.prosemirror-editor .ProseMirror .docx-run-small-caps {\n font-variant: small-caps;\n}\n\n/* Section break indicator */\n.docx-section-break {\n position: relative;\n}\n.docx-section-break::after {\n content: 'Section Break (' attr(data-section-break) ')';\n display: block;\n text-align: center;\n font-size: 9px;\n color: var(--doc-text-muted, #9ca3af);\n border-top: 1px dashed var(--doc-border, #d1d5db);\n margin-top: 4px;\n padding-top: 2px;\n pointer-events: none;\n}\n\n/* ============================================================================\n IMAGE DROP INDICATOR - Shows where a dragged image will land\n ============================================================================ */\n\n/* Custom drop indicator (from ImageDragExtension) */\n.prosemirror-editor .ProseMirror .pm-drop-indicator {\n position: absolute;\n width: 2px;\n background: var(--doc-primary, #4285f4);\n pointer-events: none;\n z-index: 50;\n}\n\n/* prosemirror-dropcursor styling */\n.prosemirror-editor .ProseMirror .ProseMirror-dropcursor {\n z-index: 50;\n}\n\n/* Page content area — show text cursor when hovering over editable content */\n.layout-page-content {\n cursor: text;\n}\n\n/* Header/footer areas — double-click hint */\n.layout-page-header,\n.layout-page-footer {\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n.layout-page-header:hover,\n.layout-page-footer:hover {\n background-color: rgba(37, 99, 235, 0.06);\n}\n/* Show \"Double-click to edit\" hint on hover when area is empty */\n.layout-page-header:empty:hover::after {\n content: 'Double-click to add header';\n display: block;\n text-align: center;\n color: #9ca3af;\n font-size: 11px;\n padding: 4px 0;\n}\n.layout-page-footer:empty:hover::after {\n content: 'Double-click to add footer';\n display: block;\n text-align: center;\n color: #9ca3af;\n font-size: 11px;\n padding: 4px 0;\n}\n\n/* Header/footer editor ProseMirror styles */\n.hf-editor-pm .ProseMirror {\n outline: none;\n min-height: 40px;\n padding: 4px;\n}\n.hf-editor-pm .ProseMirror:focus {\n outline: none;\n}\n.hf-editor-pm .ProseMirror p {\n display: block;\n margin: 0;\n padding: 0;\n min-height: 1em;\n white-space: pre-wrap;\n word-wrap: break-word;\n line-height: normal;\n}\n\n/* ============================================================================\n INLINE HEADER/FOOTER EDITING — Dim body, separator bar, dotted borders\n ============================================================================ */\n\n/* Dim body content when editing header/footer */\n.paged-editor--hf-editing .layout-page-content {\n opacity: 0.4;\n pointer-events: none;\n transition: opacity 0.15s ease;\n}\n\n/* Dotted border on active header area */\n.paged-editor--editing-header .layout-page-header {\n border-bottom: 1px dotted #4285f4;\n}\n\n/* Dotted border on active footer area */\n.paged-editor--editing-footer .layout-page-footer {\n border-top: 1px dotted #4285f4;\n}\n\n/* Hide the original layout-painter content in the area being edited */\n.paged-editor--editing-header .layout-page-header > * {\n visibility: hidden;\n}\n.paged-editor--editing-footer .layout-page-footer > * {\n visibility: hidden;\n}\n\n/* Remove hover effect on header/footer when in editing mode */\n.paged-editor--hf-editing .layout-page-header:hover,\n.paged-editor--hf-editing .layout-page-footer:hover {\n background-color: transparent;\n}\n"],"mappings":"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","names":[]}
|