@eigenpal/docx-js-editor 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
  2. package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
  3. package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
  4. package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
  5. package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
  6. package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
  7. package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
  8. package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
  9. package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
  10. package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
  11. package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
  12. package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
  13. package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
  14. package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
  15. package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
  16. package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
  17. package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
  18. package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
  19. package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
  20. package/dist/chunk-2Y6FLZ5Q.js +3 -0
  21. package/dist/chunk-32HMU2UV.js +111 -0
  22. package/dist/chunk-4CUGBNL2.cjs +1 -0
  23. package/dist/chunk-5GFXHUMP.js +1 -0
  24. package/dist/chunk-6NDMKJIE.js +9 -0
  25. package/dist/chunk-6NYA53QC.cjs +258 -0
  26. package/dist/chunk-7KJ3YVDQ.js +10 -0
  27. package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
  28. package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
  29. package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
  30. package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
  31. package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
  32. package/dist/chunk-EH3NY2DQ.cjs +26 -0
  33. package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
  34. package/dist/chunk-FXJAIFPR.js +59 -0
  35. package/dist/chunk-GICVJSFJ.cjs +9 -0
  36. package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
  37. package/dist/chunk-HT2Z33YM.cjs +111 -0
  38. package/dist/chunk-JRRTZZ72.cjs +1 -0
  39. package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
  40. package/dist/chunk-P3AEZKQO.cjs +3 -0
  41. package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
  42. package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
  43. package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
  44. package/dist/chunk-Q7YYC75E.js +258 -0
  45. package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
  46. package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
  47. package/dist/chunk-USRMBYI6.js +3 -0
  48. package/dist/chunk-UTWPV2I4.js +26 -0
  49. package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
  50. package/dist/chunk-XQNCLN4T.cjs +3 -0
  51. package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
  52. package/dist/chunk-Y6QBJGMO.cjs +59 -0
  53. package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
  54. package/dist/chunk-ZTVQA46Q.js +1 -0
  55. package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
  56. package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
  57. package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
  58. package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
  59. package/dist/core-plugins-reexport.cjs +1 -2
  60. package/dist/core-plugins-reexport.d.cts +4 -4
  61. package/dist/core-plugins-reexport.d.ts +4 -4
  62. package/dist/core-plugins-reexport.js +1 -2
  63. package/dist/core-reexport.cjs +1 -2
  64. package/dist/core-reexport.d.cts +10 -10
  65. package/dist/core-reexport.d.ts +10 -10
  66. package/dist/core-reexport.js +1 -2
  67. package/dist/executor-JGWZ7S6Z.cjs +1 -0
  68. package/dist/executor-L2MVKMXO.js +1 -0
  69. package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
  70. package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
  71. package/dist/headless-reexport.cjs +4 -5
  72. package/dist/headless-reexport.d.cts +7 -7
  73. package/dist/headless-reexport.d.ts +7 -7
  74. package/dist/headless-reexport.js +4 -5
  75. package/dist/index.cjs +6 -7
  76. package/dist/index.css +0 -1
  77. package/dist/index.d.cts +12 -12
  78. package/dist/index.d.ts +12 -12
  79. package/dist/index.js +6 -7
  80. package/dist/lib-GD2QD2JK.js +1 -0
  81. package/dist/lib-HOLGQI5K.cjs +1 -0
  82. package/dist/mcp-reexport.cjs +9 -10
  83. package/dist/mcp-reexport.d.cts +2 -2
  84. package/dist/mcp-reexport.d.ts +2 -2
  85. package/dist/mcp-reexport.js +4 -5
  86. package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
  87. package/dist/processTemplate-BXZKWRQD.cjs +1 -0
  88. package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
  89. package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
  90. package/dist/react.cjs +1 -2
  91. package/dist/react.css +0 -1
  92. package/dist/react.d.cts +5 -5
  93. package/dist/react.d.ts +5 -5
  94. package/dist/react.js +1 -2
  95. package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
  96. package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
  97. package/dist/selectionRects-7QU337P5.cjs +1 -0
  98. package/dist/selectionRects-V5RC2BYX.js +1 -0
  99. package/dist/styles.css +1 -1
  100. package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
  101. package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
  102. package/dist/ui.cjs +1 -2
  103. package/dist/ui.d.cts +32 -85
  104. package/dist/ui.d.ts +32 -85
  105. package/dist/ui.js +1 -2
  106. package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
  107. package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
  108. package/package.json +1 -1
  109. package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
  110. package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
  111. package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
  112. package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
  113. package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
  114. package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
  115. package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
  116. package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
  117. package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
  118. package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
  119. package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
  120. package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
  121. package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
  122. package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
  123. package/dist/chunk-2CHPKB5A.cjs +0 -112
  124. package/dist/chunk-2CHPKB5A.cjs.map +0 -1
  125. package/dist/chunk-2QOEHCBX.js.map +0 -1
  126. package/dist/chunk-4QT5LPBA.cjs.map +0 -1
  127. package/dist/chunk-5DYSI4O4.cjs +0 -60
  128. package/dist/chunk-5DYSI4O4.cjs.map +0 -1
  129. package/dist/chunk-5FJXHXFV.cjs +0 -2
  130. package/dist/chunk-5FJXHXFV.cjs.map +0 -1
  131. package/dist/chunk-6FEWNF6B.js +0 -4
  132. package/dist/chunk-6FEWNF6B.js.map +0 -1
  133. package/dist/chunk-6LF5HZCV.js +0 -10
  134. package/dist/chunk-6LF5HZCV.js.map +0 -1
  135. package/dist/chunk-7JSPKVOW.js.map +0 -1
  136. package/dist/chunk-C33XDRDJ.cjs +0 -28
  137. package/dist/chunk-C33XDRDJ.cjs.map +0 -1
  138. package/dist/chunk-CV5WFE7K.js.map +0 -1
  139. package/dist/chunk-CXJRNISO.js +0 -2
  140. package/dist/chunk-CXJRNISO.js.map +0 -1
  141. package/dist/chunk-DJAEBZ33.cjs.map +0 -1
  142. package/dist/chunk-DP6Q75ZD.js +0 -28
  143. package/dist/chunk-DP6Q75ZD.js.map +0 -1
  144. package/dist/chunk-FDANI5P4.cjs.map +0 -1
  145. package/dist/chunk-FGVGZLBL.js.map +0 -1
  146. package/dist/chunk-GJ4GKSDU.cjs +0 -2
  147. package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
  148. package/dist/chunk-GWBTKVFD.cjs.map +0 -1
  149. package/dist/chunk-JOYPFQW2.js.map +0 -1
  150. package/dist/chunk-L54YNLSE.js +0 -2
  151. package/dist/chunk-L54YNLSE.js.map +0 -1
  152. package/dist/chunk-LPGMLJMO.js +0 -259
  153. package/dist/chunk-LPGMLJMO.js.map +0 -1
  154. package/dist/chunk-M2T6XKT5.js.map +0 -1
  155. package/dist/chunk-OHG7ROFC.js +0 -11
  156. package/dist/chunk-OHG7ROFC.js.map +0 -1
  157. package/dist/chunk-PANKMCFX.cjs +0 -4
  158. package/dist/chunk-PANKMCFX.cjs.map +0 -1
  159. package/dist/chunk-Q6HUGWO6.js.map +0 -1
  160. package/dist/chunk-QDV75OJ4.js +0 -112
  161. package/dist/chunk-QDV75OJ4.js.map +0 -1
  162. package/dist/chunk-QEBO3EQP.cjs.map +0 -1
  163. package/dist/chunk-QVIZ775M.cjs +0 -259
  164. package/dist/chunk-QVIZ775M.cjs.map +0 -1
  165. package/dist/chunk-RMUMR42R.cjs +0 -10
  166. package/dist/chunk-RMUMR42R.cjs.map +0 -1
  167. package/dist/chunk-S26DZVRQ.cjs.map +0 -1
  168. package/dist/chunk-T2HQYRA7.cjs.map +0 -1
  169. package/dist/chunk-ULXNEG66.js +0 -60
  170. package/dist/chunk-ULXNEG66.js.map +0 -1
  171. package/dist/chunk-WD2HTKRR.cjs.map +0 -1
  172. package/dist/chunk-XZNOV52K.cjs.map +0 -1
  173. package/dist/chunk-Y6VCTLCJ.js.map +0 -1
  174. package/dist/core-plugins-reexport.cjs.map +0 -1
  175. package/dist/core-plugins-reexport.js.map +0 -1
  176. package/dist/core-reexport.cjs.map +0 -1
  177. package/dist/core-reexport.js.map +0 -1
  178. package/dist/executor-K5RXUTTR.js +0 -2
  179. package/dist/executor-K5RXUTTR.js.map +0 -1
  180. package/dist/executor-XIPIU3H4.cjs +0 -2
  181. package/dist/executor-XIPIU3H4.cjs.map +0 -1
  182. package/dist/headless-reexport.cjs.map +0 -1
  183. package/dist/headless-reexport.js.map +0 -1
  184. package/dist/index.cjs.map +0 -1
  185. package/dist/index.css.map +0 -1
  186. package/dist/index.js.map +0 -1
  187. package/dist/mcp-reexport.cjs.map +0 -1
  188. package/dist/mcp-reexport.js.map +0 -1
  189. package/dist/processTemplate-G37IM66O.js.map +0 -1
  190. package/dist/processTemplate-RFBGVH7T.cjs +0 -2
  191. package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
  192. package/dist/react.cjs.map +0 -1
  193. package/dist/react.css.map +0 -1
  194. package/dist/react.js.map +0 -1
  195. package/dist/selectionRects-6DU7HN7E.js +0 -2
  196. package/dist/selectionRects-6DU7HN7E.js.map +0 -1
  197. package/dist/selectionRects-YZSC24ZP.cjs +0 -2
  198. package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
  199. package/dist/ui.cjs.map +0 -1
  200. package/dist/ui.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/ui/Select.tsx","../src/components/ui/FontPicker.tsx","../../../node_modules/class-variance-authority/dist/index.mjs","../src/components/ui/Button.tsx","../src/components/ui/Icons.tsx","../src/components/ui/useFixedDropdown.ts","../src/components/ui/FontSizePicker.tsx","../src/components/ui/ColorPicker.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/AlignmentButtons.tsx","../src/components/ui/ListButtons.tsx","../src/components/ui/LineSpacingPicker.tsx","../src/components/ui/StylePicker.tsx","../src/components/ui/ZoomControl.tsx","../src/components/ui/TableBorderPicker.tsx","../src/components/ui/TableBorderColorPicker.tsx","../src/components/ui/TableBorderWidthPicker.tsx","../src/components/ui/TableCellFillPicker.tsx","../src/components/ui/TableMoreDropdown.tsx","../src/components/ui/TableGridInline.tsx","../src/components/ui/MenuDropdown.tsx","../src/components/ui/IconGridDropdown.tsx","../src/components/ui/ImageWrapDropdown.tsx","../src/components/ui/ImageTransformDropdown.tsx","../src/components/toolbarUtils.ts","../src/components/Toolbar.tsx","../src/components/ui/PageNumberIndicator.tsx","../src/components/ui/PageNavigator.tsx","../src/components/ui/HorizontalRuler.tsx","../src/components/ui/TableToolbar.tsx","../../core/src/utils/clipboard.ts"],"names":["cn","inputs","clsx","Select","H","SelectGroup","SelectValue","SelectTrigger","className","children","onMouseDown","props","jsxs","e","jsx","ChevronDownIcon","SelectContent","position","onCloseAutoFocus","SelectLabel","SelectItem","CheckIcon","SelectSeparator","DEFAULT_FONTS","FontPicker","value","onChange","fonts","disabled","placeholder","width","showPreview","displayValue","Je","f","handleValueChange","newValue","font","groupedFonts","groups","category","Fragment","falsyToString","cx","cva","base","config","_config_compoundVariants","variants","defaultVariants","getVariantClassNames","variant","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","acc","param","key","getCompoundVariantClassNames","cvClass","cvClassName","compoundVariantOptions","buttonVariants","Button","io","size","ref","SvgIcon","style","IconUndo","IconRedo","IconPrint","IconBold","IconItalic","IconUnderline","IconStrikethrough","IconSuperscript","IconSubscript","IconLink","IconFormatClear","IconAlignLeft","IconAlignCenter","IconAlignRight","IconAlignJustify","IconLineSpacing","IconListBulleted","IconListNumbered","IconIndentIncrease","IconIndentDecrease","IconTextColor","IconHighlight","IconColorReset","IconDropdown","IconTable","IconTableChart","IconGridOn","IconTableRows","IconViewColumn","IconBorderAll","IconBorderOuter","IconBorderInner","IconBorderClear","IconAdd","IconRemove","IconDelete","IconDeleteSweep","IconMerge","IconSplit","IconDragIndicator","IconImage","IconFormatImageLeft","IconFormatImageRight","IconHorizontalRule","IconFlipToBack","IconFlipToFront","IconOpenWith","IconTune","IconRotateRight","IconRotateLeft","IconSwapHoriz","IconSwapVert","IconShapes","IconFormatPaint","IconExpandMore","IconExpandLess","IconBorderTop","IconBorderBottom","IconBorderLeft","IconBorderRight","IconPadding","IconTextRotationNone","IconWrapText","IconHeight","IconFitWidth","IconSettings","IconBorderColor","IconFormatColorFill","IconVerticalAlignTop","IconVerticalAlignCenter","IconVerticalAlignBottom","IconLineWeight","IconKeyboardArrowUp","IconKeyboardArrowDown","IconKeyboardArrowLeft","IconKeyboardArrowRight","IconMoreVert","IconPageBreak","IconArrowBack","IconCheck","IconClose","IconAddComment","IconComment","IconEditNote","iconMap","MaterialSymbol","name","IconComponent","useFixedDropdown","isOpen","onClose","align","containerRef","useRef","dropdownRef","pos","setPos","useState","useEffect","rect","dropRect","handleClickOutside","target","handleEscape","handleScroll","handleMouseDown","useCallback","dropdownStyle","DEFAULT_SIZES","DEFAULT_MIN_SIZE","DEFAULT_MAX_SIZE","halfPointsToPoints","halfPoints","pointsToHalfPoints","points","getNextSize","currentSize","sizes","maxSize","getPrevSize","minSize","i","FontSizePicker","isEditing","setIsEditing","inputValue","setInputValue","isDropdownOpen","setIsDropdownOpen","inputRef","onCloseDropdown","fixedDropdownStyle","currentValue","handleDecrease","newSize","handleIncrease","handleInputClick","handleInputChange","handleInputBlur","handleInputKeyDown","handleSizeSelect","TEXT_COLORS","HIGHLIGHT_COLORS","PICKER_CONTAINER_STYLE","BUTTON_STYLE","BUTTON_HOVER_STYLE","BUTTON_ACTIVE_STYLE","BUTTON_DISABLED_STYLE","COLOR_INDICATOR_STYLE","COLOR_BAR_STYLE","GRID_STYLE","GRID_CELL_STYLE","GRID_CELL_HOVER_STYLE","GRID_CELL_SELECTED_STYLE","NO_COLOR_CELL_STYLE","NO_COLOR_LINE_STYLE","SECTION_LABEL_STYLE","CUSTOM_COLOR_SECTION_STYLE","CUSTOM_COLOR_INPUT_STYLE","HEX_INPUT_STYLE","APPLY_BUTTON_STYLE","TextColorIcon","HighlightIcon","ColorGrid","colors","selectedColor","onSelect","columns","cellSize","hoveredIndex","setHoveredIndex","gridStyle","color","index","isSelected","isHovered","isNoColor","cellStyle","ColorPicker","type","_theme","title","dropdownWidth","showNoColor","showMoreColors","setIsOpen","setIsHovered","customHex","setCustomHex","defaultColors","useMemo","baseColors","displayColors","resolvedColor","resolveHighlightColor","handleColorSelect","handleCustomColorApply","hex","toggleDropdown","prev","buttonStyle","defaultTitle","TextColorPicker","HighlightColorPicker","Tooltip","content","side","delayMs","Q","setPosition","triggerRef","timeoutRef","handleMouseEnter","x","y","handleMouseLeave","childProps","child","ICON_SIZE","ALIGNMENT_OPTIONS","AlignmentButtons","handleOptionClick","alignment","currentOption","opt","triggerButton","option","isActive","CONTAINER_STYLE","BUTTON_GROUP_STYLE","COMPACT_BUTTON_STYLE","SEPARATOR_STYLE","ListButton","active","onClick","ListButtons","listState","onBulletList","onNumberedList","onIndent","onOutdent","showIndentButtons","compact","hasIndent","getButtonStyle","isBulletList","isNumberedList","canOutdent","createDefaultListState","DEFAULT_OPTIONS","LineSpacingPicker","options","ht","twips","DEFAULT_STYLES","HEADING_COLOR","STYLE_PREVIEW_SIZES","getStylePreviewCSS","css","knownSize","pt","px","StylePicker","styles","styleOptions","gt","defaultStyle","d","a","b","displayName","s","DEFAULT_ZOOM_LEVELS","ZoomControl","levels","displayLabel","bt","matchingLevel","level","zoom","BORDER_PRESETS","TableBorderPicker","onAction","close","handlePreset","action","button","icon","label","QUICK_COLORS","swatchStyle","TableBorderColorPicker","currentColor","setCurrentColor","WIDTH_OPTIONS","TableBorderWidthPicker","handleSelect","thickness","TableCellFillPicker","handleNoColor","menuItemStyles","separatorStyles","sectionLabelStyles","TableMoreDropdown","tableContext","hoveredItem","setHoveredItem","currentJustification","handleAction","menuItem","id","opts","isItemDisabled","icons","CELL_SIZE","CELL_GAP","cellSelectedStyle","labelStyle","TableGridInline","onInsert","gridRows","gridColumns","hoverRows","setHoverRows","hoverCols","setHoverCols","handleCellClick","gridCells","row","col","gridLabel","isSeparator","entry","triggerStyle","triggerOpenStyle","menuItemStyle","menuItemDisabledStyle","separatorStyle","shortcutStyle","submenuPanelStyle","MenuDropdown","items","hoveredSubmenu","setHoveredSubmenu","dropdownPos","setDropdownPos","closeMenu","handleItemClick","item","hasSubmenu","isSubmenuOpen","IconGridDropdown","activeValue","triggerIcon","tooltipContent","ariaLabel","testId","WRAP_OPTIONS","getActiveWrapValue","ctx","ImageWrapDropdown","imageContext","o","TRANSFORM_OPTIONS","ImageTransformDropdown","onTransform","HIGHLIGHT_HEX_TO_NAME","mapHexToHighlightName","normalized","ToolbarButton","ToolbarGroup","ToolbarSeparator","Toolbar","currentFormatting","onFormat","onUndo","onRedo","canUndo","canRedo","enableShortcuts","editorRef","showFontPicker","showFontSizePicker","showTextColorPicker","showHighlightColorPicker","showAlignmentButtons","showListButtons","showLineSpacingPicker","showStylePicker","documentStyles","theme","onPrint","showPrintButton","showZoomControl","onZoomChange","onRefocusEditor","onInsertTable","showTableInsert","onInsertImage","onInsertPageBreak","onInsertTOC","onImageWrapType","onImageTransform","onOpenImageProperties","onTableAction","toolbarRef","handleFormat","handleUndo","handleRedo","handleFontFamilyChange","fontFamily","handleFontSizeChange","sizeInPoints","handleTextColorChange","handleHighlightColorChange","handleAlignmentChange","handleBulletList","handleNumberedList","handleIndent","handleOutdent","handleLineSpacingChange","twipsValue","handleStyleChange","styleId","handleTableInsert","rows","handleTableAction","handleKeyDown","event","editorContainer","toolbarContainer","isInEditor","isInToolbar","handleToolbarMouseDown","handleToolbarMouseUp","activeEl","cols","BASE_STYLE","FLOATING_STYLE","VARIANT_STYLES","POSITION_STYLES","PageNumberIndicator","currentPage","totalPages","floating","showPrefix","formatText","displayText","combinedStyle","handleClick","formatPageOrdinal","page","suffixes","v","createPageFormat","template","current","total","getPageProgress","isFirstPage","isLastPage","calculateVisiblePage","scrollTop","pageHeights","pageGap","accumulatedHeight","pageStart","pageEnd","pageMiddle","calculateScrollToPage","pageNumber","containerHeight","pageHeight","offset","ChevronLeftIcon","ChevronRightIcon","ChevronUpIcon","PAGE_DISPLAY_STYLE","PAGE_DISPLAY_HOVER_STYLE","PageInputPopover","onNavigate","anchorRef","error","setError","popoverRef","handleSubmit","pageNum","handleFirst","handleLast","popoverStyle","inputContainerStyle","inputStyle","goButtonStyle","errorStyle","quickNavStyle","quickButtonStyle","PageNavigator","showButtons","showPopover","setShowPopover","prevHovered","setPrevHovered","nextHovered","setNextHovered","displayHovered","setDisplayHovered","pageDisplayRef","canGoPrev","canGoNext","handlePrev","handleNext","togglePopover","closePopover","handlePopoverNavigate","prevButtonStyle","nextButtonStyle","pageDisplayStyleCombined","parsePageInput","input","trimmed","num","isValidPageNumber","clampPageNumber","getNavigationShortcuts","formatPageRange","start","end","calculateProgress","DEFAULT_PAGE_WIDTH_TWIPS","DEFAULT_MARGIN_TWIPS","TWIPS_PER_INCH","TWIPS_PER_CM","RULER_HEIGHT","RULER_TEXT_COLOR","RULER_TICK_COLOR","MARGIN_ZONE_COLOR","INDENT_COLOR","INDENT_HOVER_COLOR","INDENT_ACTIVE_COLOR","TRI_SIZE","formatValueForTooltip","unit","HorizontalRuler","sectionProps","editable","onLeftMarginChange","onRightMarginChange","onFirstLineIndentChange","showFirstLineIndent","firstLineIndent","hangingIndent","indentLeft","indentRight","onIndentLeftChange","onIndentRightChange","tabStops","onTabStopRemove","dragging","setDragging","hoveredMarker","setHoveredMarker","dragValue","setDragValue","dragPositionPx","setDragPositionPx","rulerRef","pageWidthTwips","leftMarginTwips","rightMarginTwips","contentTwips","pageWidthPx","twipsToPixels","leftMarginPx","rightMarginPx","indentLeftPx","indentRightPx","effectiveFirstLineIndent","firstLineIndentPx","leftIndentPosPx","rightIndentPosPx","firstLinePosPx","handleDragStart","marker","handleDrag","positionTwips","pixelsToTwips","maxMargin","rounded","fromRight","indentFromBase","maxIndent","indentFromMargin","indentFromRight","handleDragEnd","ticks","generateTicks","formatPx","tick","RulerTick","IndentTriangle","tab","TabStopMarker","DragTooltip","direction","positionPx","isDragging","onMouseEnter","onMouseLeave","triHeight","containerStyle","triangleStyle","TAB_SYMBOLS","tabStop","onDoubleClick","eighthInchTwips","totalEighths","twipsPos","pxPos","mmTwips","totalMm","positionToMargin","getRulerDimensions","pw","lm","rm","leftMargin","rightMargin","getMarginInUnits","marginTwips","parseMarginFromUnits","AddRowAboveIcon","AddRowBelowIcon","AddColumnLeftIcon","AddColumnRightIcon","DeleteRowIcon","DeleteColumnIcon","MergeCellsIcon","SplitCellIcon","DeleteTableIcon","TOOLBAR_STYLES","TableToolbarButton","showLabel","shortcut","React","isDeleteAction","showSeparator","TableToolbar","context","showLabels","canDeleteRow","canDeleteColumn","canMerge","canSplit","classNames","createTableContext","table","selection","rowCount","columnCount","getColumnCount","hasMultiCellSelection","currentCell","getCellAt","canSplitCell","maxCols","colCount","cell","rowIndex","columnIndex","currentCol","colspan","createEmptyRow","templateRow","cells","colIndex","templateCell","createEmptyCell","addRow","atIndex","newRows","insertIndex","newRow","deleteRow","_","addColumn","newCells","insertCellIndex","newColumnWidths","templateWidth","deleteColumn","mergeCells","startRow","startCol","endRow","endCol","rowSpan","colSpan","cellColSpan","cellEndCol","splitCell","gridSpan","isVMergeStart","rIndex","rowCell","INTERNAL_CLIPBOARD_TYPE","CLIPBOARD_TYPES","copyRuns","runs","includeFormatting","onError","runsToClipboardContent","writeToClipboard","copyParagraphs","paragraphs","paragraphsToClipboardContent","plainText","getRunText","html","runsToHtml","escapeHtml","internal","getParagraphText","paragraphsToHtml","writeToClipboardFallback","tempDiv","range","result","readFromClipboard","cleanWordFormatting","parseClipboardItems","parseClipboardHtml","handlePasteEvent","clipboardData","fromWord","isWordHtml","fromEditor","isEditorHtml","internalMatch","processedHtml","cleanWordHtml","htmlToRuns","cleaned","plainTextFallback","createTextRun","container","processNode","node","inheritedFormatting","text","element","tagName","formatting","extractFormatting","createBreakRun","textDecoration","sizePx","colorToHex","rgbMatch","r","g","run","paragraph","runToHtml","p","c","sizePt","createClipboardHandlers","onCopy","onCut","onPaste","clipboardOptions","data","isCtrlOrMeta"],"mappings":"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","file":"chunk-PANKMCFX.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\n\n// Simple class name merger using clsx only\n// Removed tailwind-merge to save ~69KB in bundle\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","/**\n * Select Component (Radix UI + Tailwind)\n *\n * A minimal, accessible select dropdown using Radix UI primitives.\n */\n\nimport * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { cn } from '../../lib/utils';\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nfunction SelectTrigger({\n className,\n children,\n onMouseDown,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger\n className={cn(\n 'flex h-8 items-center justify-between gap-1 rounded px-2 py-1',\n 'text-sm text-slate-700 bg-transparent',\n 'hover:bg-slate-100/80 focus:outline-none focus:bg-slate-100/80',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors duration-150',\n '[&>span]:truncate',\n className\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"h-4 w-4 text-slate-400 shrink-0\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n onCloseAutoFocus,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n {/* Wrap in .ep-root so Tailwind scoped utilities apply inside the portal */}\n <div className=\"ep-root\">\n <SelectPrimitive.Content\n className={cn(\n 'relative z-50 max-h-72 min-w-[8rem] overflow-hidden',\n 'rounded-lg border border-slate-200 bg-white shadow-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n onCloseAutoFocus?.(e);\n }}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n onMouseDown={(e) => e.preventDefault()}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </div>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n className={cn('px-2 py-1.5 text-xs font-medium text-slate-500', className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n onMouseDown,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n className={cn(\n 'relative flex w-full cursor-pointer select-none items-center',\n 'rounded px-2 py-1.5 text-sm text-slate-700 outline-none',\n 'hover:bg-slate-100 focus:bg-slate-100',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n onMouseDown?.(e);\n }}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n className={cn('-mx-1 my-1 h-px bg-slate-100', className)}\n {...props}\n />\n );\n}\n\n// Icons\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n};\n","/**\n * Font Picker Component (Radix UI)\n *\n * A dropdown selector for choosing font families using Radix Select.\n */\n\nimport * as React from 'react';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from './Select';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FontOption {\n name: string;\n fontFamily: string;\n category?: 'sans-serif' | 'serif' | 'monospace' | 'other';\n}\n\nexport interface FontPickerProps {\n value?: string;\n onChange?: (fontFamily: string) => void;\n fonts?: FontOption[];\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n width?: number | string;\n showPreview?: boolean;\n}\n\n// ============================================================================\n// DEFAULT FONTS\n// ============================================================================\n\nconst DEFAULT_FONTS: FontOption[] = [\n // Sans-serif\n { name: 'Arial', fontFamily: 'Arial, Helvetica, sans-serif', category: 'sans-serif' },\n { name: 'Calibri', fontFamily: '\"Calibri\", Arial, sans-serif', category: 'sans-serif' },\n { name: 'Helvetica', fontFamily: 'Helvetica, Arial, sans-serif', category: 'sans-serif' },\n { name: 'Verdana', fontFamily: 'Verdana, Geneva, sans-serif', category: 'sans-serif' },\n { name: 'Open Sans', fontFamily: '\"Open Sans\", sans-serif', category: 'sans-serif' },\n { name: 'Roboto', fontFamily: 'Roboto, sans-serif', category: 'sans-serif' },\n // Serif\n { name: 'Times New Roman', fontFamily: '\"Times New Roman\", Times, serif', category: 'serif' },\n { name: 'Georgia', fontFamily: 'Georgia, serif', category: 'serif' },\n { name: 'Cambria', fontFamily: 'Cambria, Georgia, serif', category: 'serif' },\n { name: 'Garamond', fontFamily: 'Garamond, serif', category: 'serif' },\n // Monospace\n { name: 'Courier New', fontFamily: '\"Courier New\", Courier, monospace', category: 'monospace' },\n { name: 'Consolas', fontFamily: 'Consolas, monospace', category: 'monospace' },\n];\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function FontPicker({\n value,\n onChange,\n fonts = DEFAULT_FONTS,\n disabled = false,\n className,\n placeholder = 'Arial',\n width = 120,\n showPreview = true,\n}: FontPickerProps) {\n // Find current font name for display\n const displayValue = React.useMemo(() => {\n if (!value) return placeholder;\n const font = fonts.find(\n (f) => f.fontFamily === value || f.name.toLowerCase() === value.toLowerCase()\n );\n return font?.name || value;\n }, [value, fonts, placeholder]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n const font = fonts.find((f) => f.name === newValue);\n if (font) {\n onChange?.(font.fontFamily);\n }\n },\n [onChange, fonts]\n );\n\n // Group fonts by category\n const groupedFonts = React.useMemo(() => {\n const groups: Record<string, FontOption[]> = {\n 'sans-serif': [],\n serif: [],\n monospace: [],\n other: [],\n };\n fonts.forEach((font) => {\n const category = font.category || 'other';\n groups[category].push(font);\n });\n return groups;\n }, [fonts]);\n\n return (\n <Select value={displayValue} onValueChange={handleValueChange} disabled={disabled}>\n <SelectTrigger\n className={cn('h-8 text-sm', className)}\n style={{ minWidth: typeof width === 'number' ? `${width}px` : width }}\n aria-label=\"Select font family\"\n >\n <SelectValue placeholder={placeholder}>{displayValue}</SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-[300px]\">\n {groupedFonts['sans-serif'].length > 0 && (\n <SelectGroup>\n <SelectLabel>Sans Serif</SelectLabel>\n {groupedFonts['sans-serif'].map((font) => (\n <SelectItem\n key={font.name}\n value={font.name}\n style={showPreview ? { fontFamily: font.fontFamily } : undefined}\n >\n {font.name}\n </SelectItem>\n ))}\n </SelectGroup>\n )}\n {groupedFonts['serif'].length > 0 && (\n <>\n <SelectSeparator />\n <SelectGroup>\n <SelectLabel>Serif</SelectLabel>\n {groupedFonts['serif'].map((font) => (\n <SelectItem\n key={font.name}\n value={font.name}\n style={showPreview ? { fontFamily: font.fontFamily } : undefined}\n >\n {font.name}\n </SelectItem>\n ))}\n </SelectGroup>\n </>\n )}\n {groupedFonts['monospace'].length > 0 && (\n <>\n <SelectSeparator />\n <SelectGroup>\n <SelectLabel>Monospace</SelectLabel>\n {groupedFonts['monospace'].map((font) => (\n <SelectItem\n key={font.name}\n value={font.name}\n style={showPreview ? { fontFamily: font.fontFamily } : undefined}\n >\n {font.name}\n </SelectItem>\n ))}\n </SelectGroup>\n </>\n )}\n </SelectContent>\n </Select>\n );\n}\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-9 w-9',\n 'icon-sm': 'h-8 w-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","/**\n * Inline SVG Icons - Material Symbols\n *\n * Official Material Symbols from Google Fonts, bundled as inline SVGs.\n * Source: https://fonts.google.com/icons\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface IconProps {\n size?: number;\n className?: string;\n style?: CSSProperties;\n}\n\nconst defaultSize = 20;\n\n// SVG wrapper for Material Symbols (viewBox 0 -960 960 960)\nfunction SvgIcon({\n size = defaultSize,\n className = '',\n style,\n children,\n}: IconProps & { children: React.ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 -960 960 960\"\n fill=\"currentColor\"\n className={className}\n style={{ display: 'inline-flex', flexShrink: 0, ...style }}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\n// ============================================================================\n// TOOLBAR ICONS\n// ============================================================================\n\nexport function IconUndo(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M280-200v-80h284q63 0 109.5-40T720-420q0-60-46.5-100T564-560H312l104 104-56 56-200-200 200-200 56 56-104 104h252q97 0 166.5 63T800-420q0 94-69.5 157T564-200H280Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconRedo(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M396-200q-97 0-166.5-63T160-420q0-94 69.5-157T396-640h252L544-744l56-56 200 200-200 200-56-56 104-104H396q-63 0-109.5 40T240-420q0 60 46.5 100T396-280h284v80H396Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconPrint(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M640-640v-120H320v120h-80v-200h480v200h-80Zm-480 80h640-640Zm560 100q17 0 28.5-11.5T760-500q0-17-11.5-28.5T720-540q-17 0-28.5 11.5T680-500q0 17 11.5 28.5T720-460Zm-80 260v-160H320v160h320Zm80 80H240v-160H80v-240q0-51 35-85.5t85-34.5h560q51 0 85.5 34.5T880-520v240H720v160Zm80-240v-160q0-17-11.5-28.5T760-560H200q-17 0-28.5 11.5T160-520v160h80v-80h480v80h80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBold(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconItalic(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconUnderline(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-120v-80h560v80H200Zm123-223q-56-63-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63q-101 0-157-63Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconStrikethrough(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 79t85.5 31q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-340q0 86-61.5 133T486-160ZM80-480v-80h800v80H80Zm402-326q66 0 115.5 32.5T674-674l-88 39q-9-29-33.5-52T484-710q-41 0-68 18.5T386-640h-96q2-69 54.5-117.5T482-806Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSuperscript(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M760-600v-80q0-17 11.5-28.5T800-720h80v-40H760v-40h120q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSubscript(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M760-160v-80q0-17 11.5-28.5T800-280h80v-40H760v-40h120q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconLink(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFormatClear(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m528-546-93-93-121-121h486v120H568l-40 94ZM792-56 460-388l-80 188H249l119-280L56-792l56-56 736 736-56 56Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAlignLeft(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAlignCenter(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAlignRight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAlignJustify(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconLineSpacing(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M240-160 80-320l56-56 64 62v-332l-64 62-56-56 160-160 160 160-56 56-64-62v332l64-62 56 56-160 160Zm240-40v-80h400v80H480Zm0-240v-80h400v80H480Zm0-240v-80h400v80H480Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconListBulleted(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm-56.5-263.5Q120-687 120-720t23.5-56.5Q167-800 200-800t56.5 23.5Q280-753 280-720t-23.5 56.5Q233-640 200-640t-56.5-23.5Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconListNumbered(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-80v-60h100v-30h-60v-60h60v-30H120v-60h120q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80H120Zm0-280v-110q0-17 11.5-28.5T160-510h60v-30H120v-60h120q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconIndentIncrease(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm0 440v-320l160 160-160 160Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconIndentDecrease(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm320-160v-80h400v80H440Zm0-160v-80h400v80H440Zm0-160v-80h400v80H440ZM120-760v-80h720v80H120Zm160 440L120-480l160-160v320Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconTextColor(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M80 0v-160h800V0H80Zm140-280 210-560h100l210 560h-96l-50-144H368l-52 144h-96Zm176-224h168l-82-232h-4l-82 232Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconHighlight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M544-400 440-504 240-304l104 104 200-200Zm-47-161 104 104 199-199-104-104-199 199Zm-84-28 216 216-229 229q-24 24-56 24t-56-24l-2-2-26 26H60l126-126-2-2q-24-24-24-56t24-56l229-229Zm0 0 227-227q24-24 56-24t56 24l104 104q24 24 24 56t-24 56L629-373 413-589Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconColorReset(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M800-436q0 36-8 69t-22 63l-62-60q6-17 9-34.5t3-37.5q0-47-17.5-89T650-600L480-768l-88 86-56-56 144-142 226 222q44 42 69 99.5T800-436Zm-8 380L668-180q-41 29-88 44.5T480-120q-133 0-226.5-92.5T160-436q0-51 16-98t48-90L56-792l56-56 736 736-56 56ZM480-200q36 0 68.5-10t61.5-28L280-566q-21 32-30.5 64t-9.5 66q0 98 70 167t170 69Zm-37-204Zm110-116Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconDropdown(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </SvgIcon>\n );\n}\n\n// ============================================================================\n// TABLE ICONS\n// ============================================================================\n\nexport function IconTable(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm240-240H200v160h240v-160Zm80 0v160h240v-160H520Zm-80-80v-160H200v160h240Zm80 0h240v-160H520v160ZM200-680h560v-80H200v80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconTableChart(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M760-120H200q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120ZM200-640h560v-120H200v120Zm100 80H200v360h100v-360Zm360 0v360h100v-360H660Zm-80 0H380v360h200v-360Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconGridOn(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h133v-133H200v133Zm213 0h134v-133H413v133Zm214 0h133v-133H627v133ZM200-413h133v-134H200v134Zm213 0h134v-134H413v134Zm214 0h133v-134H627v134ZM200-627h133v-133H200v133Zm213 0h134v-133H413v133Zm214 0h133v-133H627v133Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconTableRows(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M760-200v-120H200v120h560Zm0-200v-160H200v160h560Zm0-240v-120H200v120h560ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconViewColumn(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M121-280v-400q0-33 23.5-56.5T201-760h559q33 0 56.5 23.5T840-680v400q0 33-23.5 56.5T760-200H201q-33 0-56.5-23.5T121-280Zm79 0h133v-400H200v400Zm213 0h133v-400H413v400Zm213 0h133v-400H626v400Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderAll(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-720h720v720H120Zm640-80v-240H520v240h240Zm0-560H520v240h240v-240Zm-560 0v240h240v-240H200Zm0 560h240v-240H200v240Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderOuter(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-200h560v-560H200v560Zm-80 80v-720h720v720H120Zm160-320v-80h80v80h-80Zm160 160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderInner(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm320 640v-80h80v80h-80Zm160 0v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-160v-80h80v80h-80Zm-160 0v-80h80v80h-80ZM440-120v-320H120v-80h320v-320h80v320h320v80H520v320h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderClear(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAdd(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-440H200v-80h240v-240h80v240h240v80H520v240h-80v-240Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconRemove(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-440v-80h560v80H200Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconDelete(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconDeleteSweep(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M600-240v-80h160v80H600Zm0-320v-80h280v80H600Zm0 160v-80h240v80H600ZM120-640H80v-80h160v-60h160v60h160v80h-40v360q0 33-23.5 56.5T440-200H200q-33 0-56.5-23.5T120-280v-360Zm80 0v360h240v-360H200Zm0 0v360-360Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconMerge(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m296-160-56-56 200-200v-269L337-582l-57-57 200-200 201 201-57 57-104-104v301L296-160Zm368 1L536-286l57-57 127 128-56 56Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSplit(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-160v-304L240-664v104h-80v-240h240v80H296l224 224v336h-80Zm154-376-58-58 128-126H560v-80h240v240h-80v-104L594-536Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconDragIndicator(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M360-160q-33 0-56.5-23.5T280-240q0-33 23.5-56.5T360-320q33 0 56.5 23.5T440-240q0 33-23.5 56.5T360-160Zm240 0q-33 0-56.5-23.5T520-240q0-33 23.5-56.5T600-320q33 0 56.5 23.5T680-240q0 33-23.5 56.5T600-160ZM360-400q-33 0-56.5-23.5T280-480q0-33 23.5-56.5T360-560q33 0 56.5 23.5T440-480q0 33-23.5 56.5T360-400Zm240 0q-33 0-56.5-23.5T520-480q0-33 23.5-56.5T600-560q33 0 56.5 23.5T680-480q0 33-23.5 56.5T600-400ZM360-640q-33 0-56.5-23.5T280-720q0-33 23.5-56.5T360-800q33 0 56.5 23.5T440-720q0 33-23.5 56.5T360-640Zm240 0q-33 0-56.5-23.5T520-720q0-33 23.5-56.5T600-800q33 0 56.5 23.5T680-720q0 33-23.5 56.5T600-640Z\" />\n </SvgIcon>\n );\n}\n\n// ============================================================================\n// IMAGE TOOLBAR ICONS\n// ============================================================================\n\nexport function IconImage(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFormatImageLeft(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-280v-400h400v400H120Zm80-80h240v-240H200v240Zm-80-400v-80h720v80H120Zm480 160v-80h240v80H600Zm0 160v-80h240v80H600Zm0 160v-80h240v80H600ZM120-120v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFormatImageRight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-280v-400h400v400H440Zm80-80h240v-240H520v240ZM120-120v-80h720v80H120Zm0-160v-80h240v80H120Zm0-160v-80h240v80H120Zm0-160v-80h240v80H120Zm0-160v-80h720v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconHorizontalRule(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M160-440v-80h640v80H160Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFlipToBack(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M200-120q-33 0-56.5-23.5T120-200v-480h80v480h480v80H200Zm160-240v80q-33 0-56.5-23.5T280-360h80Zm-80-80v-80h80v80h-80Zm0-160v-80h80v80h-80Zm80-160h-80q0-33 23.5-56.5T360-840v80Zm80 480v-80h80v80h-80Zm0-480v-80h80v80h-80Zm160 0v-80h80v80h-80Zm0 480v-80h80v80h-80Zm160-480v-80q33 0 56.5 23.5T840-760h-80Zm0 400h80q0 33-23.5 56.5T760-280v-80Zm0-80v-80h80v80h-80Zm0-160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFlipToFront(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M360-280q-33 0-56.5-23.5T280-360v-400q0-33 23.5-56.5T360-840h400q33 0 56.5 23.5T840-760v400q0 33-23.5 56.5T760-280H360Zm0-80h400v-400H360v400ZM200-200v80q-33 0-56.5-23.5T120-200h80Zm-80-80v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 480v-80h80v80h-80Zm160 0v-80h80v80h-80Zm160 0v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconOpenWith(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-80 310-250l57-57 73 73v-166h80v165l72-73 58 58L480-80ZM250-310 80-480l169-169 57 57-72 72h166v80H235l73 72-58 58Zm460 0-57-57 73-73H560v-80h165l-73-72 58-58 170 170-170 170ZM440-560v-166l-73 73-57-57 170-170 170 170-57 57-73-73v166h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconTune(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-120v-240h80v80h320v80H520v80h-80Zm-320-80v-80h240v80H120Zm160-160v-80H120v-80h160v-80h80v240h-80Zm160-80v-80h400v80H440Zm160-160v-240h80v80h160v80H680v80h-80Zm-480-80v-80h400v80H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconRotateRight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M522-80v-82q34-5 66.5-18t61.5-34l56 58q-42 32-88 51.5T522-80Zm-80 0Q304-98 213-199.5T122-438q0-75 28.5-140.5t77-114q48.5-48.5 114-77T482-798h6l-62-62 56-58 160 160-160 160-56-56 64-64h-8q-117 0-198.5 81.5T202-438q0 104 68 182.5T442-162v82Zm322-134-58-56q21-29 34-61.5t18-66.5h82q-5 50-24.5 96T764-214Zm76-264h-82q-5-34-18-66.5T706-606l58-56q32 39 51 86t25 98Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconRotateLeft(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-80q-50-5-96-24.5T256-156l56-58q29 21 61.5 34t66.5 18v82Zm80 0v-82q104-15 172-93.5T760-438q0-117-81.5-198.5T480-718h-8l64 64-56 56-160-160 160-160 56 58-62 62h6q75 0 140.5 28.5t114 77q48.5 48.5 77 114T840-438q0 137-91 238.5T520-80ZM198-214q-32-42-51.5-88T122-398h82q5 34 18 66.5t34 61.5l-58 56Zm-76-264q6-51 25-98t51-86l58 56q-21 29-34 61.5T204-478h-82Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSwapHoriz(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M280-160 80-360l200-200 56 57-103 103h287v80H233l103 103-56 57Zm400-240-56-57 103-103H440v-80h287L624-743l56-57 200 200-200 200Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSwapVert(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M320-440v-287L217-624l-57-56 200-200 200 200-57 56-103-103v287h-80ZM600-80 400-280l57-56 103 103v-287h80v287l103-103 57 56L600-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconShapes(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M600-360ZM320-242q10 1 19.5 1.5t20.5.5q11 0 20.5-.5T400-242v82h400v-400h-82q1-10 1.5-19.5t.5-20.5q0-11-.5-20.5T718-640h82q33 0 56.5 23.5T880-560v400q0 33-23.5 56.5T800-80H400q-33 0-56.5-23.5T320-160v-82Zm40-78q-117 0-198.5-81.5T80-600q0-117 81.5-198.5T360-880q117 0 198.5 81.5T640-600q0 117-81.5 198.5T360-320Zm0-80q83 0 141.5-58.5T560-600q0-83-58.5-141.5T360-800q-83 0-141.5 58.5T160-600q0 83 58.5 141.5T360-400Zm0-200Z\" />\n </SvgIcon>\n );\n}\n\n// ============================================================================\n// TABLE DROPDOWN ICONS\n// ============================================================================\n\nexport function IconFormatPaint(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-80q-33 0-56.5-23.5T360-160v-160H240q-33 0-56.5-23.5T160-400v-280q0-66 47-113t113-47h480v440q0 33-23.5 56.5T720-320H600v160q0 33-23.5 56.5T520-80h-80ZM240-560h480v-200h-40v160h-80v-160h-40v80h-80v-80H320q-33 0-56.5 23.5T240-680v120Zm0 160h480v-80H240v80Zm0 0v-80 80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconExpandMore(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconExpandLess(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m296-345-56-56 240-240 240 240-56 56-184-184-184 184Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderTop(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h720v80H120Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 320v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 480v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 320v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderBottom(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h720v80H120Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 480v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 480v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderLeft(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-720h80v720h-80Zm160 0v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderRight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-320v-80h80v80h-80Zm0-320v-80h80v80h-80Zm160 640v-720h80v720h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconPadding(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M320-600q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm160 0q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm160 0q17 0 28.5-11.5T680-640q0-17-11.5-28.5T640-680q-17 0-28.5 11.5T600-640q0 17 11.5 28.5T640-600ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconTextRotationNone(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M160-200v-80h528l-42-42 56-56 138 138-138 138-56-56 42-42H160Zm116-200 164-440h80l164 440h-76l-38-112H392l-40 112h-76Zm138-176h132l-64-182h-4l-64 182Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconWrapText(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M588-132 440-280l148-148 56 58-50 50h96q29 0 49.5-20.5T760-390q0-29-20.5-49.5T690-460H160v-80h530q63 0 106.5 43.5T840-390q0 63-43.5 106.5T690-240h-96l50 50-56 58ZM160-240v-80h200v80H160Zm0-440v-80h640v80H160Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconHeight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-120 320-280l56-56 64 63v-414l-64 63-56-56 160-160 160 160-56 57-64-64v414l64-63 56 56-160 160Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFitWidth(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-120v-720h80v720h-80Zm640 0v-720h80v720h-80ZM280-440v-80h80v80h-80Zm160 0v-80h80v80h-80Zm160 0v-80h80v80h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconSettings(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconBorderColor(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M80 0v-160h800V0H80Zm160-320h56l312-311-29-29-28-28-311 312v56Zm-80 80v-170l448-447q11-11 25.5-17t30.5-6q16 0 31 6t27 18l55 56q12 11 17.5 26t5.5 31q0 15-5.5 29.5T777-687L330-240H160Zm560-504-56-56 56 56ZM608-631l-29-29-28-28 57 57Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconFormatColorFill(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m247-904 57-56 343 343q23 23 23 57t-23 57L457-313q-23 23-57 23t-57-23L153-503q-23-23-23-57t23-57l190-191-96-96Zm153 153L209-560h382L400-751Zm360 471q-33 0-56.5-23.5T680-360q0-21 12.5-45t27.5-45q9-12 19-25t21-25q11 12 21 25t19 25q15 21 27.5 45t12.5 45q0 33-23.5 56.5T760-280ZM80 0v-160h800V0H80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconVerticalAlignTop(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M160-760v-80h640v80H160Zm280 640v-408L336-424l-56-56 200-200 200 200-56 56-104-104v408h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconVerticalAlignCenter(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-80v-168l-64 64-56-56 160-160 160 160-56 56-64-64v168h-80ZM160-440v-80h640v80H160Zm320-120L320-720l56-56 64 64v-168h80v168l64-64 56 56-160 160Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconVerticalAlignBottom(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M160-120v-80h640v80H160Zm320-160L280-480l56-56 104 104v-408h80v408l104-104 56 56-200 200Z\" />\n </SvgIcon>\n );\n}\n\n// Table toolbar icons\nexport function IconLineWeight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-160v-40h720v40H120Zm0-120v-80h720v80H120Zm0-160v-120h720v120H120Zm0-200v-160h720v160H120Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconKeyboardArrowUp(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-528 296-344l-56-56 240-240 240 240-56 56-184-184Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconKeyboardArrowDown(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconKeyboardArrowLeft(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconKeyboardArrowRight(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconMoreVert(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M480-160q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm0-240q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm0-240q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconPageBreak(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M120-440v-80h160v80H120Zm200 0v-80h160v80H320Zm200 0v-80h160v80H520Zm200 0v-80h120v80H720ZM240-120q-33 0-56.5-23.5T160-200v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-120H240Zm-80-520v-120q0-33 23.5-56.5T240-840h480q33 0 56.5 23.5T800-760v120h-80v-120H240v120h-80Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconArrowBack(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M313-440l224 224-57 56-320-320 320-320 57 56-224 224h487v80H313Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconCheck(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconClose(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconAddComment(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M440-400h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconComment(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M240-400h480v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\" />\n </SvgIcon>\n );\n}\n\nexport function IconEditNote(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M160-400h280v-80H160v80Zm0-160h440v-80H160v80Zm0-160h440v-80H160v80Zm360 360v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q8 9 12.5 20t4.5 22q0 11-4 22.5T863-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z\" />\n </SvgIcon>\n );\n}\n\n// ============================================================================\n// ICON MAP - for MaterialSymbol compatibility\n// ============================================================================\n\nconst iconMap: Record<string, React.ComponentType<IconProps>> = {\n undo: IconUndo,\n redo: IconRedo,\n print: IconPrint,\n format_bold: IconBold,\n format_italic: IconItalic,\n format_underlined: IconUnderline,\n strikethrough_s: IconStrikethrough,\n superscript: IconSuperscript,\n subscript: IconSubscript,\n link: IconLink,\n format_clear: IconFormatClear,\n format_align_left: IconAlignLeft,\n format_align_center: IconAlignCenter,\n format_align_right: IconAlignRight,\n format_align_justify: IconAlignJustify,\n format_line_spacing: IconLineSpacing,\n format_list_bulleted: IconListBulleted,\n format_list_numbered: IconListNumbered,\n format_indent_increase: IconIndentIncrease,\n format_indent_decrease: IconIndentDecrease,\n format_color_text: IconTextColor,\n ink_highlighter: IconHighlight,\n format_color_reset: IconColorReset,\n arrow_drop_down: IconDropdown,\n table: IconTable,\n table_chart: IconTableChart,\n grid_on: IconGridOn,\n table_rows: IconTableRows,\n view_column: IconViewColumn,\n border_all: IconBorderAll,\n border_outer: IconBorderOuter,\n border_inner: IconBorderInner,\n border_clear: IconBorderClear,\n add: IconAdd,\n remove: IconRemove,\n delete: IconDelete,\n delete_sweep: IconDeleteSweep,\n call_merge: IconMerge,\n call_split: IconSplit,\n drag_indicator: IconDragIndicator,\n // Image toolbar\n image: IconImage,\n format_image_left: IconFormatImageLeft,\n format_image_right: IconFormatImageRight,\n horizontal_rule: IconHorizontalRule,\n flip_to_back: IconFlipToBack,\n flip_to_front: IconFlipToFront,\n open_with: IconOpenWith,\n tune: IconTune,\n rotate_right: IconRotateRight,\n rotate_left: IconRotateLeft,\n swap_horiz: IconSwapHoriz,\n swap_vert: IconSwapVert,\n // Shape gallery\n shapes: IconShapes,\n // Table dropdown\n format_paint: IconFormatPaint,\n expand_more: IconExpandMore,\n expand_less: IconExpandLess,\n border_top: IconBorderTop,\n border_bottom: IconBorderBottom,\n border_left: IconBorderLeft,\n border_right: IconBorderRight,\n padding: IconPadding,\n text_rotation_none: IconTextRotationNone,\n wrap_text: IconWrapText,\n height: IconHeight,\n fit_width: IconFitWidth,\n settings: IconSettings,\n border_color: IconBorderColor,\n format_color_fill: IconFormatColorFill,\n vertical_align_top: IconVerticalAlignTop,\n vertical_align_center: IconVerticalAlignCenter,\n vertical_align_bottom: IconVerticalAlignBottom,\n // Table toolbar new icons\n line_weight: IconLineWeight,\n keyboard_arrow_up: IconKeyboardArrowUp,\n keyboard_arrow_down: IconKeyboardArrowDown,\n keyboard_arrow_left: IconKeyboardArrowLeft,\n keyboard_arrow_right: IconKeyboardArrowRight,\n more_vert: IconMoreVert,\n // Page break\n page_break: IconPageBreak,\n // Navigation\n arrow_back: IconArrowBack,\n // Comments sidebar\n check: IconCheck,\n close: IconClose,\n add_comment: IconAddComment,\n comment: IconComment,\n edit_note: IconEditNote,\n};\n\n/**\n * MaterialSymbol-compatible component using inline SVGs\n */\nexport function MaterialSymbol({\n name,\n size = 20,\n className = '',\n style,\n}: {\n name: string;\n size?: number;\n filled?: boolean;\n weight?: number;\n className?: string;\n style?: CSSProperties;\n}) {\n const IconComponent = iconMap[name];\n\n if (!IconComponent) {\n // Fallback: render the name as text (for debugging)\n console.warn(`Icon not found: ${name}`);\n return (\n <span className={className} style={{ fontSize: size, width: size, height: size, ...style }}>\n {name}\n </span>\n );\n }\n\n return <IconComponent size={size} className={className} style={style} />;\n}\n\nexport default MaterialSymbol;\n","/**\n * Hook for toolbar dropdowns that need position:fixed to escape overflow:auto/hidden ancestors.\n *\n * Returns refs and styles for a dropdown that positions itself below its trigger\n * using fixed coordinates (like MenuDropdown), so it isn't clipped by the toolbar's\n * overflow-x-auto container.\n */\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport type { CSSProperties, RefObject } from 'react';\n\ninterface UseFixedDropdownOptions {\n isOpen: boolean;\n onClose: () => void;\n /** 'left' aligns dropdown left edge to trigger, 'right' aligns right edge */\n align?: 'left' | 'right';\n}\n\ninterface UseFixedDropdownReturn {\n containerRef: RefObject<HTMLDivElement | null>;\n dropdownRef: RefObject<HTMLDivElement | null>;\n dropdownStyle: CSSProperties;\n handleMouseDown: (e: React.MouseEvent) => void;\n}\n\nexport function useFixedDropdown({\n isOpen,\n onClose,\n align = 'left',\n}: UseFixedDropdownOptions): UseFixedDropdownReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n // Calculate position when opening\n useEffect(() => {\n if (!isOpen || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n if (align === 'right') {\n // We need the dropdown width to right-align, but it's not rendered yet.\n // Use a rAF to measure after first paint.\n requestAnimationFrame(() => {\n if (dropdownRef.current) {\n const dropRect = dropdownRef.current.getBoundingClientRect();\n setPos({ top: rect.bottom + 4, left: rect.right - dropRect.width });\n } else {\n setPos({ top: rect.bottom + 4, left: rect.left });\n }\n });\n } else {\n setPos({ top: rect.bottom + 4, left: rect.left });\n }\n }, [isOpen, align]);\n\n // Close on outside click, escape, scroll\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n containerRef.current &&\n !containerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n onClose();\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n\n const handleScroll = () => onClose();\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n window.addEventListener('scroll', handleScroll, true);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, onClose]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const dropdownStyle: CSSProperties = {\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n zIndex: 10000,\n };\n\n return { containerRef, dropdownRef, dropdownStyle, handleMouseDown };\n}\n","/**\n * Font Size Picker Component (Google Docs Style)\n *\n * A font size control with minus/plus buttons and editable input.\n * Features:\n * - Minus button to decrease font size\n * - Plus button to increase font size\n * - Editable input for custom sizes\n * - Click input to show dropdown with preset sizes\n */\n\nimport * as React from 'react';\nimport { useState, useCallback, useRef } from 'react';\nimport { Button } from './Button';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport { useFixedDropdown } from './useFixedDropdown';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FontSizePickerProps {\n value?: number;\n onChange?: (size: number) => void;\n sizes?: number[];\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n width?: number | string;\n minSize?: number;\n maxSize?: number;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_SIZES: number[] = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 36, 48, 72];\nconst DEFAULT_MIN_SIZE = 1;\nconst DEFAULT_MAX_SIZE = 400;\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Convert half-points to points (OOXML uses half-points for font sizes)\n */\nexport function halfPointsToPoints(halfPoints: number): number {\n return halfPoints / 2;\n}\n\n/**\n * Convert points to half-points\n */\nexport function pointsToHalfPoints(points: number): number {\n return points * 2;\n}\n\n/**\n * Find the next size in the preset list (going up)\n */\nfunction getNextSize(currentSize: number, sizes: number[], maxSize: number): number {\n for (const size of sizes) {\n if (size > currentSize) {\n return size;\n }\n }\n // If current size is beyond preset list, increment by 1\n return Math.min(currentSize + 1, maxSize);\n}\n\n/**\n * Find the previous size in the preset list (going down)\n */\nfunction getPrevSize(currentSize: number, sizes: number[], minSize: number): number {\n for (let i = sizes.length - 1; i >= 0; i--) {\n if (sizes[i] < currentSize) {\n return sizes[i];\n }\n }\n // If current size is below preset list, decrement by 1\n return Math.max(currentSize - 1, minSize);\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function FontSizePicker({\n value,\n onChange,\n sizes = DEFAULT_SIZES,\n disabled = false,\n className,\n placeholder = '11',\n minSize = DEFAULT_MIN_SIZE,\n maxSize = DEFAULT_MAX_SIZE,\n}: FontSizePickerProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onCloseDropdown = useCallback(() => {\n setIsDropdownOpen(false);\n setIsEditing(false);\n }, []);\n const {\n containerRef,\n dropdownRef,\n dropdownStyle: fixedDropdownStyle,\n } = useFixedDropdown({\n isOpen: isDropdownOpen,\n onClose: onCloseDropdown,\n });\n\n const currentValue = value ?? (parseInt(placeholder, 10) || 11);\n const displayValue = value !== undefined ? value.toString() : placeholder;\n\n // Handle decrease font size\n const handleDecrease = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (disabled) return;\n const newSize = getPrevSize(currentValue, sizes, minSize);\n onChange?.(newSize);\n },\n [currentValue, sizes, minSize, disabled, onChange]\n );\n\n // Handle increase font size\n const handleIncrease = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (disabled) return;\n const newSize = getNextSize(currentValue, sizes, maxSize);\n onChange?.(newSize);\n },\n [currentValue, sizes, maxSize, disabled, onChange]\n );\n\n // Handle input click - start editing\n const handleInputClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (disabled) return;\n setIsEditing(true);\n setInputValue(displayValue);\n setIsDropdownOpen(true);\n // Focus input after state update\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n });\n },\n [disabled, displayValue]\n );\n\n // Handle input change\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n }, []);\n\n // Handle input blur - commit change\n const handleInputBlur = useCallback(() => {\n setIsEditing(false);\n const size = parseInt(inputValue, 10);\n if (!isNaN(size) && size >= minSize && size <= maxSize) {\n onChange?.(size);\n }\n }, [inputValue, minSize, maxSize, onChange]);\n\n // Handle input keydown\n const handleInputKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleInputBlur();\n setIsDropdownOpen(false);\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setIsDropdownOpen(false);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const newSize = getNextSize(currentValue, sizes, maxSize);\n setInputValue(newSize.toString());\n onChange?.(newSize);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n const newSize = getPrevSize(currentValue, sizes, minSize);\n setInputValue(newSize.toString());\n onChange?.(newSize);\n }\n },\n [handleInputBlur, currentValue, sizes, maxSize, minSize, onChange]\n );\n\n // Handle dropdown item click\n const handleSizeSelect = useCallback(\n (size: number) => {\n onChange?.(size);\n setIsDropdownOpen(false);\n setIsEditing(false);\n },\n [onChange]\n );\n\n // Prevent mousedown from stealing focus\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // Allow input to receive focus\n if ((e.target as HTMLElement).tagName !== 'INPUT') {\n e.preventDefault();\n }\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={cn('flex items-center', className)}\n onMouseDown={handleMouseDown}\n >\n {/* Decrease button */}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'h-7 w-7 text-slate-500 hover:text-slate-900 hover:bg-slate-100/80 rounded-r-none',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleDecrease}\n disabled={disabled || currentValue <= minSize}\n aria-label=\"Decrease font size\"\n data-testid=\"font-size-decrease\"\n >\n <MaterialSymbol name=\"remove\" size={18} />\n </Button>\n\n {/* Font size input/display */}\n <div className=\"relative\">\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n className={cn(\n 'h-7 w-10 text-center text-sm border border-slate-300 bg-white',\n 'focus:outline-none focus:ring-1 focus:ring-slate-400',\n 'rounded-none'\n )}\n aria-label=\"Font size\"\n data-testid=\"font-size-input\"\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleInputClick}\n className={cn(\n 'h-7 w-10 text-center text-sm border border-slate-200 bg-white',\n 'hover:border-slate-300 hover:bg-slate-50',\n 'focus:outline-none focus:ring-1 focus:ring-slate-400',\n 'rounded-none',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n disabled={disabled}\n aria-label=\"Font size\"\n aria-haspopup=\"listbox\"\n aria-expanded={isDropdownOpen}\n data-testid=\"font-size-display\"\n >\n {displayValue}\n </button>\n )}\n </div>\n\n {/* Dropdown */}\n {isDropdownOpen && (\n <div\n ref={dropdownRef}\n style={{\n ...fixedDropdownStyle,\n backgroundColor: 'white',\n border: '1px solid #e2e8f0',\n borderRadius: 6,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.12)',\n maxHeight: 240,\n overflowY: 'auto',\n minWidth: 60,\n }}\n role=\"listbox\"\n aria-label=\"Font sizes\"\n >\n {sizes.map((size) => (\n <button\n key={size}\n type=\"button\"\n onClick={() => handleSizeSelect(size)}\n className={cn(\n 'w-full px-3 py-1.5 text-sm text-left',\n 'hover:bg-slate-100',\n size === currentValue && 'bg-slate-100 font-medium'\n )}\n role=\"option\"\n aria-selected={size === currentValue}\n >\n {size}\n </button>\n ))}\n </div>\n )}\n\n {/* Increase button */}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'h-7 w-7 text-slate-500 hover:text-slate-900 hover:bg-slate-100/80 rounded-l-none',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleIncrease}\n disabled={disabled || currentValue >= maxSize}\n aria-label=\"Increase font size\"\n data-testid=\"font-size-increase\"\n >\n <MaterialSymbol name=\"add\" size={18} />\n </Button>\n </div>\n );\n}\n","/**\n * Color Picker Component\n *\n * A color picker for the DOCX editor supporting:\n * - Grid of common colors\n * - Text color button (foreground)\n * - Highlight color button (background)\n * - Shows current color of selection\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ColorValue, Theme } from '@eigenpal/docx-core/types/document';\nimport { resolveHighlightColor } from '@eigenpal/docx-core/utils/colorResolver';\nimport { useFixedDropdown } from './useFixedDropdown';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Color option for the color grid\n */\nexport interface ColorOption {\n /** Display name for the color */\n name: string;\n /** Hex value (without #) */\n hex: string;\n /** Is this a theme color? */\n isTheme?: boolean;\n /** Theme color slot if applicable */\n themeSlot?: string;\n}\n\n/**\n * Props for the ColorPicker component\n */\nexport interface ColorPickerProps {\n /** Current color value */\n value?: string;\n /** Callback when color is selected */\n onChange?: (color: string) => void;\n /** Type of color picker */\n type?: 'text' | 'highlight';\n /** Theme for resolving theme colors */\n theme?: Theme | null;\n /** Custom colors to display */\n colors?: ColorOption[];\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Placeholder/tooltip text */\n title?: string;\n /** Custom button content */\n children?: ReactNode;\n /** Width of the dropdown */\n dropdownWidth?: number;\n /** Show \"No Color\" option */\n showNoColor?: boolean;\n /** Show \"More Colors\" option for custom input */\n showMoreColors?: boolean;\n}\n\n/**\n * Props for the ColorGrid component\n */\nexport interface ColorGridProps {\n /** Colors to display in the grid */\n colors: ColorOption[];\n /** Currently selected color (hex) */\n selectedColor?: string;\n /** Callback when a color is clicked */\n onSelect: (color: ColorOption) => void;\n /** Number of columns in the grid */\n columns?: number;\n /** Cell size in pixels */\n cellSize?: number;\n}\n\n// ============================================================================\n// DEFAULT COLORS\n// ============================================================================\n\n/**\n * Standard Word text colors\n */\nconst TEXT_COLORS: ColorOption[] = [\n // Row 1: Theme colors (would be resolved from theme)\n { name: 'Black', hex: '000000' },\n { name: 'Dark Red', hex: '7F0000' },\n { name: 'Dark Orange', hex: 'FF6600' },\n { name: 'Dark Yellow', hex: '808000' },\n { name: 'Dark Green', hex: '006400' },\n { name: 'Dark Teal', hex: '008080' },\n { name: 'Dark Blue', hex: '000080' },\n { name: 'Dark Purple', hex: '4B0082' },\n { name: 'Dark Gray', hex: '404040' },\n { name: 'Gray', hex: '808080' },\n\n // Row 2: Standard colors\n { name: 'Red', hex: 'FF0000' },\n { name: 'Orange', hex: 'FF9900' },\n { name: 'Yellow', hex: 'FFFF00' },\n { name: 'Light Green', hex: '00FF00' },\n { name: 'Cyan', hex: '00FFFF' },\n { name: 'Light Blue', hex: '0066FF' },\n { name: 'Blue', hex: '0000FF' },\n { name: 'Purple', hex: '9900FF' },\n { name: 'Magenta', hex: 'FF00FF' },\n { name: 'Pink', hex: 'FF66FF' },\n\n // Row 3: Tints\n { name: 'Light Red', hex: 'FFCCCC' },\n { name: 'Light Orange', hex: 'FFE5CC' },\n { name: 'Light Yellow', hex: 'FFFFCC' },\n { name: 'Pale Green', hex: 'CCFFCC' },\n { name: 'Light Cyan', hex: 'CCFFFF' },\n { name: 'Sky Blue', hex: 'CCE5FF' },\n { name: 'Light Blue 2', hex: 'CCCCFF' },\n { name: 'Lavender', hex: 'E5CCFF' },\n { name: 'Light Magenta', hex: 'FFCCFF' },\n { name: 'White', hex: 'FFFFFF' },\n];\n\n/**\n * Standard Word highlight colors\n */\nconst HIGHLIGHT_COLORS: ColorOption[] = [\n { name: 'No Color', hex: '' },\n { name: 'Yellow', hex: 'FFFF00' },\n { name: 'Bright Green', hex: '00FF00' },\n { name: 'Cyan', hex: '00FFFF' },\n { name: 'Magenta', hex: 'FF00FF' },\n { name: 'Blue', hex: '0000FF' },\n { name: 'Red', hex: 'FF0000' },\n { name: 'Dark Blue', hex: '00008B' },\n { name: 'Teal', hex: '008080' },\n { name: 'Green', hex: '008000' },\n { name: 'Violet', hex: '800080' },\n { name: 'Dark Red', hex: '8B0000' },\n { name: 'Dark Yellow', hex: '808000' },\n { name: 'Gray 50%', hex: '808080' },\n { name: 'Gray 25%', hex: 'C0C0C0' },\n { name: 'Black', hex: '000000' },\n];\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst PICKER_CONTAINER_STYLE: CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n};\n\nconst BUTTON_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '40px',\n height: '32px',\n padding: '2px 6px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n color: 'var(--doc-text-muted)',\n};\n\nconst BUTTON_HOVER_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n backgroundColor: 'var(--doc-bg-hover)',\n};\n\nconst BUTTON_ACTIVE_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n backgroundColor: 'var(--doc-primary-light)',\n color: 'var(--doc-primary)',\n};\n\nconst BUTTON_DISABLED_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n cursor: 'default',\n opacity: 0.38,\n};\n\nconst COLOR_INDICATOR_STYLE: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0',\n};\n\nconst COLOR_BAR_STYLE: CSSProperties = {\n width: '14px',\n height: '3px',\n borderRadius: '0',\n marginTop: '-2px',\n};\n\nconst GRID_STYLE: CSSProperties = {\n display: 'grid',\n gap: '2px',\n};\n\nconst GRID_CELL_STYLE: CSSProperties = {\n width: '20px',\n height: '20px',\n border: '1px solid #ccc',\n borderRadius: '2px',\n cursor: 'pointer',\n transition: 'transform 0.1s, border-color 0.1s',\n padding: 0,\n};\n\nconst GRID_CELL_HOVER_STYLE: CSSProperties = {\n ...GRID_CELL_STYLE,\n transform: 'scale(1.1)',\n borderColor: '#333',\n zIndex: 1,\n};\n\nconst GRID_CELL_SELECTED_STYLE: CSSProperties = {\n ...GRID_CELL_STYLE,\n borderWidth: '2px',\n borderColor: '#0066cc',\n boxShadow: '0 0 0 1px #0066cc',\n};\n\nconst NO_COLOR_CELL_STYLE: CSSProperties = {\n ...GRID_CELL_STYLE,\n position: 'relative',\n backgroundColor: '#fff',\n};\n\nconst NO_COLOR_LINE_STYLE: CSSProperties = {\n position: 'absolute',\n top: '50%',\n left: '-2px',\n right: '-2px',\n height: '2px',\n backgroundColor: '#ff0000',\n transform: 'rotate(-45deg)',\n};\n\nconst SECTION_LABEL_STYLE: CSSProperties = {\n fontSize: '11px',\n color: '#666',\n marginBottom: '4px',\n marginTop: '8px',\n};\n\nconst CUSTOM_COLOR_SECTION_STYLE: CSSProperties = {\n marginTop: '8px',\n paddingTop: '8px',\n borderTop: '1px solid #eee',\n};\n\nconst CUSTOM_COLOR_INPUT_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n};\n\nconst HEX_INPUT_STYLE: CSSProperties = {\n width: '70px',\n height: '24px',\n padding: '2px 6px',\n border: '1px solid #ccc',\n borderRadius: '3px',\n fontSize: '12px',\n};\n\nconst APPLY_BUTTON_STYLE: CSSProperties = {\n height: '24px',\n padding: '0 8px',\n border: '1px solid #ccc',\n borderRadius: '3px',\n backgroundColor: '#f5f5f5',\n fontSize: '12px',\n cursor: 'pointer',\n};\n\n// ============================================================================\n// ICONS (using Material Symbols)\n// ============================================================================\n\nimport { MaterialSymbol } from './MaterialSymbol';\n\nconst TextColorIcon = () => <MaterialSymbol name=\"format_color_text\" size={18} />;\n\nconst HighlightIcon = () => <MaterialSymbol name=\"ink_highlighter\" size={18} />;\n\nconst ChevronDownIcon = () => <MaterialSymbol name=\"arrow_drop_down\" size={14} />;\n\n// ============================================================================\n// COLOR GRID COMPONENT\n// ============================================================================\n\n/**\n * Color grid for displaying selectable colors\n */\nexport function ColorGrid({\n colors,\n selectedColor,\n onSelect,\n columns = 10,\n cellSize = 20,\n}: ColorGridProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n const gridStyle: CSSProperties = {\n ...GRID_STYLE,\n gridTemplateColumns: `repeat(${columns}, ${cellSize}px)`,\n };\n\n return (\n <div style={gridStyle} className=\"docx-color-grid\" role=\"grid\">\n {colors.map((color, index) => {\n const isSelected = selectedColor?.toUpperCase() === color.hex.toUpperCase();\n const isHovered = hoveredIndex === index;\n const isNoColor = color.hex === '';\n\n const cellStyle: CSSProperties = {\n ...(isSelected\n ? GRID_CELL_SELECTED_STYLE\n : isHovered\n ? GRID_CELL_HOVER_STYLE\n : GRID_CELL_STYLE),\n width: `${cellSize}px`,\n height: `${cellSize}px`,\n };\n\n if (!isNoColor) {\n cellStyle.backgroundColor = `#${color.hex}`;\n }\n\n return (\n <button\n key={`${color.hex}-${index}`}\n type=\"button\"\n style={isNoColor ? { ...NO_COLOR_CELL_STYLE, ...cellStyle } : cellStyle}\n onClick={() => onSelect(color)}\n onMouseDown={(e) => e.preventDefault()} // Prevent focus stealing from editor\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n title={color.name}\n role=\"gridcell\"\n aria-label={color.name}\n aria-selected={isSelected}\n >\n {isNoColor && <span style={NO_COLOR_LINE_STYLE} />}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Color picker component with dropdown grid\n */\nexport function ColorPicker({\n value,\n onChange,\n type = 'text',\n theme: _theme,\n colors,\n disabled = false,\n className,\n style,\n title,\n children,\n dropdownWidth = 230,\n showNoColor = true,\n showMoreColors = true,\n}: ColorPickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [customHex, setCustomHex] = useState('');\n\n const onClose = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle } = useFixedDropdown({\n isOpen,\n onClose,\n });\n\n // Get default colors based on type\n const defaultColors = useMemo(() => {\n if (type === 'highlight') {\n return HIGHLIGHT_COLORS;\n }\n const baseColors = [...TEXT_COLORS];\n if (showNoColor) {\n // Add \"Automatic\" option at the beginning for text color\n baseColors.unshift({ name: 'Automatic', hex: '000000' });\n }\n return baseColors;\n }, [type, showNoColor]);\n\n const displayColors = colors || defaultColors;\n\n // Resolve current color for display\n const resolvedColor = useMemo(() => {\n if (!value) {\n return type === 'text' ? '#000000' : 'transparent';\n }\n // If value is already a hex color\n if (value.startsWith('#')) {\n return value;\n }\n // If it's a highlight color name\n if (type === 'highlight') {\n const resolved = resolveHighlightColor(value);\n return resolved || 'transparent';\n }\n // Otherwise treat as hex without #\n return `#${value}`;\n }, [value, type]);\n\n /**\n * Handle color selection from grid\n */\n const handleColorSelect = useCallback(\n (color: ColorOption) => {\n onChange?.(color.hex);\n setIsOpen(false);\n },\n [onChange]\n );\n\n /**\n * Handle custom color input\n */\n const handleCustomColorApply = useCallback(() => {\n const hex = customHex.replace(/^#/, '').toUpperCase();\n if (/^[0-9A-F]{6}$/i.test(hex)) {\n onChange?.(hex);\n setIsOpen(false);\n setCustomHex('');\n }\n }, [customHex, onChange]);\n\n /**\n * Toggle dropdown\n */\n const toggleDropdown = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n // Determine button style\n const buttonStyle: CSSProperties = disabled\n ? BUTTON_DISABLED_STYLE\n : isOpen\n ? BUTTON_ACTIVE_STYLE\n : isHovered\n ? BUTTON_HOVER_STYLE\n : BUTTON_STYLE;\n\n const defaultTitle = type === 'text' ? 'Font Color' : 'Text Highlight Color';\n\n return (\n <div\n ref={containerRef}\n className={`docx-color-picker docx-color-picker-${type} ${className || ''}`}\n style={{ ...PICKER_CONTAINER_STYLE, ...style }}\n >\n <button\n type=\"button\"\n className=\"docx-color-picker-button\"\n style={buttonStyle}\n onClick={toggleDropdown}\n onMouseDown={(e) => e.preventDefault()} // Prevent focus stealing from editor\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n disabled={disabled}\n title={title || defaultTitle}\n aria-label={title || defaultTitle}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n {children || (\n <div style={COLOR_INDICATOR_STYLE}>\n {type === 'text' ? <TextColorIcon /> : <HighlightIcon />}\n <div\n style={{\n ...COLOR_BAR_STYLE,\n backgroundColor: resolvedColor === 'transparent' ? '#fff' : resolvedColor,\n border: resolvedColor === 'transparent' ? '1px solid #ccc' : 'none',\n }}\n />\n </div>\n )}\n <ChevronDownIcon />\n </button>\n\n {isOpen && (\n <div\n ref={dropdownRef}\n className=\"docx-color-picker-dropdown\"\n style={{\n ...dropdownStyle,\n padding: '8px',\n backgroundColor: '#fff',\n border: '1px solid #ccc',\n borderRadius: '4px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n width: dropdownWidth,\n }}\n role=\"dialog\"\n aria-label={`${type === 'text' ? 'Font' : 'Highlight'} color picker`}\n onMouseDown={(e) => e.preventDefault()} // Prevent focus stealing from editor\n >\n {type === 'highlight' && <div style={SECTION_LABEL_STYLE}>Highlight Colors</div>}\n\n <ColorGrid\n colors={displayColors}\n selectedColor={value}\n onSelect={handleColorSelect}\n columns={type === 'highlight' ? 8 : 10}\n />\n\n {showMoreColors && type === 'text' && (\n <div style={CUSTOM_COLOR_SECTION_STYLE}>\n <div style={SECTION_LABEL_STYLE}>Custom Color</div>\n <div style={CUSTOM_COLOR_INPUT_STYLE}>\n <span style={{ fontSize: '12px', color: '#666' }}>#</span>\n <input\n type=\"text\"\n style={HEX_INPUT_STYLE}\n value={customHex}\n onChange={(e) =>\n setCustomHex(e.target.value.replace(/[^0-9A-Fa-f]/g, '').slice(0, 6))\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleCustomColorApply();\n }\n }}\n placeholder=\"FF0000\"\n maxLength={6}\n aria-label=\"Custom hex color\"\n />\n <button\n type=\"button\"\n style={APPLY_BUTTON_STYLE}\n onClick={handleCustomColorApply}\n disabled={!/^[0-9A-Fa-f]{6}$/.test(customHex)}\n >\n Apply\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// SPECIALIZED COMPONENTS\n// ============================================================================\n\n/**\n * Text color picker (font color)\n */\nexport function TextColorPicker(props: Omit<ColorPickerProps, 'type'>) {\n return <ColorPicker {...props} type=\"text\" />;\n}\n\n/**\n * Highlight color picker (background color)\n */\nexport function HighlightColorPicker(props: Omit<ColorPickerProps, 'type'>) {\n return <ColorPicker {...props} type=\"highlight\" showMoreColors={false} />;\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get default text colors\n */\nexport function getTextColors(): ColorOption[] {\n return [...TEXT_COLORS];\n}\n\n/**\n * Get default highlight colors\n */\nexport function getHighlightColors(): ColorOption[] {\n return [...HIGHLIGHT_COLORS];\n}\n\n/**\n * Create a color option from hex\n */\nexport function createColorOption(hex: string, name?: string): ColorOption {\n const normalizedHex = hex.replace(/^#/, '').toUpperCase();\n return {\n hex: normalizedHex,\n name: name || `#${normalizedHex}`,\n };\n}\n\n/**\n * Check if a color is in the color list\n */\nexport function isColorInList(hex: string, colors: ColorOption[]): boolean {\n const normalizedHex = hex.replace(/^#/, '').toUpperCase();\n return colors.some((c) => c.hex.toUpperCase() === normalizedHex);\n}\n\n/**\n * Get color name from hex\n */\nexport function getColorName(hex: string, colors: ColorOption[] = TEXT_COLORS): string | null {\n const normalizedHex = hex.replace(/^#/, '').toUpperCase();\n const found = colors.find((c) => c.hex.toUpperCase() === normalizedHex);\n return found?.name || null;\n}\n\n/**\n * Parse color value from various formats\n */\nexport function parseColorValue(color: string | ColorValue | undefined | null): string {\n if (!color) return '';\n\n if (typeof color === 'string') {\n return color.replace(/^#/, '').toUpperCase();\n }\n\n if (color.rgb) {\n return color.rgb.toUpperCase();\n }\n\n if (color.themeColor) {\n // Would need theme to resolve, return placeholder\n return '';\n }\n\n return '';\n}\n\n/**\n * Check if a hex color is valid\n */\nexport function isValidHexColor(hex: string): boolean {\n const normalized = hex.replace(/^#/, '');\n return /^[0-9A-Fa-f]{6}$/.test(normalized);\n}\n\n/**\n * Get contrasting text color for a background\n */\nexport function getContrastColor(bgHex: string): string {\n const hex = bgHex.replace(/^#/, '');\n if (hex.length !== 6) return '#000000';\n\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n // Calculate relative luminance\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n return luminance > 0.5 ? '#000000' : '#FFFFFF';\n}\n\n/**\n * Get theme colors for picker\n */\nexport function getThemeColorsForPicker(theme: Theme | null | undefined): ColorOption[] {\n if (!theme?.colorScheme) {\n return [];\n }\n\n const slots: Array<{ slot: string; name: string }> = [\n { slot: 'dk1', name: 'Dark 1' },\n { slot: 'lt1', name: 'Light 1' },\n { slot: 'dk2', name: 'Dark 2' },\n { slot: 'lt2', name: 'Light 2' },\n { slot: 'accent1', name: 'Accent 1' },\n { slot: 'accent2', name: 'Accent 2' },\n { slot: 'accent3', name: 'Accent 3' },\n { slot: 'accent4', name: 'Accent 4' },\n { slot: 'accent5', name: 'Accent 5' },\n { slot: 'accent6', name: 'Accent 6' },\n ];\n\n return slots\n .filter((s) => theme.colorScheme![s.slot as keyof typeof theme.colorScheme])\n .map((s) => ({\n name: s.name,\n hex: theme.colorScheme![s.slot as keyof typeof theme.colorScheme] || '',\n isTheme: true,\n themeSlot: s.slot,\n }));\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ColorPicker;\n","import * as React from 'react';\n\ninterface TooltipProps {\n content: React.ReactNode;\n children: React.ReactElement;\n side?: 'top' | 'bottom' | 'left' | 'right';\n delayMs?: number;\n}\n\nexport function Tooltip({ content, children, side = 'bottom', delayMs = 400 }: TooltipProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [position, setPosition] = React.useState({ x: 0, y: 0 });\n const triggerRef = React.useRef<HTMLElement>(null);\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleMouseEnter = React.useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = side === 'top' ? rect.top - 8 : rect.bottom + 8;\n setPosition({ x, y });\n }\n setIsOpen(true);\n }, delayMs);\n }, [delayMs, side]);\n\n const handleMouseLeave = React.useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsOpen(false);\n }, []);\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n // Type the child props for React 19 compatibility\n type ChildProps = {\n ref?: React.Ref<HTMLElement>;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n };\n const childProps = children.props as ChildProps;\n\n const child = React.cloneElement(children as React.ReactElement<ChildProps>, {\n ref: triggerRef,\n onMouseEnter: (e: React.MouseEvent) => {\n handleMouseEnter();\n childProps.onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n handleMouseLeave();\n childProps.onMouseLeave?.(e);\n },\n });\n\n return (\n <>\n {child}\n {isOpen && (\n <div\n className=\"fixed z-50 px-2 py-1 text-xs font-medium text-white bg-slate-900 rounded-md shadow-lg\"\n style={{\n left: position.x,\n top: position.y,\n transform:\n side === 'top'\n ? 'translate(-50%, -100%)'\n : side === 'bottom'\n ? 'translate(-50%, 0)'\n : undefined,\n }}\n >\n {content}\n </div>\n )}\n </>\n );\n}\n","/**\n * Alignment Dropdown Component (Google Docs style)\n *\n * A single dropdown button for paragraph alignment controls:\n * - Shows current alignment icon + chevron\n * - Opens a floating panel with Left, Center, Right, Justify options\n * - Active option is highlighted\n */\n\nimport React, { useState, useCallback } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ParagraphAlignment } from '@eigenpal/docx-core/types/document';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { cn } from '../../lib/utils';\nimport { useFixedDropdown } from './useFixedDropdown';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Alignment option for the buttons\n */\nexport interface AlignmentOption {\n /** Alignment value */\n value: ParagraphAlignment;\n /** Display label */\n label: string;\n /** Icon to display */\n icon: ReactNode;\n /** Material symbol icon name */\n iconName: string;\n /** Keyboard shortcut hint */\n shortcut?: string;\n}\n\n/**\n * Props for the AlignmentButtons component\n */\nexport interface AlignmentButtonsProps {\n /** Current alignment value */\n value?: ParagraphAlignment;\n /** Callback when alignment is changed */\n onChange?: (alignment: ParagraphAlignment) => void;\n /** Whether the buttons are disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Show labels next to icons */\n showLabels?: boolean;\n /** Compact mode (smaller buttons) */\n compact?: boolean;\n}\n\n/**\n * Props for individual alignment button\n */\nexport interface AlignmentButtonProps {\n /** Whether the button is active/selected */\n active?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Button title/tooltip */\n title?: string;\n /** Click handler */\n onClick?: () => void;\n /** Button content */\n children: ReactNode;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// ICON SIZE CONSTANT\n// ============================================================================\n\nconst ICON_SIZE = 20;\n\n// ============================================================================\n// ALIGNMENT OPTIONS\n// ============================================================================\n\nconst ALIGNMENT_OPTIONS: AlignmentOption[] = [\n {\n value: 'left',\n label: 'Align Left',\n icon: <MaterialSymbol name=\"format_align_left\" size={ICON_SIZE} />,\n iconName: 'format_align_left',\n shortcut: 'Ctrl+L',\n },\n {\n value: 'center',\n label: 'Center',\n icon: <MaterialSymbol name=\"format_align_center\" size={ICON_SIZE} />,\n iconName: 'format_align_center',\n shortcut: 'Ctrl+E',\n },\n {\n value: 'right',\n label: 'Align Right',\n icon: <MaterialSymbol name=\"format_align_right\" size={ICON_SIZE} />,\n iconName: 'format_align_right',\n shortcut: 'Ctrl+R',\n },\n {\n value: 'both',\n label: 'Justify',\n icon: <MaterialSymbol name=\"format_align_justify\" size={ICON_SIZE} />,\n iconName: 'format_align_justify',\n shortcut: 'Ctrl+J',\n },\n];\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Alignment dropdown component — single button with popover panel\n */\nexport function AlignmentButtons({\n value = 'left',\n onChange,\n disabled = false,\n}: AlignmentButtonsProps) {\n const [isOpen, setIsOpen] = useState(false);\n const onClose = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose,\n });\n\n const handleOptionClick = useCallback(\n (alignment: ParagraphAlignment) => {\n if (!disabled) {\n onChange?.(alignment);\n }\n setIsOpen(false);\n },\n [disabled, onChange]\n );\n\n // Find the current alignment option for the trigger icon\n const currentOption =\n ALIGNMENT_OPTIONS.find((opt) => opt.value === value) || ALIGNMENT_OPTIONS[0];\n\n const triggerButton = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label={`${currentOption.label}${currentOption.shortcut ? ` (${currentOption.shortcut})` : ''}`}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid=\"toolbar-alignment\"\n >\n <MaterialSymbol name={currentOption.iconName} size={ICON_SIZE} />\n <MaterialSymbol name=\"arrow_drop_down\" size={14} className=\"-ml-1\" />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? (\n <Tooltip\n content={`${currentOption.label}${currentOption.shortcut ? ` (${currentOption.shortcut})` : ''}`}\n >\n {triggerButton}\n </Tooltip>\n ) : (\n triggerButton\n )}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: 6,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', gap: 2 }}>\n {ALIGNMENT_OPTIONS.map((option) => {\n const isActive = value === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n title={`${option.label}${option.shortcut ? ` (${option.shortcut})` : ''}`}\n data-testid={`alignment-${option.value}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n border: '1px solid transparent',\n borderRadius: 4,\n backgroundColor: isActive ? 'var(--doc-primary-light)' : 'transparent',\n cursor: 'pointer',\n color: isActive ? 'var(--doc-primary)' : 'var(--doc-text)',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n if (!isActive) {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-bg-hover)';\n }\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = isActive\n ? 'var(--doc-primary-light)'\n : 'transparent';\n }}\n onClick={() => handleOptionClick(option.value)}\n >\n <MaterialSymbol name={option.iconName} size={18} />\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get default alignment options\n */\nexport function getAlignmentOptions(): AlignmentOption[] {\n return [...ALIGNMENT_OPTIONS];\n}\n\n/**\n * Check if an alignment value is valid\n */\nexport function isValidAlignment(value: string): value is ParagraphAlignment {\n return ['left', 'center', 'right', 'both', 'distribute'].includes(value);\n}\n\n/**\n * Get alignment label from value\n */\nexport function getAlignmentLabel(value: ParagraphAlignment): string {\n const option = ALIGNMENT_OPTIONS.find((opt) => opt.value === value);\n return option?.label || 'Left';\n}\n\n/**\n * Get alignment icon from value\n */\nexport function getAlignmentIcon(value: ParagraphAlignment): ReactNode {\n const option = ALIGNMENT_OPTIONS.find((opt) => opt.value === value);\n return option?.icon || <MaterialSymbol name=\"format_align_left\" size={ICON_SIZE} />;\n}\n\n/**\n * Get alignment shortcut from value\n */\nexport function getAlignmentShortcut(value: ParagraphAlignment): string | undefined {\n const option = ALIGNMENT_OPTIONS.find((opt) => opt.value === value);\n return option?.shortcut;\n}\n\n/**\n * Get CSS text-align value from OOXML alignment\n */\nexport function alignmentToCss(alignment: ParagraphAlignment): string {\n switch (alignment) {\n case 'left':\n return 'left';\n case 'center':\n return 'center';\n case 'right':\n return 'right';\n case 'both':\n case 'distribute':\n return 'justify';\n default:\n return 'left';\n }\n}\n\n/**\n * Get OOXML alignment value from CSS text-align\n */\nexport function cssToAlignment(textAlign: string): ParagraphAlignment {\n switch (textAlign) {\n case 'left':\n case 'start':\n return 'left';\n case 'center':\n return 'center';\n case 'right':\n case 'end':\n return 'right';\n case 'justify':\n return 'both';\n default:\n return 'left';\n }\n}\n\n/**\n * Cycle to next alignment (left -> center -> right -> justify -> left)\n */\nexport function cycleAlignment(current: ParagraphAlignment): ParagraphAlignment {\n const order: ParagraphAlignment[] = ['left', 'center', 'right', 'both'];\n const currentIndex = order.indexOf(current);\n const nextIndex = (currentIndex + 1) % order.length;\n return order[nextIndex];\n}\n\n/**\n * Handle keyboard shortcut for alignment\n * Returns the alignment if matched, undefined otherwise\n */\nexport function handleAlignmentShortcut(\n event: KeyboardEvent | React.KeyboardEvent\n): ParagraphAlignment | undefined {\n if (!event.ctrlKey && !event.metaKey) {\n return undefined;\n }\n\n const key = event.key.toLowerCase();\n\n switch (key) {\n case 'l':\n return 'left';\n case 'e':\n return 'center';\n case 'r':\n return 'right';\n case 'j':\n return 'both';\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default AlignmentButtons;\n","/**\n * List Buttons Component\n *\n * A component for list formatting controls in the DOCX editor:\n * - Bullet list button\n * - Numbered list button\n * - Toggles list on/off for selection\n * - Indent/outdent for list levels\n */\n\nimport React, { useState, useCallback } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { NumberFormat } from '@eigenpal/docx-core/types/document';\nimport { MaterialSymbol } from './MaterialSymbol';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * List type\n */\nexport type ListType = 'bullet' | 'numbered' | 'none';\n\n/**\n * List state for the current selection\n */\nexport interface ListState {\n /** Type of list (bullet, numbered, or none) */\n type: ListType;\n /** Current list level (0-8) */\n level: number;\n /** Whether the selection is in a list */\n isInList: boolean;\n /** Numbering ID if in a list */\n numId?: number;\n}\n\n/**\n * Props for the ListButtons component\n */\nexport interface ListButtonsProps {\n /** Current list state of the selection */\n listState?: ListState;\n /** Callback when bullet list is toggled */\n onBulletList?: () => void;\n /** Callback when numbered list is toggled */\n onNumberedList?: () => void;\n /** Callback to increase list indent */\n onIndent?: () => void;\n /** Callback to decrease list indent */\n onOutdent?: () => void;\n /** Whether the buttons are disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Show indent/outdent buttons */\n showIndentButtons?: boolean;\n /** Compact mode (smaller buttons) */\n compact?: boolean;\n /** Whether the current paragraph has left indentation (for enabling outdent) */\n hasIndent?: boolean;\n}\n\n/**\n * Props for individual list button\n */\nexport interface ListButtonProps {\n /** Whether the button is active/selected */\n active?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Button title/tooltip */\n title?: string;\n /** Click handler */\n onClick?: () => void;\n /** Button content */\n children: ReactNode;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst CONTAINER_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n};\n\nconst BUTTON_GROUP_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n};\n\nconst BUTTON_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n padding: '4px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n color: 'var(--doc-text-muted)',\n};\n\nconst BUTTON_HOVER_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n backgroundColor: 'var(--doc-bg-hover)',\n};\n\nconst BUTTON_ACTIVE_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n backgroundColor: 'var(--doc-primary-light)',\n color: 'var(--doc-primary)',\n};\n\nconst BUTTON_DISABLED_STYLE: CSSProperties = {\n ...BUTTON_STYLE,\n cursor: 'default',\n opacity: 0.38,\n};\n\nconst COMPACT_BUTTON_STYLE: CSSProperties = {\n width: '28px',\n height: '28px',\n padding: '2px',\n};\n\nconst SEPARATOR_STYLE: CSSProperties = {\n width: '1px',\n height: '20px',\n backgroundColor: 'var(--doc-border)',\n margin: '0 6px',\n};\n\n// ============================================================================\n// ICON SIZE CONSTANT\n// ============================================================================\n\nconst ICON_SIZE = 20;\n\n// ============================================================================\n// LIST BUTTON COMPONENT\n// ============================================================================\n\n/**\n * Individual list button\n */\nexport function ListButton({\n active = false,\n disabled = false,\n title,\n onClick,\n children,\n className,\n style,\n}: ListButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const buttonStyle: CSSProperties = {\n ...(disabled\n ? BUTTON_DISABLED_STYLE\n : active\n ? BUTTON_ACTIVE_STYLE\n : isHovered\n ? BUTTON_HOVER_STYLE\n : BUTTON_STYLE),\n ...style,\n };\n\n // Prevent mousedown from stealing focus/selection from the editor\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n return (\n <button\n type=\"button\"\n className={`docx-list-button ${active ? 'docx-list-button-active' : ''} ${\n disabled ? 'docx-list-button-disabled' : ''\n } ${className || ''}`}\n style={buttonStyle}\n onMouseDown={handleMouseDown}\n onClick={disabled ? undefined : onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n disabled={disabled}\n title={title}\n aria-label={title}\n aria-pressed={active}\n role=\"button\"\n >\n {children}\n </button>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * List buttons component for bullet/numbered list controls\n */\nexport function ListButtons({\n listState,\n onBulletList,\n onNumberedList,\n onIndent,\n onOutdent,\n disabled = false,\n className,\n style,\n showIndentButtons = true,\n compact = false,\n hasIndent = false,\n}: ListButtonsProps) {\n /**\n * Get button style with compact option\n */\n const getButtonStyle = useCallback(\n (): CSSProperties => (compact ? { ...COMPACT_BUTTON_STYLE } : {}),\n [compact]\n );\n\n const isBulletList = listState?.type === 'bullet';\n const isNumberedList = listState?.type === 'numbered';\n const isInList = listState?.isInList || isBulletList || isNumberedList;\n // Can outdent if: in a list with level > 0, OR has paragraph indentation\n const canOutdent = (isInList && (listState?.level ?? 0) > 0) || hasIndent;\n\n return (\n <div\n className={`docx-list-buttons ${className || ''}`}\n style={{ ...CONTAINER_STYLE, ...style }}\n role=\"group\"\n aria-label=\"List formatting\"\n >\n {/* List type buttons */}\n <div style={BUTTON_GROUP_STYLE} role=\"group\" aria-label=\"List type\">\n <ListButton\n active={isBulletList}\n disabled={disabled}\n title=\"Bullet List\"\n onClick={onBulletList}\n style={getButtonStyle()}\n >\n <MaterialSymbol name=\"format_list_bulleted\" size={ICON_SIZE} />\n </ListButton>\n\n <ListButton\n active={isNumberedList}\n disabled={disabled}\n title=\"Numbered List\"\n onClick={onNumberedList}\n style={getButtonStyle()}\n >\n <MaterialSymbol name=\"format_list_numbered\" size={ICON_SIZE} />\n </ListButton>\n </div>\n\n {/* Indent/Outdent buttons */}\n {showIndentButtons && (\n <>\n <div style={SEPARATOR_STYLE} role=\"separator\" />\n <div style={BUTTON_GROUP_STYLE} role=\"group\" aria-label=\"List indentation\">\n <ListButton\n active={false}\n disabled={disabled || !canOutdent}\n title=\"Decrease Indent\"\n onClick={onOutdent}\n style={getButtonStyle()}\n >\n <MaterialSymbol name=\"format_indent_decrease\" size={ICON_SIZE} />\n </ListButton>\n\n <ListButton\n active={false}\n disabled={disabled}\n title=\"Increase Indent\"\n onClick={onIndent}\n style={getButtonStyle()}\n >\n <MaterialSymbol name=\"format_indent_increase\" size={ICON_SIZE} />\n </ListButton>\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Create a default list state (not in a list)\n */\nexport function createDefaultListState(): ListState {\n return {\n type: 'none',\n level: 0,\n isInList: false,\n };\n}\n\n/**\n * Create a bullet list state\n */\nexport function createBulletListState(level: number = 0, numId?: number): ListState {\n return {\n type: 'bullet',\n level,\n isInList: true,\n numId,\n };\n}\n\n/**\n * Create a numbered list state\n */\nexport function createNumberedListState(level: number = 0, numId?: number): ListState {\n return {\n type: 'numbered',\n level,\n isInList: true,\n numId,\n };\n}\n\n/**\n * Check if a list state represents a bullet list\n */\nexport function isBulletListState(state: ListState | undefined): boolean {\n return state?.type === 'bullet';\n}\n\n/**\n * Check if a list state represents a numbered list\n */\nexport function isNumberedListState(state: ListState | undefined): boolean {\n return state?.type === 'numbered';\n}\n\n/**\n * Check if a list state represents any list\n */\nexport function isAnyListState(state: ListState | undefined): boolean {\n return state?.isInList === true;\n}\n\n/**\n * Get the next indent level (max 8)\n */\nexport function getNextIndentLevel(currentLevel: number): number {\n return Math.min(currentLevel + 1, 8);\n}\n\n/**\n * Get the previous indent level (min 0)\n */\nexport function getPreviousIndentLevel(currentLevel: number): number {\n return Math.max(currentLevel - 1, 0);\n}\n\n/**\n * Toggle between list types\n */\nexport function toggleListType(state: ListState | undefined, targetType: ListType): ListState {\n // If already that type, remove list\n if (state?.type === targetType) {\n return createDefaultListState();\n }\n\n // Otherwise, set to the target type (preserving level if coming from another list)\n const level = state?.isInList ? state.level : 0;\n\n if (targetType === 'bullet') {\n return createBulletListState(level);\n } else if (targetType === 'numbered') {\n return createNumberedListState(level);\n } else {\n return createDefaultListState();\n }\n}\n\n/**\n * Get CSS for list indent\n */\nexport function getListIndentCss(level: number): CSSProperties {\n const baseIndent = 36; // ~0.5 inch per level\n return {\n marginLeft: `${baseIndent * (level + 1)}px`,\n textIndent: `-${baseIndent * 0.5}px`,\n };\n}\n\n/**\n * Get default bullet character for a level\n */\nexport function getDefaultBulletForLevel(level: number): string {\n const bullets = ['•', '○', '▪', '•', '○', '▪', '•', '○', '▪'];\n return bullets[level % bullets.length];\n}\n\n/**\n * Get default number format for a level\n */\nexport function getDefaultNumberFormatForLevel(level: number): NumberFormat {\n const formats: NumberFormat[] = [\n 'decimal',\n 'lowerLetter',\n 'lowerRoman',\n 'decimal',\n 'lowerLetter',\n 'lowerRoman',\n 'decimal',\n 'lowerLetter',\n 'lowerRoman',\n ];\n return formats[level % formats.length];\n}\n\n/**\n * Handle keyboard shortcut for list operations\n * Returns the action to perform, or undefined if no match\n */\nexport function handleListShortcut(\n event: KeyboardEvent | React.KeyboardEvent\n): 'bullet' | 'numbered' | 'indent' | 'outdent' | undefined {\n // Tab for indent, Shift+Tab for outdent\n if (event.key === 'Tab') {\n if (event.shiftKey) {\n return 'outdent';\n }\n return 'indent';\n }\n\n // Check for Ctrl/Cmd shortcuts (not commonly used for lists, but some editors support them)\n if (event.ctrlKey || event.metaKey) {\n if (event.shiftKey && event.key.toLowerCase() === 'l') {\n return 'bullet';\n }\n // Note: Ctrl+Shift+L is often bullet in Word-like editors\n }\n\n return undefined;\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default ListButtons;\n","/**\n * Line Spacing Picker Component (Radix UI)\n *\n * A dropdown selector for choosing line spacing values using Radix Select.\n * Styled like Google Docs with options: Single, 1.15, 1.5, Double\n */\n\nimport * as React from 'react';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n} from './Select';\nimport { cn } from '../../lib/utils';\nimport { IconLineSpacing } from './Icons';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface LineSpacingOption {\n label: string;\n value: number;\n twipsValue: number;\n}\n\nexport interface LineSpacingPickerProps {\n value?: number;\n onChange?: (twipsValue: number) => void;\n options?: LineSpacingOption[];\n disabled?: boolean;\n className?: string;\n width?: number | string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Standard line spacing options (Google Docs style)\n * OOXML uses twips for line spacing when lineRule=\"auto\"\n * 240 twips = 1.0 line spacing (single)\n */\nconst DEFAULT_OPTIONS: LineSpacingOption[] = [\n { label: 'Single', value: 1.0, twipsValue: 240 },\n { label: '1.15', value: 1.15, twipsValue: 276 },\n { label: '1.5', value: 1.5, twipsValue: 360 },\n { label: 'Double', value: 2.0, twipsValue: 480 },\n];\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function LineSpacingPicker({\n value,\n onChange,\n options = DEFAULT_OPTIONS,\n disabled = false,\n className,\n}: LineSpacingPickerProps) {\n // Find current option by twips value\n const currentOption = React.useMemo(() => {\n if (value === undefined) return options[0]; // Default to Single\n return options.find((opt) => opt.twipsValue === value) || options[0];\n }, [value, options]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n const twips = parseInt(newValue, 10);\n if (!isNaN(twips)) {\n onChange?.(twips);\n }\n },\n [onChange]\n );\n\n return (\n <Select\n value={currentOption.twipsValue.toString()}\n onValueChange={handleValueChange}\n disabled={disabled}\n >\n <SelectTrigger\n className={cn('h-8 text-sm gap-0.5 px-2', className)}\n style={{ width: 'auto' }}\n title={`Line spacing: ${currentOption.label}`}\n >\n <IconLineSpacing className=\"h-5 w-5 shrink-0\" />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.twipsValue} value={option.twipsValue.toString()}>\n {option.label}\n </SelectItem>\n ))}\n <SelectSeparator />\n <SelectGroup>\n <SelectLabel>Paragraph spacing</SelectLabel>\n </SelectGroup>\n </SelectContent>\n </Select>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\nexport function getDefaultLineSpacingOptions(): LineSpacingOption[] {\n return [...DEFAULT_OPTIONS];\n}\n\nexport function lineSpacingMultiplierToTwips(multiplier: number): number {\n return Math.round(multiplier * 240);\n}\n\nexport function twipsToLineSpacingMultiplier(twips: number): number {\n return twips / 240;\n}\n\nexport function getLineSpacingLabel(twips: number): string {\n const option = DEFAULT_OPTIONS.find((opt) => opt.twipsValue === twips);\n if (option) return option.label;\n const multiplier = twipsToLineSpacingMultiplier(twips);\n return multiplier.toFixed(2).replace(/\\.?0+$/, '');\n}\n\nexport function isStandardLineSpacing(twips: number): boolean {\n return DEFAULT_OPTIONS.some((opt) => opt.twipsValue === twips);\n}\n\nexport function nearestStandardLineSpacing(twips: number): LineSpacingOption {\n let nearest = DEFAULT_OPTIONS[0];\n let minDiff = Math.abs(twips - nearest.twipsValue);\n\n for (const option of DEFAULT_OPTIONS) {\n const diff = Math.abs(twips - option.twipsValue);\n if (diff < minDiff) {\n minDiff = diff;\n nearest = option;\n }\n }\n\n return nearest;\n}\n\nexport function createLineSpacingOption(multiplier: number): LineSpacingOption {\n const twipsValue = lineSpacingMultiplierToTwips(multiplier);\n const label = multiplier.toFixed(2).replace(/\\.?0+$/, '');\n return { label, value: multiplier, twipsValue };\n}\n\nexport default LineSpacingPicker;\n","/**\n * Style Picker Component (Radix UI)\n *\n * A dropdown selector for applying named paragraph styles using Radix Select.\n * Shows each style with its visual appearance (font size, bold, color).\n */\n\nimport * as React from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from './Select';\nimport { cn } from '../../lib/utils';\nimport type { Style, StyleType, Theme } from '@eigenpal/docx-core/types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface StyleOption {\n styleId: string;\n name: string;\n type: StyleType;\n isDefault?: boolean;\n qFormat?: boolean;\n priority?: number;\n /** Font size in half-points for visual preview */\n fontSize?: number;\n /** Bold styling */\n bold?: boolean;\n /** Italic styling */\n italic?: boolean;\n /** Text color (RGB hex) */\n color?: string;\n}\n\nexport interface StylePickerProps {\n value?: string;\n onChange?: (styleId: string) => void;\n styles?: Style[];\n theme?: Theme | null;\n disabled?: boolean;\n className?: string;\n width?: number | string;\n}\n\n// ============================================================================\n// DEFAULT STYLES (matching Google Docs order and appearance)\n// ============================================================================\n\nconst DEFAULT_STYLES: StyleOption[] = [\n {\n styleId: 'Normal',\n name: 'Normal text',\n type: 'paragraph',\n isDefault: true,\n priority: 0,\n qFormat: true,\n fontSize: 22, // 11pt\n },\n {\n styleId: 'Title',\n name: 'Title',\n type: 'paragraph',\n priority: 1,\n qFormat: true,\n fontSize: 52, // 26pt\n bold: true,\n },\n {\n styleId: 'Subtitle',\n name: 'Subtitle',\n type: 'paragraph',\n priority: 2,\n qFormat: true,\n fontSize: 30, // 15pt\n color: '666666', // Gray\n },\n {\n styleId: 'Heading1',\n name: 'Heading 1',\n type: 'paragraph',\n priority: 3,\n qFormat: true,\n fontSize: 40, // 20pt\n bold: true,\n },\n {\n styleId: 'Heading2',\n name: 'Heading 2',\n type: 'paragraph',\n priority: 4,\n qFormat: true,\n fontSize: 32, // 16pt\n bold: true,\n },\n {\n styleId: 'Heading3',\n name: 'Heading 3',\n type: 'paragraph',\n priority: 5,\n qFormat: true,\n fontSize: 28, // 14pt\n bold: true,\n },\n];\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/** Google Docs heading color */\nconst HEADING_COLOR = '#4a6c8c';\n\n/** Preview sizes per style (px), matching Google Docs dropdown appearance */\nconst STYLE_PREVIEW_SIZES: Record<string, number> = {\n Title: 26,\n Subtitle: 18,\n Heading1: 24,\n Heading2: 18,\n Heading3: 16,\n Heading4: 14,\n Heading5: 13,\n Heading6: 13,\n Normal: 14,\n};\n\n/**\n * Get inline styles for a style option's visual preview.\n * Uses hardcoded preview sizes for well-known styles (Title, Heading1, etc.)\n * and derives a clamped size from the style's fontSize for custom styles.\n */\nfunction getStylePreviewCSS(style: StyleOption): React.CSSProperties {\n const css: React.CSSProperties = {};\n\n // Use hardcoded size for well-known styles, otherwise derive from fontSize (half-points → px)\n const knownSize = STYLE_PREVIEW_SIZES[style.styleId];\n if (knownSize) {\n css.fontSize = `${knownSize}px`;\n } else {\n // fontSize is in half-points; convert to pt then clamp for dropdown readability\n const pt = style.fontSize ? style.fontSize / 2 : 11;\n const px = Math.min(Math.max(pt, 11), 20);\n css.fontSize = `${px}px`;\n }\n css.lineHeight = '1.3';\n\n if (style.bold) {\n css.fontWeight = 'bold';\n }\n\n if (style.italic) {\n css.fontStyle = 'italic';\n }\n\n // Use explicit color if provided, otherwise apply heading color for heading styles\n if (style.color) {\n css.color = `#${style.color}`;\n } else if (style.styleId.startsWith('Heading')) {\n css.color = HEADING_COLOR;\n }\n\n return css;\n}\n\nexport function StylePicker({\n value,\n onChange,\n styles,\n disabled = false,\n className,\n width = 120,\n}: StylePickerProps) {\n // Convert document styles to options with visual info\n const styleOptions = React.useMemo(() => {\n if (!styles || styles.length === 0) {\n return DEFAULT_STYLES;\n }\n\n // Show all paragraph styles that are visible:\n // - Not hidden and not semiHidden, OR\n // - Marked as qFormat (quick format / gallery style)\n const docStyles = styles\n .filter((s) => s.type === 'paragraph')\n .filter((s) => {\n if (s.qFormat) return true;\n if (s.hidden || s.semiHidden) return false;\n return true;\n })\n .map((s) => {\n const defaultStyle = DEFAULT_STYLES.find((d) => d.styleId === s.styleId);\n return {\n styleId: s.styleId,\n name: s.name || s.styleId,\n type: s.type,\n isDefault: s.default,\n qFormat: s.qFormat,\n priority: s.uiPriority ?? 99,\n // Extract visual properties from rPr, fall back to hardcoded defaults\n fontSize: s.rPr?.fontSize ?? defaultStyle?.fontSize,\n bold: s.rPr?.bold ?? defaultStyle?.bold,\n italic: s.rPr?.italic ?? defaultStyle?.italic,\n color: s.rPr?.color?.rgb ?? defaultStyle?.color,\n };\n });\n\n // Sort by priority\n return docStyles.sort((a, b) => (a.priority ?? 99) - (b.priority ?? 99));\n }, [styles]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n onChange?.(newValue);\n },\n [onChange]\n );\n\n const currentValue = value || 'Normal';\n const displayName = styleOptions.find((s) => s.styleId === currentValue)?.name || currentValue;\n\n return (\n <Select value={currentValue} onValueChange={handleValueChange} disabled={disabled}>\n <SelectTrigger\n className={cn('h-8 text-sm', className)}\n style={{ width: typeof width === 'number' ? `${width}px` : width }}\n aria-label=\"Select paragraph style\"\n >\n <span className=\"truncate\">{displayName}</span>\n </SelectTrigger>\n <SelectContent className=\"min-w-[260px] max-h-[400px]\">\n {styleOptions.map((style) => (\n <SelectItem key={style.styleId} value={style.styleId} className=\"py-2.5 px-3\">\n <span style={getStylePreviewCSS(style)}>{style.name}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n","/**\n * Zoom Control Component (Radix UI)\n *\n * A dropdown for controlling document zoom level using Radix Select.\n */\n\nimport * as React from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './Select';\nimport { cn } from '../../lib/utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ZoomLevel {\n value: number;\n label: string;\n}\n\nexport interface ZoomControlProps {\n value?: number;\n onChange?: (zoom: number) => void;\n levels?: ZoomLevel[];\n disabled?: boolean;\n className?: string;\n minZoom?: number;\n maxZoom?: number;\n showButtons?: boolean;\n persistZoom?: boolean;\n storageKey?: string;\n compact?: boolean;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_ZOOM_LEVELS: ZoomLevel[] = [\n { value: 0.5, label: '50%' },\n { value: 0.75, label: '75%' },\n { value: 1.0, label: '100%' },\n { value: 1.25, label: '125%' },\n { value: 1.5, label: '150%' },\n { value: 2.0, label: '200%' },\n];\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function ZoomControl({\n value = 1.0,\n onChange,\n levels = DEFAULT_ZOOM_LEVELS,\n disabled = false,\n className,\n compact = false,\n}: ZoomControlProps) {\n const displayLabel = React.useMemo(() => {\n const matchingLevel = levels.find((level) => Math.abs(level.value - value) < 0.001);\n if (matchingLevel) return matchingLevel.label;\n return `${Math.round(value * 100)}%`;\n }, [levels, value]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n const zoom = parseFloat(newValue);\n if (!isNaN(zoom)) {\n onChange?.(zoom);\n }\n },\n [onChange]\n );\n\n return (\n <Select value={value.toString()} onValueChange={handleValueChange} disabled={disabled}>\n <SelectTrigger\n className={cn(compact ? 'h-7 min-w-[55px] text-xs' : 'h-8 min-w-[70px] text-sm', className)}\n aria-label={`Zoom: ${displayLabel}`}\n >\n <SelectValue placeholder=\"100%\">{displayLabel}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {levels.map((level) => (\n <SelectItem key={level.value} value={level.value.toString()}>\n {level.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\n// Re-export types for compatibility\nexport type { ZoomControlProps as ZoomControlPropsType };\n","/**\n * TableBorderPicker - Google Docs-style border preset popover\n *\n * Shows a grid of border preset buttons: All, Outside, Inside,\n * Top, Bottom, Left, Right, and Clear.\n */\n\nimport { useState, useCallback } from 'react';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nexport interface TableBorderPickerProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n}\n\nconst BORDER_PRESETS: { action: TableAction; icon: string; label: string }[] = [\n { action: 'borderAll', icon: 'border_all', label: 'All borders' },\n { action: 'borderOutside', icon: 'border_outer', label: 'Outside borders' },\n { action: 'borderInside', icon: 'border_inner', label: 'Inside borders' },\n { action: 'borderTop', icon: 'border_top', label: 'Top border' },\n { action: 'borderBottom', icon: 'border_bottom', label: 'Bottom border' },\n { action: 'borderLeft', icon: 'border_left', label: 'Left border' },\n { action: 'borderRight', icon: 'border_right', label: 'Right border' },\n { action: 'borderNone', icon: 'border_clear', label: 'No borders' },\n];\n\nexport function TableBorderPicker({ onAction, disabled = false }: TableBorderPickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const close = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose: close,\n });\n\n const handlePreset = useCallback(\n (action: TableAction) => {\n onAction(action);\n setIsOpen(false);\n },\n [onAction]\n );\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label=\"Border style\"\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid=\"toolbar-table-borders\"\n >\n <MaterialSymbol name=\"border_all\" size={20} />\n <MaterialSymbol name=\"arrow_drop_down\" size={14} className=\"-ml-1\" />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content=\"Borders\">{button}</Tooltip> : button}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: 6,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(4, 1fr)',\n gap: 2,\n }}\n >\n {BORDER_PRESETS.map(({ action, icon, label }) => (\n <button\n key={typeof action === 'string' ? action : action.type}\n type=\"button\"\n title={label}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n border: '1px solid transparent',\n borderRadius: 4,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: 'var(--doc-text)',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-bg-hover)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'transparent';\n }}\n onClick={() => handlePreset(action)}\n >\n <MaterialSymbol name={icon} size={18} />\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default TableBorderPicker;\n","/**\n * TableBorderColorPicker - Icon button with color indicator bar\n *\n * Reuses the existing ColorPicker dropdown for border color selection.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nexport interface TableBorderColorPickerProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n}\n\nconst QUICK_COLORS = [\n '#000000',\n '#434343',\n '#666666',\n '#999999',\n '#b7b7b7',\n '#cccccc',\n '#d9d9d9',\n '#efefef',\n '#f3f3f3',\n '#ffffff',\n '#980000',\n '#ff0000',\n '#ff9900',\n '#ffff00',\n '#00ff00',\n '#00ffff',\n '#4a86e8',\n '#0000ff',\n '#9900ff',\n '#ff00ff',\n];\n\nconst swatchStyle: CSSProperties = {\n width: 18,\n height: 18,\n borderRadius: 2,\n border: '1px solid var(--doc-border)',\n cursor: 'pointer',\n padding: 0,\n backgroundColor: 'transparent',\n};\n\nexport function TableBorderColorPicker({\n onAction,\n disabled = false,\n}: TableBorderColorPickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [currentColor, setCurrentColor] = useState('#000000');\n const close = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose: close,\n });\n\n const handleColorSelect = useCallback(\n (color: string) => {\n setCurrentColor(color);\n onAction({ type: 'borderColor', color: color.replace(/^#/, '') });\n setIsOpen(false);\n },\n [onAction]\n );\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80 flex-col gap-0 !p-0.5',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label=\"Border color\"\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid=\"toolbar-table-border-color\"\n >\n <MaterialSymbol name=\"border_color\" size={18} />\n <div\n style={{\n width: 16,\n height: 3,\n backgroundColor: currentColor,\n borderRadius: 0,\n marginTop: -2,\n }}\n />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content=\"Border color\">{button}</Tooltip> : button}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: 8,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(10, 1fr)',\n gap: 2,\n }}\n >\n {QUICK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n style={{\n ...swatchStyle,\n backgroundColor: color,\n outline: currentColor === color ? '2px solid var(--doc-primary)' : 'none',\n outlineOffset: 1,\n }}\n title={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => handleColorSelect(color)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default TableBorderColorPicker;\n","/**\n * TableBorderWidthPicker - Popover with border width options\n *\n * Shows 5 width options as horizontal lines at that thickness.\n */\n\nimport { useState, useCallback } from 'react';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nexport interface TableBorderWidthPickerProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n}\n\nconst WIDTH_OPTIONS: { size: number; label: string; thickness: number }[] = [\n { size: 4, label: '0.5 pt', thickness: 0.5 },\n { size: 8, label: '1 pt', thickness: 1 },\n { size: 12, label: '1.5 pt', thickness: 1.5 },\n { size: 16, label: '2 pt', thickness: 2 },\n { size: 24, label: '3 pt', thickness: 3 },\n];\n\nexport function TableBorderWidthPicker({\n onAction,\n disabled = false,\n}: TableBorderWidthPickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const close = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose: close,\n });\n\n const handleSelect = useCallback(\n (size: number) => {\n onAction({ type: 'borderWidth', size });\n setIsOpen(false);\n },\n [onAction]\n );\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label=\"Border width\"\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid=\"toolbar-table-border-width\"\n >\n <MaterialSymbol name=\"line_weight\" size={20} />\n <MaterialSymbol name=\"arrow_drop_down\" size={14} className=\"-ml-1\" />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content=\"Border width\">{button}</Tooltip> : button}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: '4px 0',\n minWidth: 120,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {WIDTH_OPTIONS.map(({ size, label, thickness }) => (\n <button\n key={size}\n type=\"button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '6px 12px',\n width: '100%',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n fontSize: 12,\n color: 'var(--doc-text)',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-bg-hover)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'transparent';\n }}\n onClick={() => handleSelect(size)}\n >\n <div\n style={{\n width: 50,\n height: Math.max(thickness, 1),\n backgroundColor: '#000',\n borderRadius: thickness > 2 ? 1 : 0,\n }}\n />\n <span>{label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default TableBorderWidthPicker;\n","/**\n * TableCellFillPicker - Paint bucket icon with color dropdown\n *\n * Reuses the color grid pattern for cell shading color selection.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nexport interface TableCellFillPickerProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n}\n\nconst QUICK_COLORS = [\n '#000000',\n '#434343',\n '#666666',\n '#999999',\n '#b7b7b7',\n '#cccccc',\n '#d9d9d9',\n '#efefef',\n '#f3f3f3',\n '#ffffff',\n '#980000',\n '#ff0000',\n '#ff9900',\n '#ffff00',\n '#00ff00',\n '#00ffff',\n '#4a86e8',\n '#0000ff',\n '#9900ff',\n '#ff00ff',\n];\n\nconst swatchStyle: CSSProperties = {\n width: 18,\n height: 18,\n borderRadius: 2,\n border: '1px solid var(--doc-border)',\n cursor: 'pointer',\n padding: 0,\n backgroundColor: 'transparent',\n};\n\nexport function TableCellFillPicker({ onAction, disabled = false }: TableCellFillPickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [currentColor, setCurrentColor] = useState<string | null>(null);\n const close = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose: close,\n });\n\n const handleColorSelect = useCallback(\n (color: string) => {\n setCurrentColor(color);\n onAction({ type: 'cellFillColor', color });\n setIsOpen(false);\n },\n [onAction]\n );\n\n const handleNoColor = useCallback(() => {\n setCurrentColor(null);\n onAction({ type: 'cellFillColor', color: null });\n setIsOpen(false);\n }, [onAction]);\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80 flex-col gap-0 !p-0.5',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label=\"Cell fill color\"\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid=\"toolbar-table-cell-fill\"\n >\n <MaterialSymbol name=\"format_color_fill\" size={18} />\n <div\n style={{\n width: 16,\n height: 3,\n backgroundColor: currentColor || 'transparent',\n borderRadius: 0,\n marginTop: -2,\n border: currentColor ? 'none' : '1px solid var(--doc-border)',\n }}\n />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content=\"Cell fill color\">{button}</Tooltip> : button}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: 8,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(10, 1fr)',\n gap: 2,\n }}\n >\n {QUICK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n style={{\n ...swatchStyle,\n backgroundColor: color,\n outline: currentColor === color ? '2px solid var(--doc-primary)' : 'none',\n outlineOffset: 1,\n }}\n title={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => handleColorSelect(color)}\n />\n ))}\n </div>\n <button\n type=\"button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginTop: 6,\n padding: '4px 8px',\n width: '100%',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n fontSize: 12,\n color: 'var(--doc-text-muted)',\n borderRadius: 4,\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'var(--doc-bg-hover)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'transparent';\n }}\n onClick={handleNoColor}\n >\n <MaterialSymbol name=\"format_color_reset\" size={14} />\n <span>No fill</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default TableCellFillPicker;\n","/**\n * TableMoreDropdown - Compact dropdown for less-used table actions\n *\n * Contains: delete row/column/table, vertical alignment, header row,\n * distribute columns, auto-fit, table alignment, cell margins,\n * text direction, no-wrap, row height, table properties.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { cn } from '../../lib/utils';\nimport type { TableAction } from './TableToolbar';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nexport interface TableMoreDropdownProps {\n onAction: (action: TableAction) => void;\n disabled?: boolean;\n tableContext?: {\n isInTable: boolean;\n rowCount?: number;\n columnCount?: number;\n canSplitCell?: boolean;\n hasMultiCellSelection?: boolean;\n table?: { attrs?: { justification?: string } };\n } | null;\n}\n\nconst menuItemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '7px 14px',\n fontSize: 13,\n color: 'var(--doc-text)',\n cursor: 'pointer',\n border: 'none',\n backgroundColor: 'transparent',\n width: '100%',\n textAlign: 'left',\n};\n\nconst separatorStyles: CSSProperties = {\n height: 1,\n backgroundColor: 'var(--doc-border)',\n margin: '4px 0',\n};\n\nconst sectionLabelStyles: CSSProperties = {\n padding: '6px 14px 2px',\n fontSize: 11,\n color: 'var(--doc-text-muted)',\n fontWeight: 500,\n};\n\nexport function TableMoreDropdown({\n onAction,\n disabled = false,\n tableContext,\n}: TableMoreDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredItem, setHoveredItem] = useState<string | null>(null);\n const close = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose: close,\n align: 'right',\n });\n const currentJustification =\n (tableContext?.table?.attrs?.justification as 'left' | 'center' | 'right' | null | undefined) ??\n 'left';\n\n const handleAction = useCallback(\n (action: TableAction) => {\n onAction(action);\n setIsOpen(false);\n },\n [onAction]\n );\n\n const menuItem = (\n id: string,\n icon: string,\n label: string,\n action: TableAction,\n opts?: { danger?: boolean; itemDisabled?: boolean }\n ) => {\n const isItemDisabled = disabled || opts?.itemDisabled;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"menuitem\"\n style={{\n ...menuItemStyles,\n backgroundColor:\n hoveredItem === id && !isItemDisabled ? 'var(--doc-bg-hover)' : 'transparent',\n color: isItemDisabled\n ? 'var(--doc-text-muted)'\n : opts?.danger\n ? 'var(--doc-error)'\n : 'var(--doc-text)',\n cursor: isItemDisabled ? 'not-allowed' : 'pointer',\n }}\n onClick={() => !isItemDisabled && handleAction(action)}\n onMouseEnter={() => setHoveredItem(id)}\n onMouseLeave={() => setHoveredItem(null)}\n disabled={isItemDisabled}\n >\n <MaterialSymbol\n name={icon}\n size={16}\n className={opts?.danger && !isItemDisabled ? 'text-red-600' : ''}\n />\n <span style={{ flex: 1 }}>{label}</span>\n </button>\n );\n };\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label=\"More table options\"\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n data-testid=\"toolbar-table-more\"\n >\n <MaterialSymbol name=\"more_vert\" size={20} />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content=\"More table options\">{button}</Tooltip> : button}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: '4px 0',\n minWidth: 200,\n maxHeight: '70vh',\n overflowY: 'auto',\n }}\n role=\"menu\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Insert actions */}\n {menuItem('addRowAbove', 'add', 'Insert row above', 'addRowAbove')}\n {menuItem('addRowBelow', 'add', 'Insert row below', 'addRowBelow')}\n {menuItem('addColumnLeft', 'add', 'Insert column left', 'addColumnLeft')}\n {menuItem('addColumnRight', 'add', 'Insert column right', 'addColumnRight')}\n\n <div style={separatorStyles} role=\"separator\" />\n\n {/* Merge/Split */}\n {menuItem('mergeCells', 'call_merge', 'Merge cells', 'mergeCells', {\n itemDisabled: !tableContext?.hasMultiCellSelection,\n })}\n {menuItem('splitCell', 'call_split', 'Split cell', 'splitCell', {\n itemDisabled: !tableContext?.canSplitCell,\n })}\n\n <div style={separatorStyles} role=\"separator\" />\n\n {/* Delete actions */}\n {menuItem('deleteRow', 'delete', 'Delete row', 'deleteRow', {\n danger: true,\n itemDisabled: (tableContext?.rowCount ?? 0) <= 1,\n })}\n {menuItem('deleteColumn', 'delete', 'Delete column', 'deleteColumn', {\n danger: true,\n itemDisabled: (tableContext?.columnCount ?? 0) <= 1,\n })}\n {menuItem('deleteTable', 'delete', 'Delete table', 'deleteTable', { danger: true })}\n\n <div style={separatorStyles} role=\"separator\" />\n\n {/* Vertical alignment */}\n <div style={sectionLabelStyles}>Vertical alignment</div>\n <div style={{ display: 'flex', gap: 4, padding: '4px 14px' }}>\n {(['top', 'center', 'bottom'] as const).map((align) => {\n const icons = {\n top: 'vertical_align_top',\n center: 'vertical_align_center',\n bottom: 'vertical_align_bottom',\n };\n const labels = { top: 'Top', center: 'Middle', bottom: 'Bottom' };\n return (\n <button\n key={align}\n type=\"button\"\n title={labels[align]}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 28,\n border: '1px solid var(--doc-border)',\n borderRadius: 4,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-bg-hover)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'transparent';\n }}\n onClick={() => handleAction({ type: 'cellVerticalAlign', align })}\n >\n <MaterialSymbol name={icons[align]} size={16} />\n </button>\n );\n })}\n </div>\n\n <div style={separatorStyles} role=\"separator\" />\n\n {/* Table alignment */}\n <div style={sectionLabelStyles}>Table alignment</div>\n <div style={{ display: 'flex', gap: 4, padding: '4px 14px' }}>\n {(['left', 'center', 'right'] as const).map((align) => {\n const icons = {\n left: 'format_align_left',\n center: 'format_align_center',\n right: 'format_align_right',\n };\n const isActive = currentJustification === align;\n return (\n <button\n key={align}\n type=\"button\"\n title={`Align table ${align}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 28,\n border: '1px solid var(--doc-border)',\n borderRadius: 4,\n backgroundColor: isActive ? 'var(--doc-primary-light)' : 'transparent',\n borderColor: isActive ? 'var(--doc-primary)' : 'var(--doc-border)',\n color: isActive ? 'var(--doc-primary)' : 'var(--doc-text)',\n cursor: 'pointer',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n handleAction({ type: 'tableProperties', props: { justification: align } })\n }\n >\n <MaterialSymbol name={icons[align]} size={16} />\n </button>\n );\n })}\n </div>\n\n <div style={separatorStyles} role=\"separator\" />\n\n {/* Other options */}\n {menuItem('headerRow', 'table_rows', 'Toggle header row', { type: 'toggleHeaderRow' })}\n {menuItem('distribute', 'view_column', 'Distribute columns evenly', {\n type: 'distributeColumns',\n })}\n {menuItem('autoFit', 'fit_width', 'Auto-fit to contents', { type: 'autoFitContents' })}\n {menuItem('noWrap', 'wrap_text', 'Toggle no-wrap', { type: 'toggleNoWrap' })}\n\n <div style={separatorStyles} role=\"separator\" />\n\n {menuItem('properties', 'settings', 'Table properties...', {\n type: 'openTableProperties',\n })}\n </div>\n )}\n </div>\n );\n}\n\nexport default TableMoreDropdown;\n","/**\n * TableGridInline — a grid picker for table dimensions, rendered inline (no button/dropdown wrapper).\n * Used both standalone inside menu submenus and internally by TableGridPicker.\n */\n\nimport { useState, useCallback } from 'react';\nimport type { CSSProperties, ReactElement } from 'react';\n\ninterface TableGridInlineProps {\n onInsert: (rows: number, columns: number) => void;\n gridRows?: number;\n gridColumns?: number;\n}\n\nconst CELL_SIZE = 18;\nconst CELL_GAP = 2;\n\nconst cellStyle: CSSProperties = {\n width: CELL_SIZE,\n height: CELL_SIZE,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border, #d1d5db)',\n borderRadius: 2,\n transition: 'background-color 0.1s, border-color 0.1s',\n cursor: 'pointer',\n};\n\nconst cellSelectedStyle: CSSProperties = {\n ...cellStyle,\n backgroundColor: 'var(--doc-primary, #3b82f6)',\n border: '1px solid var(--doc-primary, #3b82f6)',\n};\n\nconst labelStyle: CSSProperties = {\n marginTop: 6,\n fontSize: 11,\n fontWeight: 500,\n color: 'var(--doc-text, #374151)',\n textAlign: 'center',\n};\n\nexport function TableGridInline({ onInsert, gridRows = 6, gridColumns = 6 }: TableGridInlineProps) {\n const [hoverRows, setHoverRows] = useState(0);\n const [hoverCols, setHoverCols] = useState(0);\n\n const handleCellClick = useCallback(() => {\n if (hoverRows > 0 && hoverCols > 0) {\n onInsert(hoverRows, hoverCols);\n }\n }, [hoverRows, hoverCols, onInsert]);\n\n const gridCells: ReactElement[] = [];\n for (let row = 1; row <= gridRows; row++) {\n for (let col = 1; col <= gridColumns; col++) {\n const isSelected = row <= hoverRows && col <= hoverCols;\n gridCells.push(\n <div\n key={`${row}-${col}`}\n style={isSelected ? cellSelectedStyle : cellStyle}\n onMouseEnter={() => {\n setHoverRows(row);\n setHoverCols(col);\n }}\n onClick={handleCellClick}\n role=\"gridcell\"\n aria-selected={isSelected}\n />\n );\n }\n }\n\n const gridLabel = hoverRows > 0 && hoverCols > 0 ? `${hoverCols} × ${hoverRows}` : 'Select size';\n\n return (\n <div>\n <div\n style={{\n display: 'grid',\n gap: CELL_GAP,\n gridTemplateColumns: `repeat(${gridColumns}, ${CELL_SIZE}px)`,\n }}\n onMouseLeave={() => {\n setHoverRows(0);\n setHoverCols(0);\n }}\n role=\"grid\"\n aria-label=\"Table size selector\"\n >\n {gridCells}\n </div>\n <div style={labelStyle}>{gridLabel}</div>\n </div>\n );\n}\n","/**\n * MenuDropdown — a reusable dropdown menu with text label trigger\n *\n * Uses position:fixed so dropdowns escape overflow:auto/hidden ancestors.\n * Supports submenu panels that appear to the right on hover (Google Docs style).\n */\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { MaterialSymbol } from './MaterialSymbol';\n\nexport interface MenuItem {\n icon?: string;\n label: string;\n shortcut?: string;\n onClick?: () => void;\n disabled?: boolean;\n /** Custom content to render instead of a simple menu item */\n customContent?: ReactNode;\n /** Submenu content that appears to the right on hover */\n submenuContent?: (closeMenu: () => void) => ReactNode;\n}\n\nexport interface MenuSeparator {\n type: 'separator';\n}\n\nexport type MenuEntry = MenuItem | MenuSeparator;\n\nfunction isSeparator(entry: MenuEntry): entry is MenuSeparator {\n return 'type' in entry && entry.type === 'separator';\n}\n\ninterface MenuDropdownProps {\n label: string;\n items: MenuEntry[];\n disabled?: boolean;\n}\n\nconst triggerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n padding: '2px 8px',\n border: 'none',\n background: 'transparent',\n borderRadius: 4,\n cursor: 'pointer',\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--doc-text, #374151)',\n whiteSpace: 'nowrap',\n height: 28,\n lineHeight: '28px',\n};\n\nconst triggerOpenStyle: CSSProperties = {\n ...triggerStyle,\n background: 'var(--doc-hover, #f3f4f6)',\n};\n\nconst menuItemStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 12px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n fontSize: 13,\n color: 'var(--doc-text, #374151)',\n width: '100%',\n textAlign: 'left',\n whiteSpace: 'nowrap',\n};\n\nconst menuItemDisabledStyle: CSSProperties = {\n ...menuItemStyle,\n opacity: 0.4,\n cursor: 'default',\n};\n\nconst separatorStyle: CSSProperties = {\n height: 1,\n backgroundColor: 'var(--doc-border, #e5e7eb)',\n margin: '4px 0',\n};\n\nconst shortcutStyle: CSSProperties = {\n marginLeft: 'auto',\n fontSize: 12,\n color: 'var(--doc-text-muted, #9ca3af)',\n};\n\nconst submenuPanelStyle: CSSProperties = {\n position: 'absolute',\n left: '100%',\n top: -4,\n marginLeft: 2,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border, #d1d5db)',\n borderRadius: 6,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.12)',\n padding: 8,\n zIndex: 1001,\n};\n\nexport function MenuDropdown({ label, items, disabled }: MenuDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredSubmenu, setHoveredSubmenu] = useState<string | null>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPos, setDropdownPos] = useState<{ top: number; left: number }>({\n top: 0,\n left: 0,\n });\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n setHoveredSubmenu(null);\n }, []);\n\n // Calculate position when opening\n useEffect(() => {\n if (!isOpen || !triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n setDropdownPos({ top: rect.bottom + 2, left: rect.left });\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n function handleClickOutside(e: MouseEvent) {\n const target = e.target as Node;\n if (\n triggerRef.current &&\n !triggerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n closeMenu();\n }\n }\n\n function handleEscape(e: KeyboardEvent) {\n if (e.key === 'Escape') closeMenu();\n }\n\n // Close on scroll of any ancestor (dropdown position would be stale)\n function handleScroll() {\n closeMenu();\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n window.addEventListener('scroll', handleScroll, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, closeMenu]);\n\n const handleItemClick = (item: MenuItem) => {\n if (item.disabled || item.submenuContent) return;\n if (!item.onClick) return;\n item.onClick();\n closeMenu();\n };\n\n return (\n <div style={{ position: 'relative' }}>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onMouseDown={(e) => e.preventDefault()}\n disabled={disabled}\n style={isOpen ? triggerOpenStyle : triggerStyle}\n >\n {label}\n <MaterialSymbol name=\"arrow_drop_down\" size={16} />\n </button>\n\n {isOpen && (\n <div\n ref={dropdownRef}\n style={{\n position: 'fixed',\n top: dropdownPos.top,\n left: dropdownPos.left,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border, #d1d5db)',\n borderRadius: 6,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.12)',\n padding: '4px 0',\n zIndex: 10000,\n minWidth: 200,\n }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {items.map((entry, i) => {\n if (isSeparator(entry)) {\n return <div key={`sep-${i}`} style={separatorStyle} />;\n }\n const item = entry;\n if (item.customContent) {\n return (\n <div key={item.label} onMouseDown={(e) => e.preventDefault()}>\n {item.customContent}\n </div>\n );\n }\n\n const hasSubmenu = !!item.submenuContent;\n const isSubmenuOpen = hoveredSubmenu === item.label;\n\n return (\n <div\n key={item.label}\n style={{ position: 'relative' }}\n onMouseEnter={() => hasSubmenu && setHoveredSubmenu(item.label)}\n onMouseLeave={() => hasSubmenu && setHoveredSubmenu(null)}\n >\n <button\n type=\"button\"\n style={item.disabled ? menuItemDisabledStyle : menuItemStyle}\n onClick={() => handleItemClick(item)}\n onMouseDown={(e) => e.preventDefault()}\n onMouseOver={(e) => {\n if (!item.disabled) {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-hover, #f3f4f6)';\n }\n }}\n onMouseOut={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = 'transparent';\n }}\n disabled={item.disabled}\n >\n {item.icon && <MaterialSymbol name={item.icon} size={18} />}\n <span>{item.label}</span>\n {item.shortcut && <span style={shortcutStyle}>{item.shortcut}</span>}\n {hasSubmenu && (\n <span style={{ marginLeft: 'auto' }}>\n <MaterialSymbol name=\"keyboard_arrow_right\" size={16} />\n </span>\n )}\n </button>\n {hasSubmenu && isSubmenuOpen && (\n <div style={submenuPanelStyle} onMouseDown={(e) => e.preventDefault()}>\n {item.submenuContent!(closeMenu)}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Shared icon-grid dropdown used by image toolbar controls.\n *\n * Renders a trigger button (icon + chevron) that opens a floating\n * row of icon buttons. Handles click-outside, Escape, focus-stealing\n * prevention, and optional active-state highlighting.\n */\n\nimport { useState, useCallback } from 'react';\nimport { MaterialSymbol } from './MaterialSymbol';\nimport { Button } from './Button';\nimport { Tooltip } from './Tooltip';\nimport { cn } from '../../lib/utils';\nimport { useFixedDropdown } from './useFixedDropdown';\n\nconst ICON_SIZE = 20;\n\nexport interface IconGridOption<T extends string = string> {\n value: T;\n label: string;\n iconName: string;\n}\n\nexport interface IconGridDropdownProps<T extends string = string> {\n /** Options to display in the grid */\n options: IconGridOption<T>[];\n /** Currently active value (highlighted in the grid), or null */\n activeValue?: T | null;\n /** Icon shown on the trigger button */\n triggerIcon: string;\n /** Tooltip text when closed */\n tooltipContent: string;\n /** Fired when an option is clicked */\n onSelect: (value: T) => void;\n disabled?: boolean;\n /** aria-label for the trigger button */\n ariaLabel?: string;\n /** data-testid for the trigger button */\n testId?: string;\n}\n\nexport function IconGridDropdown<T extends string = string>({\n options,\n activeValue,\n triggerIcon,\n tooltipContent,\n onSelect,\n disabled = false,\n ariaLabel,\n testId,\n}: IconGridDropdownProps<T>) {\n const [isOpen, setIsOpen] = useState(false);\n const onClose = useCallback(() => setIsOpen(false), []);\n const { containerRef, dropdownRef, dropdownStyle, handleMouseDown } = useFixedDropdown({\n isOpen,\n onClose,\n });\n\n const handleOptionClick = useCallback(\n (value: T) => {\n if (!disabled) onSelect(value);\n setIsOpen(false);\n },\n [disabled, onSelect]\n );\n\n const triggerButton = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n isOpen && 'bg-slate-100',\n disabled && 'opacity-30 cursor-not-allowed'\n )}\n onMouseDown={handleMouseDown}\n onClick={() => !disabled && setIsOpen((prev) => !prev)}\n disabled={disabled}\n aria-label={ariaLabel ?? tooltipContent}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n data-testid={testId}\n >\n <MaterialSymbol name={triggerIcon} size={ICON_SIZE} />\n <MaterialSymbol name=\"arrow_drop_down\" size={14} className=\"-ml-1\" />\n </Button>\n );\n\n return (\n <div ref={containerRef} style={{ position: 'relative', display: 'inline-block' }}>\n {!isOpen ? <Tooltip content={tooltipContent}>{triggerButton}</Tooltip> : triggerButton}\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n style={{\n ...dropdownStyle,\n backgroundColor: 'white',\n border: '1px solid var(--doc-border)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',\n padding: 6,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', gap: 2 }}>\n {options.map((option) => {\n const isActive = activeValue === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n title={option.label}\n data-testid={testId ? `${testId}-${option.value}` : undefined}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n border: '1px solid transparent',\n borderRadius: 4,\n backgroundColor: isActive ? 'var(--doc-primary-light)' : 'transparent',\n cursor: 'pointer',\n color: isActive ? 'var(--doc-primary)' : 'var(--doc-text)',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={(e) => {\n if (!isActive) {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor =\n 'var(--doc-bg-hover)';\n }\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.backgroundColor = isActive\n ? 'var(--doc-primary-light)'\n : 'transparent';\n }}\n onClick={() => handleOptionClick(option.value)}\n >\n <MaterialSymbol name={option.iconName} size={18} />\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Image Wrap Dropdown — thin wrapper around IconGridDropdown.\n */\n\nimport { IconGridDropdown, type IconGridOption } from './IconGridDropdown';\n\nconst WRAP_OPTIONS: IconGridOption[] = [\n { value: 'inline', label: 'Inline with text', iconName: 'format_image_left' },\n { value: 'wrapRight', label: 'Float left (wrap right)', iconName: 'format_image_right' },\n { value: 'wrapLeft', label: 'Float right (wrap left)', iconName: 'format_image_left' },\n { value: 'topAndBottom', label: 'Top and bottom', iconName: 'horizontal_rule' },\n { value: 'behind', label: 'Behind text', iconName: 'flip_to_back' },\n { value: 'inFront', label: 'In front of text', iconName: 'flip_to_front' },\n];\n\nexport interface ImageWrapDropdownProps {\n imageContext: {\n wrapType: string;\n displayMode: string;\n cssFloat: string | null;\n };\n onChange: (wrapType: string) => void;\n disabled?: boolean;\n}\n\nfunction getActiveWrapValue(ctx: ImageWrapDropdownProps['imageContext']): string {\n if (ctx.displayMode === 'float' && ctx.cssFloat === 'left') return 'wrapRight';\n if (ctx.displayMode === 'float' && ctx.cssFloat === 'right') return 'wrapLeft';\n return ctx.wrapType;\n}\n\nexport function ImageWrapDropdown({\n imageContext,\n onChange,\n disabled = false,\n}: ImageWrapDropdownProps) {\n const activeValue = getActiveWrapValue(imageContext);\n const currentOption = WRAP_OPTIONS.find((o) => o.value === activeValue) || WRAP_OPTIONS[0];\n\n return (\n <IconGridDropdown\n options={WRAP_OPTIONS}\n activeValue={activeValue}\n triggerIcon={currentOption.iconName}\n tooltipContent={`Wrap: ${currentOption.label}`}\n onSelect={onChange}\n disabled={disabled}\n testId=\"toolbar-image-wrap\"\n />\n );\n}\n","/**\n * Image Transform Dropdown — thin wrapper around IconGridDropdown.\n */\n\nimport { IconGridDropdown, type IconGridOption } from './IconGridDropdown';\n\ntype TransformAction = 'rotateCW' | 'rotateCCW' | 'flipH' | 'flipV';\n\nconst TRANSFORM_OPTIONS: IconGridOption<TransformAction>[] = [\n { value: 'rotateCW', label: 'Rotate clockwise', iconName: 'rotate_right' },\n { value: 'rotateCCW', label: 'Rotate counter-clockwise', iconName: 'rotate_left' },\n { value: 'flipH', label: 'Flip horizontal', iconName: 'swap_horiz' },\n { value: 'flipV', label: 'Flip vertical', iconName: 'swap_vert' },\n];\n\nexport interface ImageTransformDropdownProps {\n onTransform: (action: TransformAction) => void;\n disabled?: boolean;\n}\n\nexport function ImageTransformDropdown({\n onTransform,\n disabled = false,\n}: ImageTransformDropdownProps) {\n return (\n <IconGridDropdown<TransformAction>\n options={TRANSFORM_OPTIONS}\n triggerIcon=\"rotate_right\"\n tooltipContent=\"Transform\"\n onSelect={onTransform}\n disabled={disabled}\n testId=\"toolbar-image-transform\"\n />\n );\n}\n","/**\n * Toolbar Utility Functions\n *\n * Pure utility functions for formatting state extraction and action application.\n * Extracted from Toolbar.tsx to reduce file size.\n */\n\nimport type { TextFormatting, ParagraphFormatting } from '@eigenpal/docx-core/types/document';\nimport { pointsToHalfPoints } from './ui/FontSizePicker';\nimport { createDefaultListState } from './ui/ListButtons';\nimport type { SelectionFormatting, FormattingAction } from './Toolbar';\n\n// ============================================================================\n// HIGHLIGHT COLOR MAPPING\n// ============================================================================\n\n/**\n * Map hex color to OOXML highlight color name\n * OOXML uses named colors for highlights (yellow, green, cyan, etc.)\n */\nconst HIGHLIGHT_HEX_TO_NAME: Record<string, string> = {\n FFFF00: 'yellow',\n '00FF00': 'green',\n '00FFFF': 'cyan',\n FF00FF: 'magenta',\n '0000FF': 'blue',\n FF0000: 'red',\n '00008B': 'darkBlue',\n '008080': 'darkCyan',\n '008000': 'darkGreen',\n '800080': 'darkMagenta',\n '8B0000': 'darkRed',\n '808000': 'darkYellow',\n '808080': 'darkGray',\n C0C0C0: 'lightGray',\n '000000': 'black',\n FFFFFF: 'white',\n};\n\nexport function mapHexToHighlightName(hex: string): string | null {\n const normalized = hex.replace(/^#/, '').toUpperCase();\n return HIGHLIGHT_HEX_TO_NAME[normalized] || null;\n}\n\n// ============================================================================\n// FORMATTING STATE EXTRACTION\n// ============================================================================\n\n/**\n * Extract formatting state from TextFormatting and ParagraphFormatting objects\n */\nexport function getSelectionFormatting(\n formatting?: Partial<TextFormatting>,\n paragraphFormatting?: Partial<ParagraphFormatting>\n): SelectionFormatting {\n const result: SelectionFormatting = {};\n\n if (formatting) {\n result.bold = formatting.bold;\n result.italic = formatting.italic;\n result.underline =\n formatting.underline?.style !== 'none' && formatting.underline?.style !== undefined;\n result.strike = formatting.strike;\n result.superscript = formatting.vertAlign === 'superscript';\n result.subscript = formatting.vertAlign === 'subscript';\n result.fontFamily = formatting.fontFamily?.ascii || formatting.fontFamily?.hAnsi;\n result.fontSize = formatting.fontSize;\n result.color = formatting.color?.rgb ? `#${formatting.color.rgb}` : undefined;\n result.highlight = formatting.highlight !== 'none' ? formatting.highlight : undefined;\n }\n\n if (paragraphFormatting) {\n result.alignment = paragraphFormatting.alignment;\n\n if (paragraphFormatting.lineSpacing !== undefined) {\n result.lineSpacing = paragraphFormatting.lineSpacing;\n }\n\n if (paragraphFormatting.styleId) {\n result.styleId = paragraphFormatting.styleId;\n }\n\n if (paragraphFormatting.numPr) {\n const { numId, ilvl } = paragraphFormatting.numPr;\n const isBullet = numId === 1;\n result.listState = {\n type: isBullet ? 'bullet' : 'numbered',\n level: ilvl ?? 0,\n isInList: true,\n numId,\n };\n } else {\n result.listState = createDefaultListState();\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// FORMATTING ACTION APPLICATION\n// ============================================================================\n\n/**\n * Apply a formatting action to existing formatting, returning new formatting\n */\nexport function applyFormattingAction(\n currentFormatting: TextFormatting,\n action: FormattingAction\n): TextFormatting {\n const newFormatting = { ...currentFormatting };\n\n if (typeof action === 'object') {\n switch (action.type) {\n case 'fontFamily':\n newFormatting.fontFamily = {\n ...currentFormatting.fontFamily,\n ascii: action.value,\n hAnsi: action.value,\n };\n return newFormatting;\n case 'fontSize':\n newFormatting.fontSize = pointsToHalfPoints(action.value);\n return newFormatting;\n case 'textColor':\n newFormatting.color = {\n rgb: action.value.replace(/^#/, '').toUpperCase(),\n };\n return newFormatting;\n case 'highlightColor':\n if (action.value === '' || action.value === 'none') {\n newFormatting.highlight = 'none';\n } else {\n newFormatting.highlight = (mapHexToHighlightName(action.value) ||\n 'yellow') as TextFormatting['highlight'];\n }\n return newFormatting;\n }\n }\n\n switch (action) {\n case 'bold':\n newFormatting.bold = !currentFormatting.bold;\n break;\n case 'italic':\n newFormatting.italic = !currentFormatting.italic;\n break;\n case 'underline':\n if (currentFormatting.underline?.style && currentFormatting.underline.style !== 'none') {\n newFormatting.underline = undefined;\n } else {\n newFormatting.underline = { style: 'single' };\n }\n break;\n case 'strikethrough':\n newFormatting.strike = !currentFormatting.strike;\n break;\n case 'superscript':\n newFormatting.vertAlign =\n currentFormatting.vertAlign === 'superscript' ? 'baseline' : 'superscript';\n break;\n case 'subscript':\n newFormatting.vertAlign =\n currentFormatting.vertAlign === 'subscript' ? 'baseline' : 'subscript';\n break;\n case 'clearFormatting':\n return {};\n }\n\n return newFormatting;\n}\n\n/**\n * Check if formatting has any active styles\n */\nexport function hasActiveFormatting(formatting?: SelectionFormatting): boolean {\n if (!formatting) return false;\n return !!(\n formatting.bold ||\n formatting.italic ||\n formatting.underline ||\n formatting.strike ||\n formatting.superscript ||\n formatting.subscript\n );\n}\n","/**\n * Formatting Toolbar Component\n *\n * A toolbar with formatting controls for the DOCX editor:\n * - Font family picker\n * - Bold (Ctrl+B), Italic (Ctrl+I), Underline (Ctrl+U), Strikethrough\n * - Superscript, Subscript buttons\n * - Shows active state for current selection formatting\n * - Applies formatting to selection\n */\n\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ParagraphAlignment, Style, Theme } from '@eigenpal/docx-core/types/document';\nimport { FontPicker } from './ui/FontPicker';\nimport { FontSizePicker, halfPointsToPoints } from './ui/FontSizePicker';\nimport { TextColorPicker, HighlightColorPicker } from './ui/ColorPicker';\nimport { AlignmentButtons } from './ui/AlignmentButtons';\nimport { ListButtons, type ListState, createDefaultListState } from './ui/ListButtons';\nimport { LineSpacingPicker } from './ui/LineSpacingPicker';\nimport { StylePicker } from './ui/StylePicker';\nimport { MaterialSymbol } from './ui/MaterialSymbol';\nimport { ZoomControl } from './ui/ZoomControl';\nimport { Button } from './ui/Button';\nimport { Tooltip } from './ui/Tooltip';\nimport { TableGridInline } from './ui/TableGridInline';\nimport { TableBorderPicker } from './ui/TableBorderPicker';\nimport { TableBorderColorPicker } from './ui/TableBorderColorPicker';\nimport { TableBorderWidthPicker } from './ui/TableBorderWidthPicker';\nimport { TableCellFillPicker } from './ui/TableCellFillPicker';\nimport { TableMoreDropdown } from './ui/TableMoreDropdown';\nimport { MenuDropdown } from './ui/MenuDropdown';\nimport type { MenuEntry } from './ui/MenuDropdown';\nimport { ImageWrapDropdown } from './ui/ImageWrapDropdown';\nimport { ImageTransformDropdown } from './ui/ImageTransformDropdown';\nimport type { TableAction } from './ui/TableToolbar';\nimport { cn } from '../lib/utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Current formatting state of the selection\n */\nexport interface SelectionFormatting {\n /** Whether selected text is bold */\n bold?: boolean;\n /** Whether selected text is italic */\n italic?: boolean;\n /** Whether selected text is underlined */\n underline?: boolean;\n /** Whether selected text has strikethrough */\n strike?: boolean;\n /** Whether selected text is superscript */\n superscript?: boolean;\n /** Whether selected text is subscript */\n subscript?: boolean;\n /** Font family of selected text */\n fontFamily?: string;\n /** Font size of selected text (in half-points) */\n fontSize?: number;\n /** Text color */\n color?: string;\n /** Highlight color */\n highlight?: string;\n /** Paragraph alignment */\n alignment?: ParagraphAlignment;\n /** List state of the current paragraph */\n listState?: ListState;\n /** Line spacing in twips (OOXML value, 240 = single spacing) */\n lineSpacing?: number;\n /** Paragraph style ID */\n styleId?: string;\n /** Paragraph left indentation in twips */\n indentLeft?: number;\n}\n\n/**\n * Formatting action types\n */\nexport type FormattingAction =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'superscript'\n | 'subscript'\n | 'clearFormatting'\n | 'bulletList'\n | 'numberedList'\n | 'indent'\n | 'outdent'\n | 'insertLink'\n | { type: 'fontFamily'; value: string }\n | { type: 'fontSize'; value: number }\n | { type: 'textColor'; value: string }\n | { type: 'highlightColor'; value: string }\n | { type: 'alignment'; value: ParagraphAlignment }\n | { type: 'lineSpacing'; value: number }\n | { type: 'applyStyle'; value: string };\n\n/**\n * Props for the Toolbar component\n */\nexport interface ToolbarProps {\n /** Current formatting of the selection */\n currentFormatting?: SelectionFormatting;\n /** Callback when a formatting action is triggered */\n onFormat?: (action: FormattingAction) => void;\n /** Callback for undo action */\n onUndo?: () => void;\n /** Callback for redo action */\n onRedo?: () => void;\n /** Whether undo is available */\n canUndo?: boolean;\n /** Whether redo is available */\n canRedo?: boolean;\n /** Whether the toolbar is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Whether to enable keyboard shortcuts (default: true) */\n enableShortcuts?: boolean;\n /** Ref to the editor container for keyboard events */\n editorRef?: React.RefObject<HTMLElement>;\n /** Custom toolbar items to render */\n children?: ReactNode;\n /** Whether to show font family picker (default: true) */\n showFontPicker?: boolean;\n /** Whether to show font size picker (default: true) */\n showFontSizePicker?: boolean;\n /** Whether to show text color picker (default: true) */\n showTextColorPicker?: boolean;\n /** Whether to show highlight color picker (default: true) */\n showHighlightColorPicker?: boolean;\n /** Whether to show alignment buttons (default: true) */\n showAlignmentButtons?: boolean;\n /** Whether to show list buttons (default: true) */\n showListButtons?: boolean;\n /** Whether to show line spacing picker (default: true) */\n showLineSpacingPicker?: boolean;\n /** Whether to show style picker (default: true) */\n showStylePicker?: boolean;\n /** Document styles for the style picker */\n documentStyles?: Style[];\n /** Theme for the style picker */\n theme?: Theme | null;\n /** Callback for print action */\n onPrint?: () => void;\n /** Whether to show print button (default: true) */\n showPrintButton?: boolean;\n /** Whether to show zoom control (default: true) */\n showZoomControl?: boolean;\n /** Current zoom level (1.0 = 100%) */\n zoom?: number;\n /** Callback when zoom changes */\n onZoomChange?: (zoom: number) => void;\n /** Callback to refocus the editor after toolbar interactions */\n onRefocusEditor?: () => void;\n /** Callback when a table should be inserted */\n onInsertTable?: (rows: number, columns: number) => void;\n /** Whether to show table insert button (default: true) */\n showTableInsert?: boolean;\n /** Callback when user wants to insert an image */\n onInsertImage?: () => void;\n /** Callback when user wants to insert a page break */\n onInsertPageBreak?: () => void;\n /** Callback when user wants to insert a table of contents */\n onInsertTOC?: () => void;\n /** Callback when user wants to insert a shape */\n onInsertShape?: (data: {\n shapeType: string;\n width: number;\n height: number;\n fillColor?: string;\n fillType?: string;\n outlineWidth?: number;\n outlineColor?: string;\n }) => void;\n /** Image context when an image is selected */\n imageContext?: {\n wrapType: string;\n displayMode: string;\n cssFloat: string | null;\n } | null;\n /** Callback when image wrap type changes */\n onImageWrapType?: (wrapType: string) => void;\n /** Callback for image transform (rotate/flip) */\n onImageTransform?: (action: 'rotateCW' | 'rotateCCW' | 'flipH' | 'flipV') => void;\n /** Callback to open image properties dialog (alt text + border) */\n onOpenImageProperties?: () => void;\n /** Table context when cursor is in a table */\n tableContext?: {\n isInTable: boolean;\n rowCount?: number;\n columnCount?: number;\n canSplitCell?: boolean;\n hasMultiCellSelection?: boolean;\n } | null;\n /** Callback when a table action is triggered */\n onTableAction?: (action: TableAction) => void;\n}\n\n/**\n * Props for individual toolbar buttons\n */\nexport interface ToolbarButtonProps {\n /** Whether the button is in active/pressed state */\n active?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Button title/tooltip */\n title?: string;\n /** Click handler */\n onClick?: () => void;\n /** Button content */\n children: ReactNode;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\n/**\n * Props for toolbar button groups\n */\nexport interface ToolbarGroupProps {\n /** Group label for accessibility */\n label?: string;\n /** Group content */\n children: ReactNode;\n /** Additional CSS class name */\n className?: string;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\n// Toolbar uses Tailwind classes now - see the component JSX for styling\n\n// ============================================================================\n// SUBCOMPONENTS\n// ============================================================================\n\n/**\n * Individual toolbar button with shadcn styling\n */\nexport function ToolbarButton({\n active = false,\n disabled = false,\n title,\n onClick,\n children,\n className,\n ariaLabel,\n}: ToolbarButtonProps) {\n // Generate testid from ariaLabel or title\n const testId =\n ariaLabel?.toLowerCase().replace(/\\s+/g, '-') ||\n title\n ?.toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/\\([^)]*\\)/g, '')\n .trim();\n\n // Prevent mousedown from stealing focus from the editor selection\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n const button = (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n 'text-slate-500 hover:text-slate-900 hover:bg-slate-100/80',\n active && 'bg-slate-900 text-white hover:bg-slate-800 hover:text-white',\n disabled && 'opacity-30 cursor-not-allowed',\n className\n )}\n onMouseDown={handleMouseDown}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n aria-pressed={active}\n aria-label={ariaLabel || title}\n data-testid={testId ? `toolbar-${testId}` : undefined}\n >\n {children}\n </Button>\n );\n\n if (title) {\n return <Tooltip content={title}>{button}</Tooltip>;\n }\n\n return button;\n}\n\n/**\n * Toolbar button group with modern styling\n */\nexport function ToolbarGroup({ label, children, className }: ToolbarGroupProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-0.5 px-1 border-r border-slate-200/50 last:border-r-0',\n className\n )}\n role=\"group\"\n aria-label={label}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Toolbar separator\n */\nexport function ToolbarSeparator() {\n return <div className=\"w-px h-6 bg-slate-200 mx-1.5\" role=\"separator\" />;\n}\n\n// ============================================================================\n// ICON SIZE CONSTANT\n// ============================================================================\n\nconst ICON_SIZE = 20;\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Formatting toolbar with all controls\n */\nexport function Toolbar({\n currentFormatting = {},\n onFormat,\n onUndo,\n onRedo,\n canUndo = false,\n canRedo = false,\n disabled = false,\n className,\n style,\n enableShortcuts = true,\n editorRef,\n children,\n showFontPicker = true,\n showFontSizePicker = true,\n showTextColorPicker = true,\n showHighlightColorPicker = true,\n showAlignmentButtons = true,\n showListButtons = true,\n showLineSpacingPicker = true,\n showStylePicker = true,\n documentStyles,\n theme,\n onPrint,\n showPrintButton = true,\n showZoomControl = true,\n zoom,\n onZoomChange,\n onRefocusEditor,\n onInsertTable,\n showTableInsert = true,\n onInsertImage,\n onInsertPageBreak,\n onInsertTOC,\n imageContext,\n onImageWrapType,\n onImageTransform,\n onOpenImageProperties,\n tableContext,\n onTableAction,\n}: ToolbarProps) {\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n /**\n * Handle formatting action\n */\n const handleFormat = useCallback(\n (action: FormattingAction) => {\n if (!disabled && onFormat) {\n onFormat(action);\n }\n },\n [disabled, onFormat]\n );\n\n /**\n * Handle undo\n */\n const handleUndo = useCallback(() => {\n if (!disabled && canUndo && onUndo) {\n onUndo();\n }\n }, [disabled, canUndo, onUndo]);\n\n /**\n * Handle redo\n */\n const handleRedo = useCallback(() => {\n if (!disabled && canRedo && onRedo) {\n onRedo();\n }\n }, [disabled, canRedo, onRedo]);\n\n /**\n * Handle font family change\n */\n const handleFontFamilyChange = useCallback(\n (fontFamily: string) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'fontFamily', value: fontFamily });\n // Refocus editor after dropdown selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle font size change\n */\n const handleFontSizeChange = useCallback(\n (sizeInPoints: number) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'fontSize', value: sizeInPoints });\n // Refocus editor after dropdown selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle text color change\n */\n const handleTextColorChange = useCallback(\n (color: string) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'textColor', value: color });\n // Refocus editor after color picker selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle highlight color change\n */\n const handleHighlightColorChange = useCallback(\n (color: string) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'highlightColor', value: color });\n // Refocus editor after color picker selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle alignment change\n */\n const handleAlignmentChange = useCallback(\n (alignment: ParagraphAlignment) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'alignment', value: alignment });\n }\n },\n [disabled, onFormat]\n );\n\n /**\n * Handle bullet list toggle\n */\n const handleBulletList = useCallback(() => {\n if (!disabled && onFormat) {\n onFormat('bulletList');\n }\n }, [disabled, onFormat]);\n\n /**\n * Handle numbered list toggle\n */\n const handleNumberedList = useCallback(() => {\n if (!disabled && onFormat) {\n onFormat('numberedList');\n }\n }, [disabled, onFormat]);\n\n /**\n * Handle indent (increase paragraph indent or list level)\n */\n const handleIndent = useCallback(() => {\n if (!disabled && onFormat) {\n onFormat('indent');\n }\n }, [disabled, onFormat]);\n\n /**\n * Handle outdent (decrease paragraph indent or list level)\n */\n const handleOutdent = useCallback(() => {\n if (!disabled && onFormat) {\n onFormat('outdent');\n }\n }, [disabled, onFormat]);\n\n /**\n * Handle line spacing change\n */\n const handleLineSpacingChange = useCallback(\n (twipsValue: number) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'lineSpacing', value: twipsValue });\n // Refocus editor after dropdown selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle style change\n */\n const handleStyleChange = useCallback(\n (styleId: string) => {\n if (!disabled && onFormat) {\n onFormat({ type: 'applyStyle', value: styleId });\n // Refocus editor after dropdown selection\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onFormat, onRefocusEditor]\n );\n\n /**\n * Handle table insert\n */\n const handleTableInsert = useCallback(\n (rows: number, columns: number) => {\n if (!disabled && onInsertTable) {\n onInsertTable(rows, columns);\n // Refocus editor after table insert\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onInsertTable, onRefocusEditor]\n );\n\n /**\n * Handle table action\n */\n const handleTableAction = useCallback(\n (action: TableAction) => {\n if (!disabled && onTableAction) {\n onTableAction(action);\n // Refocus editor after table action\n requestAnimationFrame(() => onRefocusEditor?.());\n }\n },\n [disabled, onTableAction, onRefocusEditor]\n );\n\n /**\n * Keyboard shortcuts handler\n */\n useEffect(() => {\n if (!enableShortcuts) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Only process if editor has focus or toolbar has focus\n const target = event.target as HTMLElement;\n const editorContainer = editorRef?.current;\n const toolbarContainer = toolbarRef.current;\n\n const isInEditor = editorContainer?.contains(target);\n const isInToolbar = toolbarContainer?.contains(target);\n\n if (!isInEditor && !isInToolbar) return;\n\n const isCtrl = event.ctrlKey || event.metaKey;\n\n if (isCtrl && !event.altKey) {\n switch (event.key.toLowerCase()) {\n case 'b':\n event.preventDefault();\n handleFormat('bold');\n break;\n case 'i':\n event.preventDefault();\n handleFormat('italic');\n break;\n case 'u':\n event.preventDefault();\n handleFormat('underline');\n break;\n case '=':\n // Ctrl+= for subscript (common shortcut)\n if (event.shiftKey) {\n event.preventDefault();\n handleFormat('superscript');\n } else {\n event.preventDefault();\n handleFormat('subscript');\n }\n break;\n // Alignment shortcuts\n case 'l':\n event.preventDefault();\n handleAlignmentChange('left');\n break;\n case 'e':\n event.preventDefault();\n handleAlignmentChange('center');\n break;\n case 'r':\n event.preventDefault();\n handleAlignmentChange('right');\n break;\n case 'j':\n event.preventDefault();\n handleAlignmentChange('both');\n break;\n case 'k':\n event.preventDefault();\n handleFormat('insertLink');\n break;\n // Undo/Redo handled by useHistory hook\n }\n }\n };\n\n // Add listener to document\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [enableShortcuts, handleFormat, editorRef]);\n\n // Prevent toolbar clicks from stealing focus and refocus editor\n const handleToolbarMouseDown = useCallback((e: React.MouseEvent) => {\n // Allow clicks on input/select elements to work normally\n const target = e.target as HTMLElement;\n const isInteractive =\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.tagName === 'OPTION';\n\n if (!isInteractive) {\n // Prevent the mousedown from stealing focus\n e.preventDefault();\n }\n }, []);\n\n // Refocus editor after toolbar click (called on mouseup)\n const handleToolbarMouseUp = useCallback(\n (e: React.MouseEvent) => {\n // Don't refocus if user is interacting with a select/input\n const target = e.target as HTMLElement;\n const activeEl = document.activeElement as HTMLElement;\n const isSelectActive =\n target.tagName === 'SELECT' ||\n target.tagName === 'OPTION' ||\n activeEl?.tagName === 'SELECT';\n\n if (isSelectActive) {\n return; // Let the select keep focus\n }\n\n // Use requestAnimationFrame to ensure the click action completes first\n requestAnimationFrame(() => {\n onRefocusEditor?.();\n });\n },\n [onRefocusEditor]\n );\n\n return (\n <div\n ref={toolbarRef}\n className={cn(\n 'flex items-center gap-0 px-2 py-2 bg-white border-b border-slate-100 min-h-[44px] overflow-x-auto',\n className\n )}\n style={style}\n role=\"toolbar\"\n aria-label=\"Formatting toolbar\"\n data-testid=\"toolbar\"\n onMouseDown={handleToolbarMouseDown}\n onMouseUp={handleToolbarMouseUp}\n >\n {/* File Menu */}\n {showPrintButton && onPrint && (\n <MenuDropdown\n label=\"File\"\n disabled={disabled}\n items={[{ icon: 'print', label: 'Print', shortcut: 'Ctrl+P', onClick: onPrint }]}\n />\n )}\n\n {/* Insert Menu */}\n <MenuDropdown\n label=\"Insert\"\n disabled={disabled}\n items={[\n ...(onInsertImage\n ? [{ icon: 'image', label: 'Image', onClick: onInsertImage } as MenuEntry]\n : []),\n ...(showTableInsert && onInsertTable\n ? [\n {\n icon: 'grid_on',\n label: 'Table',\n submenuContent: (closeMenu: () => void) => (\n <TableGridInline\n onInsert={(rows: number, cols: number) => {\n handleTableInsert(rows, cols);\n closeMenu();\n }}\n />\n ),\n } as MenuEntry,\n ]\n : []),\n ...(onInsertImage || (showTableInsert && onInsertTable)\n ? [{ type: 'separator' as const } as MenuEntry]\n : []),\n {\n icon: 'page_break',\n label: 'Page break',\n onClick: onInsertPageBreak,\n disabled: !onInsertPageBreak,\n },\n {\n icon: 'format_list_numbered',\n label: 'Table of contents',\n onClick: onInsertTOC,\n disabled: !onInsertTOC,\n },\n ]}\n />\n\n {/* Undo/Redo Group */}\n <ToolbarGroup label=\"History\">\n <ToolbarButton\n onClick={handleUndo}\n disabled={disabled || !canUndo}\n title=\"Undo (Ctrl+Z)\"\n ariaLabel=\"Undo\"\n >\n <MaterialSymbol name=\"undo\" size={ICON_SIZE} />\n </ToolbarButton>\n <ToolbarButton\n onClick={handleRedo}\n disabled={disabled || !canRedo}\n title=\"Redo (Ctrl+Y)\"\n ariaLabel=\"Redo\"\n >\n <MaterialSymbol name=\"redo\" size={ICON_SIZE} />\n </ToolbarButton>\n </ToolbarGroup>\n\n {/* Zoom Control */}\n {showZoomControl && (\n <ToolbarGroup label=\"Zoom\">\n <ZoomControl\n value={zoom}\n onChange={onZoomChange}\n minZoom={0.5}\n maxZoom={2}\n disabled={disabled}\n compact\n showButtons={false}\n />\n </ToolbarGroup>\n )}\n\n {/* Style Picker */}\n {showStylePicker && (\n <ToolbarGroup label=\"Styles\">\n <StylePicker\n value={currentFormatting.styleId || 'Normal'}\n onChange={handleStyleChange}\n styles={documentStyles}\n theme={theme}\n disabled={disabled}\n width={150}\n />\n </ToolbarGroup>\n )}\n\n {/* Font Family and Size Pickers */}\n {(showFontPicker || showFontSizePicker) && (\n <ToolbarGroup label=\"Font\">\n {showFontPicker && (\n <FontPicker\n value={currentFormatting.fontFamily || 'Arial'}\n onChange={handleFontFamilyChange}\n disabled={disabled}\n width={70}\n placeholder=\"Arial\"\n />\n )}\n {showFontSizePicker && (\n <FontSizePicker\n value={\n currentFormatting.fontSize !== undefined\n ? halfPointsToPoints(currentFormatting.fontSize)\n : 11\n }\n onChange={handleFontSizeChange}\n disabled={disabled}\n width={50}\n placeholder=\"11\"\n />\n )}\n </ToolbarGroup>\n )}\n\n {/* Text Formatting Group */}\n <ToolbarGroup label=\"Text formatting\">\n <ToolbarButton\n onClick={() => handleFormat('bold')}\n active={currentFormatting.bold}\n disabled={disabled}\n title=\"Bold (Ctrl+B)\"\n ariaLabel=\"Bold\"\n >\n <MaterialSymbol name=\"format_bold\" size={ICON_SIZE} />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => handleFormat('italic')}\n active={currentFormatting.italic}\n disabled={disabled}\n title=\"Italic (Ctrl+I)\"\n ariaLabel=\"Italic\"\n >\n <MaterialSymbol name=\"format_italic\" size={ICON_SIZE} />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => handleFormat('underline')}\n active={currentFormatting.underline}\n disabled={disabled}\n title=\"Underline (Ctrl+U)\"\n ariaLabel=\"Underline\"\n >\n <MaterialSymbol name=\"format_underlined\" size={ICON_SIZE} />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => handleFormat('strikethrough')}\n active={currentFormatting.strike}\n disabled={disabled}\n title=\"Strikethrough\"\n ariaLabel=\"Strikethrough\"\n >\n <MaterialSymbol name=\"strikethrough_s\" size={ICON_SIZE} />\n </ToolbarButton>\n {showTextColorPicker && (\n <TextColorPicker\n value={currentFormatting.color?.replace(/^#/, '')}\n onChange={handleTextColorChange}\n disabled={disabled}\n title=\"Font Color\"\n />\n )}\n {showHighlightColorPicker && (\n <HighlightColorPicker\n value={currentFormatting.highlight}\n onChange={handleHighlightColorChange}\n disabled={disabled}\n title=\"Text Highlight Color\"\n />\n )}\n <ToolbarButton\n onClick={() => handleFormat('insertLink')}\n disabled={disabled}\n title=\"Insert link (Ctrl+K)\"\n ariaLabel=\"Insert link\"\n >\n <MaterialSymbol name=\"link\" size={ICON_SIZE} />\n </ToolbarButton>\n </ToolbarGroup>\n\n {/* Superscript/Subscript Group */}\n <ToolbarGroup label=\"Script\">\n <ToolbarButton\n onClick={() => handleFormat('superscript')}\n active={currentFormatting.superscript}\n disabled={disabled}\n title=\"Superscript (Ctrl+Shift+=)\"\n ariaLabel=\"Superscript\"\n >\n <MaterialSymbol name=\"superscript\" size={ICON_SIZE} />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => handleFormat('subscript')}\n active={currentFormatting.subscript}\n disabled={disabled}\n title=\"Subscript (Ctrl+=)\"\n ariaLabel=\"Subscript\"\n >\n <MaterialSymbol name=\"subscript\" size={ICON_SIZE} />\n </ToolbarButton>\n </ToolbarGroup>\n\n {/* Alignment Dropdown */}\n {showAlignmentButtons && (\n <AlignmentButtons\n value={currentFormatting.alignment || 'left'}\n onChange={handleAlignmentChange}\n disabled={disabled}\n />\n )}\n\n {/* List Buttons and Line Spacing */}\n {(showListButtons || showLineSpacingPicker) && (\n <ToolbarGroup label=\"List formatting\">\n {showListButtons && (\n <ListButtons\n listState={currentFormatting.listState || createDefaultListState()}\n onBulletList={handleBulletList}\n onNumberedList={handleNumberedList}\n onIndent={handleIndent}\n onOutdent={handleOutdent}\n disabled={disabled}\n showIndentButtons={true}\n compact\n hasIndent={(currentFormatting.indentLeft ?? 0) > 0}\n />\n )}\n {showLineSpacingPicker && (\n <LineSpacingPicker\n value={currentFormatting.lineSpacing}\n onChange={handleLineSpacingChange}\n disabled={disabled}\n />\n )}\n </ToolbarGroup>\n )}\n\n {/* Image controls - shown when image is selected */}\n {imageContext && onImageWrapType && (\n <ToolbarGroup label=\"Image\">\n <ImageWrapDropdown\n imageContext={imageContext}\n onChange={onImageWrapType}\n disabled={disabled}\n />\n {onImageTransform && (\n <ImageTransformDropdown onTransform={onImageTransform} disabled={disabled} />\n )}\n {onOpenImageProperties && (\n <ToolbarButton\n onClick={onOpenImageProperties}\n disabled={disabled}\n title=\"Image properties (alt text, border)...\"\n ariaLabel=\"Image properties\"\n >\n <MaterialSymbol name=\"tune\" size={ICON_SIZE} />\n </ToolbarButton>\n )}\n </ToolbarGroup>\n )}\n\n {/* Table Options - shown when cursor is in a table */}\n {tableContext?.isInTable && onTableAction && (\n <ToolbarGroup label=\"Table\">\n <TableBorderPicker onAction={handleTableAction} disabled={disabled} />\n <TableBorderColorPicker onAction={handleTableAction} disabled={disabled} />\n <TableBorderWidthPicker onAction={handleTableAction} disabled={disabled} />\n <TableCellFillPicker onAction={handleTableAction} disabled={disabled} />\n <TableMoreDropdown\n onAction={handleTableAction}\n disabled={disabled}\n tableContext={tableContext}\n />\n </ToolbarGroup>\n )}\n\n {/* Clear Formatting */}\n <ToolbarButton\n onClick={() => handleFormat('clearFormatting')}\n disabled={disabled}\n title=\"Clear formatting\"\n ariaLabel=\"Clear formatting\"\n >\n <MaterialSymbol name=\"format_clear\" size={ICON_SIZE} />\n </ToolbarButton>\n\n {/* Custom toolbar items */}\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// RE-EXPORTED UTILITIES (from toolbarUtils.ts)\n// ============================================================================\n\nexport {\n getSelectionFormatting,\n applyFormattingAction,\n hasActiveFormatting,\n mapHexToHighlightName,\n} from './toolbarUtils';\n\nexport default Toolbar;\n","/**\n * PageNumberIndicator Component\n *\n * Displays the current page number and total page count.\n * Can be used as a floating indicator or status bar element.\n */\n\nimport React, { useMemo } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Position options for the indicator\n */\nexport type PageIndicatorPosition =\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'top-left'\n | 'top-center'\n | 'top-right';\n\n/**\n * Style variant for the indicator\n */\nexport type PageIndicatorVariant = 'default' | 'minimal' | 'badge' | 'pill';\n\n/**\n * Props for PageNumberIndicator\n */\nexport interface PageNumberIndicatorProps {\n /** Current page number (1-indexed) */\n currentPage: number;\n /** Total number of pages */\n totalPages: number;\n /** Position of the indicator (default: 'bottom-center') */\n position?: PageIndicatorPosition;\n /** Style variant (default: 'default') */\n variant?: PageIndicatorVariant;\n /** Whether to show as floating overlay (default: true) */\n floating?: boolean;\n /** Whether to show \"Page\" prefix (default: true) */\n showPrefix?: boolean;\n /** Custom format function for the display text */\n formatText?: (current: number, total: number) => string;\n /** Callback when page number is clicked (for navigation) */\n onClick?: () => void;\n /** Whether the indicator is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Custom content (overrides default display) */\n children?: ReactNode;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst BASE_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '13px',\n userSelect: 'none',\n transition: 'opacity 0.2s, transform 0.2s',\n};\n\nconst FLOATING_STYLE: CSSProperties = {\n position: 'absolute',\n zIndex: 100,\n pointerEvents: 'auto',\n};\n\nconst VARIANT_STYLES: Record<PageIndicatorVariant, CSSProperties> = {\n default: {\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n color: 'var(--doc-text)',\n padding: '6px 12px',\n borderRadius: '4px',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n },\n minimal: {\n backgroundColor: 'transparent',\n color: 'var(--doc-text-muted)',\n padding: '4px 8px',\n },\n badge: {\n backgroundColor: 'var(--doc-primary)',\n color: 'white',\n padding: '4px 10px',\n borderRadius: '4px',\n fontWeight: 500,\n fontSize: '12px',\n },\n pill: {\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n color: 'white',\n padding: '6px 14px',\n borderRadius: '16px',\n fontSize: '12px',\n fontWeight: 500,\n },\n};\n\nconst POSITION_STYLES: Record<PageIndicatorPosition, CSSProperties> = {\n 'bottom-left': {\n bottom: '16px',\n left: '16px',\n },\n 'bottom-center': {\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'bottom-right': {\n bottom: '16px',\n right: '16px',\n },\n 'top-left': {\n top: '16px',\n left: '16px',\n },\n 'top-center': {\n top: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'top-right': {\n top: '16px',\n right: '16px',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * PageNumberIndicator - Displays current page and total pages\n */\nexport function PageNumberIndicator({\n currentPage,\n totalPages,\n position = 'bottom-center',\n variant = 'default',\n floating = true,\n showPrefix = true,\n formatText,\n onClick,\n disabled = false,\n className = '',\n style,\n children,\n}: PageNumberIndicatorProps): React.ReactElement {\n // Calculate display text\n const displayText = useMemo(() => {\n if (formatText) {\n return formatText(currentPage, totalPages);\n }\n if (showPrefix) {\n return `Page ${currentPage} of ${totalPages}`;\n }\n return `${currentPage} / ${totalPages}`;\n }, [currentPage, totalPages, formatText, showPrefix]);\n\n // Combine styles\n const combinedStyle: CSSProperties = {\n ...BASE_STYLE,\n ...VARIANT_STYLES[variant],\n ...(floating ? FLOATING_STYLE : {}),\n ...(floating ? POSITION_STYLES[position] : {}),\n ...(onClick && !disabled ? { cursor: 'pointer' } : {}),\n ...(disabled ? { opacity: 0.5, pointerEvents: 'none' } : {}),\n ...style,\n };\n\n // Handle click\n const handleClick = () => {\n if (!disabled && onClick) {\n onClick();\n }\n };\n\n return (\n <div\n className={`docx-page-indicator docx-page-indicator-${variant} ${className}`}\n style={combinedStyle}\n onClick={handleClick}\n role={onClick ? 'button' : 'status'}\n aria-label={`Page ${currentPage} of ${totalPages}`}\n aria-live=\"polite\"\n tabIndex={onClick && !disabled ? 0 : undefined}\n onKeyDown={(e) => {\n if (onClick && !disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n }}\n >\n {children || displayText}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Format page number with ordinal suffix (1st, 2nd, 3rd, etc.)\n */\nexport function formatPageOrdinal(page: number): string {\n const suffixes = ['th', 'st', 'nd', 'rd'];\n const v = page % 100;\n return page + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\n\n/**\n * Create a custom format function\n */\nexport function createPageFormat(template: string): (current: number, total: number) => string {\n return (current: number, total: number) => {\n return template\n .replace('{current}', String(current))\n .replace('{total}', String(total))\n .replace('{ordinal}', formatPageOrdinal(current));\n };\n}\n\n/**\n * Get percentage progress through document\n */\nexport function getPageProgress(current: number, total: number): number {\n if (total <= 1) return 100;\n return Math.round(((current - 1) / (total - 1)) * 100);\n}\n\n/**\n * Check if at first page\n */\nexport function isFirstPage(current: number): boolean {\n return current === 1;\n}\n\n/**\n * Check if at last page\n */\nexport function isLastPage(current: number, total: number): boolean {\n return current === total;\n}\n\n/**\n * Calculate which page is visible given scroll position\n */\nexport function calculateVisiblePage(\n scrollTop: number,\n pageHeights: number[],\n pageGap: number = 20\n): number {\n let accumulatedHeight = 0;\n\n for (let i = 0; i < pageHeights.length; i++) {\n const pageStart = accumulatedHeight;\n const pageEnd = accumulatedHeight + pageHeights[i];\n const pageMiddle = (pageStart + pageEnd) / 2;\n\n // Consider a page \"visible\" when its middle is in view\n if (scrollTop < pageMiddle) {\n return i + 1; // 1-indexed\n }\n\n accumulatedHeight = pageEnd + pageGap;\n }\n\n return pageHeights.length; // Return last page if scrolled past all\n}\n\n/**\n * Calculate scroll position to center a page\n */\nexport function calculateScrollToPage(\n pageNumber: number,\n pageHeights: number[],\n containerHeight: number,\n pageGap: number = 20\n): number {\n if (pageNumber < 1 || pageNumber > pageHeights.length) {\n return 0;\n }\n\n let scrollTop = 0;\n\n for (let i = 0; i < pageNumber - 1; i++) {\n scrollTop += pageHeights[i] + pageGap;\n }\n\n // Center the page if possible\n const pageHeight = pageHeights[pageNumber - 1];\n const offset = Math.max(0, (containerHeight - pageHeight) / 2);\n\n return Math.max(0, scrollTop - offset);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default PageNumberIndicator;\n","/**\n * PageNavigator Component\n *\n * Provides UI for navigating between pages in a paginated document.\n * Includes:\n * - Previous/Next page buttons\n * - Current page display (clickable to show input)\n * - Page number input for direct navigation\n * - Keyboard navigation support\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Position options for the navigator\n */\nexport type PageNavigatorPosition =\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'top-left'\n | 'top-center'\n | 'top-right';\n\n/**\n * Style variant for the navigator\n */\nexport type PageNavigatorVariant = 'default' | 'compact' | 'minimal';\n\n/**\n * Props for PageNavigator\n */\nexport interface PageNavigatorProps {\n /** Current page number (1-indexed) */\n currentPage: number;\n /** Total number of pages */\n totalPages: number;\n /** Callback when page navigation is requested */\n onNavigate: (pageNumber: number) => void;\n /** Position of the navigator (default: 'bottom-center') */\n position?: PageNavigatorPosition;\n /** Style variant (default: 'default') */\n variant?: PageNavigatorVariant;\n /** Whether to show as floating overlay (default: true) */\n floating?: boolean;\n /** Whether to show previous/next buttons (default: true) */\n showButtons?: boolean;\n /** Whether the navigator is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n}\n\n/**\n * Props for the page input popover\n */\ninterface PageInputPopoverProps {\n currentPage: number;\n totalPages: number;\n onNavigate: (pageNumber: number) => void;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nfunction ChevronLeftIcon(): React.ReactElement {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon(): React.ReactElement {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nfunction ChevronUpIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst BASE_STYLE: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '13px',\n userSelect: 'none',\n transition: 'opacity 0.2s',\n};\n\nconst FLOATING_STYLE: CSSProperties = {\n position: 'absolute',\n zIndex: 100,\n pointerEvents: 'auto',\n};\n\nconst VARIANT_STYLES: Record<PageNavigatorVariant, CSSProperties> = {\n default: {\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n color: 'var(--doc-text)',\n padding: '4px 8px',\n borderRadius: '6px',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n },\n compact: {\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n color: 'var(--doc-text)',\n padding: '2px 4px',\n borderRadius: '4px',\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.1)',\n border: '1px solid rgba(0, 0, 0, 0.08)',\n fontSize: '12px',\n },\n minimal: {\n backgroundColor: 'transparent',\n color: 'var(--doc-text-muted)',\n padding: '4px',\n },\n};\n\nconst POSITION_STYLES: Record<PageNavigatorPosition, CSSProperties> = {\n 'bottom-left': {\n bottom: '16px',\n left: '16px',\n },\n 'bottom-center': {\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'bottom-right': {\n bottom: '16px',\n right: '16px',\n },\n 'top-left': {\n top: '16px',\n left: '16px',\n },\n 'top-center': {\n top: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'top-right': {\n top: '16px',\n right: '16px',\n },\n};\n\nconst BUTTON_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--doc-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n};\n\nconst BUTTON_HOVER_STYLE: CSSProperties = {\n backgroundColor: 'var(--doc-bg-hover)',\n color: 'var(--doc-text)',\n};\n\nconst BUTTON_DISABLED_STYLE: CSSProperties = {\n opacity: 0.4,\n cursor: 'not-allowed',\n};\n\nconst PAGE_DISPLAY_STYLE: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '4px 8px',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n minWidth: '80px',\n justifyContent: 'center',\n};\n\nconst PAGE_DISPLAY_HOVER_STYLE: CSSProperties = {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n};\n\n// ============================================================================\n// PAGE INPUT POPOVER\n// ============================================================================\n\n/**\n * Popover with page number input\n */\nfunction PageInputPopover({\n currentPage,\n totalPages,\n onNavigate,\n onClose,\n anchorRef,\n}: PageInputPopoverProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(String(currentPage));\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n // Focus input on mount\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(event.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [onClose, anchorRef]);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [onClose]);\n\n // Validate and navigate\n const handleSubmit = useCallback(() => {\n const pageNum = parseInt(inputValue, 10);\n\n if (isNaN(pageNum)) {\n setError('Please enter a number');\n return;\n }\n\n if (pageNum < 1 || pageNum > totalPages) {\n setError(`Page must be 1-${totalPages}`);\n return;\n }\n\n onNavigate(pageNum);\n onClose();\n }, [inputValue, totalPages, onNavigate, onClose]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n setError(null);\n };\n\n // Handle key press\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const newValue = Math.min(parseInt(inputValue, 10) + 1 || 1, totalPages);\n setInputValue(String(newValue));\n setError(null);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n const newValue = Math.max(parseInt(inputValue, 10) - 1 || 1, 1);\n setInputValue(String(newValue));\n setError(null);\n }\n };\n\n // Quick navigation buttons\n const handleFirst = () => {\n onNavigate(1);\n onClose();\n };\n\n const handleLast = () => {\n onNavigate(totalPages);\n onClose();\n };\n\n const popoverStyle: CSSProperties = {\n position: 'absolute',\n bottom: 'calc(100% + 8px)',\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: 'white',\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.2)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n padding: '12px',\n minWidth: '200px',\n zIndex: 1000,\n };\n\n const inputContainerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: error ? '4px' : '12px',\n };\n\n const inputStyle: CSSProperties = {\n flex: 1,\n padding: '8px 12px',\n fontSize: '14px',\n border: error ? '1px solid var(--doc-error)' : '1px solid var(--doc-border)',\n borderRadius: '4px',\n outline: 'none',\n textAlign: 'center',\n fontFamily: 'inherit',\n };\n\n const goButtonStyle: CSSProperties = {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n backgroundColor: 'var(--doc-primary)',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n };\n\n const errorStyle: CSSProperties = {\n color: 'var(--doc-error)',\n fontSize: '12px',\n marginBottom: '8px',\n };\n\n const quickNavStyle: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n gap: '8px',\n };\n\n const quickButtonStyle: CSSProperties = {\n flex: 1,\n padding: '6px 12px',\n fontSize: '12px',\n backgroundColor: 'var(--doc-bg-muted)',\n color: 'var(--doc-text)',\n border: '1px solid var(--doc-border-light)',\n borderRadius: '4px',\n cursor: 'pointer',\n };\n\n return (\n <div ref={popoverRef} style={popoverStyle} role=\"dialog\" aria-label=\"Go to page\">\n <div\n style={{\n fontSize: '12px',\n color: 'var(--doc-text-muted)',\n marginBottom: '8px',\n textAlign: 'center',\n }}\n >\n Go to page (1-{totalPages})\n </div>\n\n <div style={inputContainerStyle}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n style={inputStyle}\n aria-label=\"Page number\"\n aria-invalid={!!error}\n />\n <button onClick={handleSubmit} style={goButtonStyle} type=\"button\">\n Go\n </button>\n </div>\n\n {error && <div style={errorStyle}>{error}</div>}\n\n <div style={quickNavStyle}>\n <button\n onClick={handleFirst}\n style={quickButtonStyle}\n disabled={currentPage === 1}\n type=\"button\"\n >\n First\n </button>\n <button\n onClick={handleLast}\n style={quickButtonStyle}\n disabled={currentPage === totalPages}\n type=\"button\"\n >\n Last\n </button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * PageNavigator - Navigation controls for paginated documents\n */\nexport function PageNavigator({\n currentPage,\n totalPages,\n onNavigate,\n position = 'bottom-center',\n variant = 'default',\n floating = true,\n showButtons = true,\n disabled = false,\n className = '',\n style,\n}: PageNavigatorProps): React.ReactElement {\n const [showPopover, setShowPopover] = useState(false);\n const [prevHovered, setPrevHovered] = useState(false);\n const [nextHovered, setNextHovered] = useState(false);\n const [displayHovered, setDisplayHovered] = useState(false);\n const pageDisplayRef = useRef<HTMLButtonElement>(null);\n\n // Check if navigation is possible\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n\n // Handle previous page\n const handlePrev = useCallback(() => {\n if (canGoPrev && !disabled) {\n onNavigate(currentPage - 1);\n }\n }, [canGoPrev, disabled, currentPage, onNavigate]);\n\n // Handle next page\n const handleNext = useCallback(() => {\n if (canGoNext && !disabled) {\n onNavigate(currentPage + 1);\n }\n }, [canGoNext, disabled, currentPage, onNavigate]);\n\n // Handle keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n if (e.key === 'ArrowLeft' || e.key === 'PageUp') {\n e.preventDefault();\n handlePrev();\n } else if (e.key === 'ArrowRight' || e.key === 'PageDown') {\n e.preventDefault();\n handleNext();\n } else if (e.key === 'Home') {\n e.preventDefault();\n onNavigate(1);\n } else if (e.key === 'End') {\n e.preventDefault();\n onNavigate(totalPages);\n }\n },\n [disabled, handlePrev, handleNext, onNavigate, totalPages]\n );\n\n // Toggle popover\n const togglePopover = useCallback(() => {\n if (!disabled) {\n setShowPopover((prev) => !prev);\n }\n }, [disabled]);\n\n // Close popover\n const closePopover = useCallback(() => {\n setShowPopover(false);\n }, []);\n\n // Handle navigation from popover\n const handlePopoverNavigate = useCallback(\n (pageNumber: number) => {\n onNavigate(pageNumber);\n closePopover();\n },\n [onNavigate, closePopover]\n );\n\n // Combine styles\n const combinedStyle: CSSProperties = {\n ...BASE_STYLE,\n ...VARIANT_STYLES[variant],\n ...(floating ? FLOATING_STYLE : {}),\n ...(floating ? POSITION_STYLES[position] : {}),\n ...(disabled ? { opacity: 0.5, pointerEvents: 'none' } : {}),\n ...style,\n };\n\n const prevButtonStyle: CSSProperties = {\n ...BUTTON_STYLE,\n ...(variant === 'compact' ? { width: '24px', height: '24px' } : {}),\n ...(prevHovered && canGoPrev ? BUTTON_HOVER_STYLE : {}),\n ...(!canGoPrev ? BUTTON_DISABLED_STYLE : {}),\n };\n\n const nextButtonStyle: CSSProperties = {\n ...BUTTON_STYLE,\n ...(variant === 'compact' ? { width: '24px', height: '24px' } : {}),\n ...(nextHovered && canGoNext ? BUTTON_HOVER_STYLE : {}),\n ...(!canGoNext ? BUTTON_DISABLED_STYLE : {}),\n };\n\n const pageDisplayStyleCombined: CSSProperties = {\n ...PAGE_DISPLAY_STYLE,\n ...(variant === 'compact' ? { padding: '2px 6px', minWidth: '60px' } : {}),\n ...(displayHovered && !disabled ? PAGE_DISPLAY_HOVER_STYLE : {}),\n ...(disabled ? { cursor: 'not-allowed' } : {}),\n };\n\n return (\n <div\n className={`docx-page-navigator docx-page-navigator-${variant} ${className}`}\n style={combinedStyle}\n role=\"navigation\"\n aria-label=\"Page navigation\"\n onKeyDown={handleKeyDown}\n tabIndex={0}\n >\n {/* Previous button */}\n {showButtons && (\n <button\n onClick={handlePrev}\n disabled={!canGoPrev || disabled}\n style={prevButtonStyle}\n onMouseEnter={() => setPrevHovered(true)}\n onMouseLeave={() => setPrevHovered(false)}\n aria-label=\"Previous page\"\n title=\"Previous page (←)\"\n type=\"button\"\n >\n <ChevronLeftIcon />\n </button>\n )}\n\n {/* Page display / toggle popover */}\n <div style={{ position: 'relative' }}>\n <button\n ref={pageDisplayRef}\n onClick={togglePopover}\n style={pageDisplayStyleCombined}\n onMouseEnter={() => setDisplayHovered(true)}\n onMouseLeave={() => setDisplayHovered(false)}\n aria-haspopup=\"dialog\"\n aria-expanded={showPopover}\n aria-label={`Page ${currentPage} of ${totalPages}. Click to go to a specific page.`}\n title=\"Click to go to a specific page\"\n disabled={disabled}\n type=\"button\"\n >\n <span>\n Page <strong>{currentPage}</strong> of {totalPages}\n </span>\n {showPopover ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </button>\n\n {/* Page input popover */}\n {showPopover && (\n <PageInputPopover\n currentPage={currentPage}\n totalPages={totalPages}\n onNavigate={handlePopoverNavigate}\n onClose={closePopover}\n anchorRef={pageDisplayRef}\n />\n )}\n </div>\n\n {/* Next button */}\n {showButtons && (\n <button\n onClick={handleNext}\n disabled={!canGoNext || disabled}\n style={nextButtonStyle}\n onMouseEnter={() => setNextHovered(true)}\n onMouseLeave={() => setNextHovered(false)}\n aria-label=\"Next page\"\n title=\"Next page (→)\"\n type=\"button\"\n >\n <ChevronRightIcon />\n </button>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate page number from keyboard input\n */\nexport function parsePageInput(input: string): number | null {\n const trimmed = input.trim();\n const num = parseInt(trimmed, 10);\n return isNaN(num) ? null : num;\n}\n\n/**\n * Validate page number\n */\nexport function isValidPageNumber(page: number, totalPages: number): boolean {\n return Number.isInteger(page) && page >= 1 && page <= totalPages;\n}\n\n/**\n * Clamp page number to valid range\n */\nexport function clampPageNumber(page: number, totalPages: number): number {\n return Math.min(Math.max(1, Math.round(page)), totalPages);\n}\n\n/**\n * Get navigation info for keyboard shortcuts\n */\nexport function getNavigationShortcuts(): Array<{ key: string; description: string }> {\n return [\n { key: '← or PageUp', description: 'Previous page' },\n { key: '→ or PageDown', description: 'Next page' },\n { key: 'Home', description: 'First page' },\n { key: 'End', description: 'Last page' },\n { key: 'Enter (in input)', description: 'Go to page' },\n ];\n}\n\n/**\n * Format page range for display\n */\nexport function formatPageRange(start: number, end: number, total: number): string {\n if (start === end) {\n return `Page ${start} of ${total}`;\n }\n return `Pages ${start}-${end} of ${total}`;\n}\n\n/**\n * Calculate progress percentage\n */\nexport function calculateProgress(current: number, total: number): number {\n if (total <= 1) return 100;\n return Math.round(((current - 1) / (total - 1)) * 100);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default PageNavigator;\n","/**\n * HorizontalRuler Component — Google Docs style\n *\n * 3 handles only:\n * - Left side: first-line indent (▼ down at top) + left indent (▲ up at bottom)\n * - Right side: right indent (▼ down at top)\n *\n * Margins shown as gray zones on the ruler edges.\n * Drag the boundary between gray/white to adjust page margins.\n * Drag tooltip shows value during any drag.\n */\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { SectionProperties, TabStop } from '@eigenpal/docx-core/types/document';\nimport { twipsToPixels, pixelsToTwips, formatPx } from '@eigenpal/docx-core/utils/units';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface HorizontalRulerProps {\n sectionProps?: SectionProperties | null;\n zoom?: number;\n editable?: boolean;\n onLeftMarginChange?: (marginTwips: number) => void;\n onRightMarginChange?: (marginTwips: number) => void;\n onFirstLineIndentChange?: (indentTwips: number) => void;\n showFirstLineIndent?: boolean;\n firstLineIndent?: number;\n hangingIndent?: boolean;\n indentLeft?: number;\n indentRight?: number;\n onIndentLeftChange?: (indentTwips: number) => void;\n onIndentRightChange?: (indentTwips: number) => void;\n unit?: 'inch' | 'cm';\n className?: string;\n style?: CSSProperties;\n tabStops?: TabStop[] | null;\n onTabStopRemove?: (positionTwips: number) => void;\n}\n\ntype MarkerType = 'leftMargin' | 'rightMargin' | 'firstLineIndent' | 'leftIndent' | 'rightIndent';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEFAULT_PAGE_WIDTH_TWIPS = 12240;\nconst DEFAULT_MARGIN_TWIPS = 1440;\nconst TWIPS_PER_INCH = 1440;\nconst TWIPS_PER_CM = 567;\n\nconst RULER_HEIGHT = 22;\nconst RULER_TEXT_COLOR = 'var(--doc-text-muted)';\nconst RULER_TICK_COLOR = 'var(--doc-text-subtle)';\nconst MARGIN_ZONE_COLOR = 'rgba(0, 0, 0, 0.06)';\nconst INDENT_COLOR = '#4285f4';\nconst INDENT_HOVER_COLOR = '#3367d6';\nconst INDENT_ACTIVE_COLOR = '#2a56c6';\n\nconst TRI_SIZE = 5; // triangle half-width in px\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction formatValueForTooltip(twips: number, unit: 'inch' | 'cm'): string {\n if (unit === 'inch') {\n return (twips / TWIPS_PER_INCH).toFixed(2) + '\"';\n }\n return (twips / TWIPS_PER_CM).toFixed(1) + ' cm';\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function HorizontalRuler({\n sectionProps,\n zoom = 1,\n editable = false,\n onLeftMarginChange,\n onRightMarginChange,\n onFirstLineIndentChange,\n showFirstLineIndent = false,\n firstLineIndent = 0,\n hangingIndent = false,\n indentLeft = 0,\n indentRight = 0,\n onIndentLeftChange,\n onIndentRightChange,\n unit = 'inch',\n className = '',\n style,\n tabStops,\n onTabStopRemove,\n}: HorizontalRulerProps): React.ReactElement {\n const [dragging, setDragging] = useState<MarkerType | null>(null);\n const [hoveredMarker, setHoveredMarker] = useState<MarkerType | null>(null);\n const [dragValue, setDragValue] = useState<number | null>(null);\n const [dragPositionPx, setDragPositionPx] = useState<number | null>(null);\n const rulerRef = useRef<HTMLDivElement>(null);\n\n // Page dimensions\n const pageWidthTwips = sectionProps?.pageWidth ?? DEFAULT_PAGE_WIDTH_TWIPS;\n const leftMarginTwips = sectionProps?.marginLeft ?? DEFAULT_MARGIN_TWIPS;\n const rightMarginTwips = sectionProps?.marginRight ?? DEFAULT_MARGIN_TWIPS;\n const contentTwips = pageWidthTwips - leftMarginTwips - rightMarginTwips;\n\n // Pixel conversions\n const pageWidthPx = twipsToPixels(pageWidthTwips) * zoom;\n const leftMarginPx = twipsToPixels(leftMarginTwips) * zoom;\n const rightMarginPx = twipsToPixels(rightMarginTwips) * zoom;\n const indentLeftPx = twipsToPixels(indentLeft) * zoom;\n const indentRightPx = twipsToPixels(indentRight) * zoom;\n\n // First line indent: hanging goes left, normal goes right\n const effectiveFirstLineIndent = hangingIndent ? -firstLineIndent : firstLineIndent;\n const firstLineIndentPx = twipsToPixels(effectiveFirstLineIndent) * zoom;\n\n // Handle positions (in px from ruler left edge)\n const leftIndentPosPx = leftMarginPx + indentLeftPx;\n const rightIndentPosPx = pageWidthPx - rightMarginPx - indentRightPx;\n const firstLinePosPx = leftMarginPx + indentLeftPx + firstLineIndentPx;\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent, marker: MarkerType) => {\n if (!editable) return;\n e.preventDefault();\n e.stopPropagation();\n setDragging(marker);\n },\n [editable]\n );\n\n const handleDrag = useCallback(\n (e: MouseEvent) => {\n if (!dragging || !rulerRef.current) return;\n\n const rect = rulerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n setDragPositionPx(x);\n const positionTwips = pixelsToTwips(x / zoom);\n\n if (dragging === 'leftMargin') {\n const maxMargin = pageWidthTwips - rightMarginTwips - 720;\n const rounded = Math.round(Math.max(0, Math.min(positionTwips, maxMargin)));\n setDragValue(rounded);\n onLeftMarginChange?.(rounded);\n } else if (dragging === 'rightMargin') {\n const fromRight = pageWidthTwips - positionTwips;\n const maxMargin = pageWidthTwips - leftMarginTwips - 720;\n const rounded = Math.round(Math.max(0, Math.min(fromRight, maxMargin)));\n setDragValue(rounded);\n onRightMarginChange?.(rounded);\n } else if (dragging === 'firstLineIndent') {\n const base = leftMarginTwips + indentLeft;\n const indentFromBase = positionTwips - base;\n const maxIndent = contentTwips - indentLeft - indentRight - 720;\n const rounded = Math.round(Math.max(-indentLeft, Math.min(indentFromBase, maxIndent)));\n setDragValue(rounded);\n onFirstLineIndentChange?.(rounded);\n } else if (dragging === 'leftIndent') {\n const indentFromMargin = positionTwips - leftMarginTwips;\n const maxIndent = contentTwips - indentRight - 720;\n const rounded = Math.round(Math.max(0, Math.min(indentFromMargin, maxIndent)));\n setDragValue(rounded);\n onIndentLeftChange?.(rounded);\n } else if (dragging === 'rightIndent') {\n const rightEdge = pageWidthTwips - rightMarginTwips;\n const indentFromRight = rightEdge - positionTwips;\n const maxIndent = contentTwips - indentLeft - 720;\n const rounded = Math.round(Math.max(0, Math.min(indentFromRight, maxIndent)));\n setDragValue(rounded);\n onIndentRightChange?.(rounded);\n }\n },\n [\n dragging,\n zoom,\n pageWidthTwips,\n leftMarginTwips,\n rightMarginTwips,\n contentTwips,\n indentLeft,\n indentRight,\n onLeftMarginChange,\n onRightMarginChange,\n onFirstLineIndentChange,\n onIndentLeftChange,\n onIndentRightChange,\n ]\n );\n\n const handleDragEnd = useCallback(() => {\n setDragging(null);\n setDragValue(null);\n setDragPositionPx(null);\n }, []);\n\n useEffect(() => {\n if (dragging) {\n document.addEventListener('mousemove', handleDrag);\n document.addEventListener('mouseup', handleDragEnd);\n return () => {\n document.removeEventListener('mousemove', handleDrag);\n document.removeEventListener('mouseup', handleDragEnd);\n };\n }\n }, [dragging, handleDrag, handleDragEnd]);\n\n const ticks = generateTicks(pageWidthTwips, zoom, unit);\n\n return (\n <div\n ref={rulerRef}\n className={`docx-horizontal-ruler ${className}`}\n style={{\n position: 'relative',\n width: formatPx(pageWidthPx),\n height: RULER_HEIGHT,\n backgroundColor: 'transparent',\n overflow: 'visible',\n userSelect: 'none',\n cursor: dragging ? 'ew-resize' : 'default',\n ...style,\n }}\n role=\"slider\"\n aria-label=\"Horizontal ruler\"\n aria-valuemin={0}\n aria-valuemax={pageWidthTwips}\n >\n {/* Gray margin zones — click & drag anywhere in the gray area to adjust margin */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: formatPx(leftMarginPx),\n height: RULER_HEIGHT,\n backgroundColor: MARGIN_ZONE_COLOR,\n borderRight: '1px solid rgba(0,0,0,0.12)',\n cursor: editable ? 'ew-resize' : 'default',\n zIndex: 1,\n }}\n onMouseDown={\n editable && onLeftMarginChange ? (e) => handleDragStart(e, 'leftMargin') : undefined\n }\n />\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: formatPx(rightMarginPx),\n height: RULER_HEIGHT,\n backgroundColor: MARGIN_ZONE_COLOR,\n borderLeft: '1px solid rgba(0,0,0,0.12)',\n cursor: editable ? 'ew-resize' : 'default',\n zIndex: 1,\n }}\n onMouseDown={\n editable && onRightMarginChange ? (e) => handleDragStart(e, 'rightMargin') : undefined\n }\n />\n\n {/* Tick marks */}\n <div style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}>\n {ticks.map((tick, i) => (\n <RulerTick key={i} tick={tick} />\n ))}\n </div>\n\n {/* === 3 INDENT HANDLES (Google Docs style) === */}\n\n {/* First-line indent — ▼ down triangle at top-left */}\n {showFirstLineIndent && (\n <IndentTriangle\n direction=\"down\"\n positionPx={firstLinePosPx}\n editable={editable}\n isDragging={dragging === 'firstLineIndent'}\n isHovered={hoveredMarker === 'firstLineIndent'}\n onMouseEnter={() => setHoveredMarker('firstLineIndent')}\n onMouseLeave={() => setHoveredMarker(null)}\n onMouseDown={(e) => handleDragStart(e, 'firstLineIndent')}\n label=\"First line indent\"\n />\n )}\n\n {/* Left indent — ▲ up triangle at bottom-left */}\n {editable && onIndentLeftChange && (\n <IndentTriangle\n direction=\"up\"\n positionPx={leftIndentPosPx}\n editable={editable}\n isDragging={dragging === 'leftIndent'}\n isHovered={hoveredMarker === 'leftIndent'}\n onMouseEnter={() => setHoveredMarker('leftIndent')}\n onMouseLeave={() => setHoveredMarker(null)}\n onMouseDown={(e) => handleDragStart(e, 'leftIndent')}\n label=\"Left indent\"\n />\n )}\n\n {/* Right indent — ▼ down triangle at top-right */}\n {editable && onIndentRightChange && (\n <IndentTriangle\n direction=\"down\"\n positionPx={rightIndentPosPx}\n editable={editable}\n isDragging={dragging === 'rightIndent'}\n isHovered={hoveredMarker === 'rightIndent'}\n onMouseEnter={() => setHoveredMarker('rightIndent')}\n onMouseLeave={() => setHoveredMarker(null)}\n onMouseDown={(e) => handleDragStart(e, 'rightIndent')}\n label=\"Right indent\"\n />\n )}\n\n {/* Tab stop markers (display only) */}\n {tabStops?.map((tab) => (\n <TabStopMarker\n key={tab.position}\n tabStop={tab}\n positionPx={twipsToPixels(tab.position) * zoom}\n onDoubleClick={() => onTabStopRemove?.(tab.position)}\n />\n ))}\n\n {/* Drag tooltip */}\n {dragging && dragValue !== null && dragPositionPx !== null && (\n <DragTooltip value={formatValueForTooltip(dragValue, unit)} positionPx={dragPositionPx} />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// SUB-COMPONENTS\n// ============================================================================\n\ninterface TickData {\n position: number;\n height: number;\n label?: string;\n}\n\nfunction RulerTick({ tick }: { tick: TickData }): React.ReactElement {\n return (\n <>\n <div\n style={{\n position: 'absolute',\n left: formatPx(tick.position),\n bottom: 0,\n width: 1,\n height: tick.height,\n backgroundColor: RULER_TICK_COLOR,\n }}\n />\n {tick.label && (\n <div\n style={{\n position: 'absolute',\n left: formatPx(tick.position),\n top: 3,\n transform: 'translateX(-50%)',\n fontSize: '9px',\n color: RULER_TEXT_COLOR,\n fontFamily: 'sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n {tick.label}\n </div>\n )}\n </>\n );\n}\n\n/**\n * Indent triangle handle — Google Docs style.\n * direction=\"down\": ▼ anchored at top (first-line indent, right indent)\n * direction=\"up\": ▲ anchored at bottom (left indent)\n */\ninterface IndentTriangleProps {\n direction: 'up' | 'down';\n positionPx: number;\n editable: boolean;\n isDragging: boolean;\n isHovered: boolean;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n onMouseDown: (e: React.MouseEvent) => void;\n label: string;\n}\n\nfunction IndentTriangle({\n direction,\n positionPx,\n editable,\n isDragging,\n isHovered,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n label,\n}: IndentTriangleProps): React.ReactElement {\n const color = isDragging ? INDENT_ACTIVE_COLOR : isHovered ? INDENT_HOVER_COLOR : INDENT_COLOR;\n const triHeight = Math.round(TRI_SIZE * 1.6);\n\n const containerStyle: CSSProperties = {\n position: 'absolute',\n left: formatPx(positionPx - TRI_SIZE),\n width: TRI_SIZE * 2,\n height: triHeight + 2,\n cursor: editable ? 'ew-resize' : 'default',\n zIndex: isDragging ? 10 : 4,\n ...(direction === 'down' ? { top: 0 } : { bottom: 0 }),\n };\n\n const triangleStyle: CSSProperties =\n direction === 'down'\n ? {\n position: 'absolute',\n top: 1,\n left: 0,\n width: 0,\n height: 0,\n borderLeft: `${TRI_SIZE}px solid transparent`,\n borderRight: `${TRI_SIZE}px solid transparent`,\n borderTop: `${triHeight}px solid ${color}`,\n transition: 'border-top-color 0.1s',\n }\n : {\n position: 'absolute',\n bottom: 1,\n left: 0,\n width: 0,\n height: 0,\n borderLeft: `${TRI_SIZE}px solid transparent`,\n borderRight: `${TRI_SIZE}px solid transparent`,\n borderBottom: `${triHeight}px solid ${color}`,\n transition: 'border-bottom-color 0.1s',\n };\n\n return (\n <div\n className=\"docx-ruler-indent\"\n style={containerStyle}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n role=\"slider\"\n aria-label={label}\n aria-orientation=\"horizontal\"\n tabIndex={editable ? 0 : -1}\n >\n <div style={triangleStyle} />\n </div>\n );\n}\n\nfunction DragTooltip({\n value,\n positionPx,\n}: {\n value: string;\n positionPx: number;\n}): React.ReactElement {\n return (\n <div\n style={{\n position: 'absolute',\n left: formatPx(positionPx),\n top: -22,\n transform: 'translateX(-50%)',\n backgroundColor: '#333',\n color: '#fff',\n fontSize: '10px',\n fontFamily: 'sans-serif',\n padding: '2px 6px',\n borderRadius: 3,\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n zIndex: 20,\n }}\n >\n {value}\n </div>\n );\n}\n\ninterface TabStopMarkerProps {\n tabStop: TabStop;\n positionPx: number;\n onDoubleClick: () => void;\n}\n\nconst TAB_SYMBOLS: Record<string, string> = {\n left: 'L',\n center: 'C',\n right: 'R',\n decimal: 'D',\n bar: '|',\n};\n\nfunction TabStopMarker({\n tabStop,\n positionPx,\n onDoubleClick,\n}: TabStopMarkerProps): React.ReactElement {\n return (\n <div\n style={{\n position: 'absolute',\n left: formatPx(positionPx - 5),\n bottom: 0,\n width: 10,\n height: 12,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 8,\n fontWeight: 700,\n color: '#555',\n cursor: 'pointer',\n userSelect: 'none',\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n onDoubleClick();\n }}\n title={`${tabStop.alignment} tab at ${(tabStop.position / 1440).toFixed(2)}\"`}\n >\n {TAB_SYMBOLS[tabStop.alignment] || 'L'}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\nfunction generateTicks(pageWidthTwips: number, zoom: number, unit: 'inch' | 'cm'): TickData[] {\n const ticks: TickData[] = [];\n\n if (unit === 'inch') {\n const eighthInchTwips = TWIPS_PER_INCH / 8;\n const totalEighths = Math.ceil(pageWidthTwips / eighthInchTwips);\n for (let i = 0; i <= totalEighths; i++) {\n const twipsPos = i * eighthInchTwips;\n if (twipsPos > pageWidthTwips) break;\n const pxPos = twipsToPixels(twipsPos) * zoom;\n if (i % 8 === 0) {\n ticks.push({ position: pxPos, height: 10, label: i / 8 > 0 ? String(i / 8) : undefined });\n } else if (i % 4 === 0) {\n ticks.push({ position: pxPos, height: 6 });\n } else if (i % 2 === 0) {\n ticks.push({ position: pxPos, height: 4 });\n } else {\n ticks.push({ position: pxPos, height: 2 });\n }\n }\n } else {\n const mmTwips = TWIPS_PER_CM / 10;\n const totalMm = Math.ceil(pageWidthTwips / mmTwips);\n for (let i = 0; i <= totalMm; i++) {\n const twipsPos = i * mmTwips;\n if (twipsPos > pageWidthTwips) break;\n const pxPos = twipsToPixels(twipsPos) * zoom;\n if (i % 10 === 0) {\n ticks.push({ position: pxPos, height: 10, label: i / 10 > 0 ? String(i / 10) : undefined });\n } else if (i % 5 === 0) {\n ticks.push({ position: pxPos, height: 6 });\n } else {\n ticks.push({ position: pxPos, height: 3 });\n }\n }\n }\n\n return ticks;\n}\n\nexport function positionToMargin(\n positionPx: number,\n side: 'left' | 'right',\n pageWidthPx: number,\n zoom: number\n): number {\n const positionTwips = pixelsToTwips(positionPx / zoom);\n if (side === 'left') return Math.max(0, positionTwips);\n return Math.max(0, pixelsToTwips(pageWidthPx / zoom) - positionTwips);\n}\n\nexport function getRulerDimensions(\n sectionProps?: SectionProperties | null,\n zoom: number = 1\n): { width: number; leftMargin: number; rightMargin: number; contentWidth: number } {\n const pw = sectionProps?.pageWidth ?? DEFAULT_PAGE_WIDTH_TWIPS;\n const lm = sectionProps?.marginLeft ?? DEFAULT_MARGIN_TWIPS;\n const rm = sectionProps?.marginRight ?? DEFAULT_MARGIN_TWIPS;\n const width = twipsToPixels(pw) * zoom;\n const leftMargin = twipsToPixels(lm) * zoom;\n const rightMargin = twipsToPixels(rm) * zoom;\n return { width, leftMargin, rightMargin, contentWidth: width - leftMargin - rightMargin };\n}\n\nexport function getMarginInUnits(marginTwips: number, unit: 'inch' | 'cm'): string {\n return unit === 'inch'\n ? (marginTwips / TWIPS_PER_INCH).toFixed(2) + '\"'\n : (marginTwips / TWIPS_PER_CM).toFixed(1) + ' cm';\n}\n\nexport function parseMarginFromUnits(value: string, unit: 'inch' | 'cm'): number | null {\n const num = parseFloat(value.replace(/[^\\d.]/g, ''));\n if (isNaN(num)) return null;\n return Math.round(num * (unit === 'inch' ? TWIPS_PER_INCH : TWIPS_PER_CM));\n}\n\nexport default HorizontalRuler;\n","/**\n * TableToolbar Component\n *\n * Provides controls for editing tables:\n * - Add row above/below\n * - Add column left/right\n * - Delete row/column\n * - Merge cells\n * - Split cell\n *\n * Shows when cursor is in a table.\n */\n\nimport React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { Table, TableCell, TableRow } from '@eigenpal/docx-core/types/document';\nimport { MaterialSymbol } from './MaterialSymbol';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Table editing action types\n */\nexport type TableAction =\n | 'addRowAbove'\n | 'addRowBelow'\n | 'addColumnLeft'\n | 'addColumnRight'\n | 'deleteRow'\n | 'deleteColumn'\n | 'mergeCells'\n | 'splitCell'\n | 'deleteTable'\n | 'selectTable'\n | 'selectRow'\n | 'selectColumn'\n | 'borderAll'\n | 'borderOutside'\n | 'borderInside'\n | 'borderNone'\n | 'borderTop'\n | 'borderBottom'\n | 'borderLeft'\n | 'borderRight'\n | { type: 'cellFillColor'; color: string | null }\n | { type: 'borderColor'; color: string }\n | { type: 'borderWidth'; size: number }\n | {\n type: 'cellBorder';\n side: 'top' | 'bottom' | 'left' | 'right' | 'all';\n style: string;\n size: number;\n color: string;\n }\n | { type: 'cellVerticalAlign'; align: 'top' | 'center' | 'bottom' }\n | {\n type: 'cellMargins';\n margins: { top?: number; bottom?: number; left?: number; right?: number };\n }\n | { type: 'cellTextDirection'; direction: string | null }\n | { type: 'toggleNoWrap' }\n | { type: 'rowHeight'; height: number | null; rule?: 'auto' | 'atLeast' | 'exact' }\n | { type: 'toggleHeaderRow' }\n | { type: 'distributeColumns' }\n | { type: 'autoFitContents' }\n | {\n type: 'tableProperties';\n props: {\n width?: number | null;\n widthType?: string | null;\n justification?: 'left' | 'center' | 'right' | null;\n };\n }\n | { type: 'openTableProperties' }\n | { type: 'applyTableStyle'; styleId: string };\n\n/**\n * Border style preset\n */\nexport type BorderPreset =\n | 'all'\n | 'outside'\n | 'inside'\n | 'none'\n | 'top'\n | 'bottom'\n | 'left'\n | 'right';\n\n/**\n * Selection within a table\n */\nexport interface TableSelection {\n /** Index of the table in the document */\n tableIndex: number;\n /** Row index (0-indexed) */\n rowIndex: number;\n /** Column index (0-indexed) */\n columnIndex: number;\n /** Selected cell range for multi-cell selection */\n selectedCells?: {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n };\n}\n\n/**\n * Context for table operations\n */\nexport interface TableContext {\n /** The table being edited */\n table: Table;\n /** Current selection within the table */\n selection: TableSelection;\n /** Whether multiple cells are selected (for merge) */\n hasMultiCellSelection: boolean;\n /** Whether current cell can be split */\n canSplitCell: boolean;\n /** Total number of rows */\n rowCount: number;\n /** Total number of columns */\n columnCount: number;\n}\n\n/**\n * Props for TableToolbar component\n */\nexport interface TableToolbarProps {\n /** Current table context (null if cursor not in table) */\n context: TableContext | null;\n /** Callback when a table action is triggered */\n onAction?: (action: TableAction, context: TableContext) => void;\n /** Whether the toolbar is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Show labels next to icons */\n showLabels?: boolean;\n /** Compact mode */\n compact?: boolean;\n /** Position of the toolbar */\n position?: 'top' | 'floating';\n /** Custom render for additional buttons */\n children?: ReactNode;\n}\n\n/**\n * Props for individual table toolbar button\n */\nexport interface TableToolbarButtonProps {\n /** Action to trigger */\n action: TableAction;\n /** Button label */\n label: string;\n /** Button icon */\n icon: ReactNode;\n /** Button is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Show label */\n showLabel?: boolean;\n /** Compact mode */\n compact?: boolean;\n /** Keyboard shortcut hint */\n shortcut?: string;\n}\n\n// ============================================================================\n// ICONS - Using Material Symbols\n// ============================================================================\n\nconst ICON_SIZE = 16;\n\nexport function AddRowAboveIcon(): React.ReactElement {\n return <MaterialSymbol name=\"table_rows\" size={ICON_SIZE} style={{ transform: 'scaleY(-1)' }} />;\n}\n\nexport function AddRowBelowIcon(): React.ReactElement {\n return <MaterialSymbol name=\"table_rows\" size={ICON_SIZE} />;\n}\n\nexport function AddColumnLeftIcon(): React.ReactElement {\n return <MaterialSymbol name=\"view_column\" size={ICON_SIZE} style={{ transform: 'scaleX(-1)' }} />;\n}\n\nexport function AddColumnRightIcon(): React.ReactElement {\n return <MaterialSymbol name=\"view_column\" size={ICON_SIZE} />;\n}\n\nexport function DeleteRowIcon(): React.ReactElement {\n return <MaterialSymbol name=\"delete_sweep\" size={ICON_SIZE} />;\n}\n\nexport function DeleteColumnIcon(): React.ReactElement {\n return (\n <MaterialSymbol name=\"delete_sweep\" size={ICON_SIZE} style={{ transform: 'rotate(90deg)' }} />\n );\n}\n\nexport function MergeCellsIcon(): React.ReactElement {\n return <MaterialSymbol name=\"call_merge\" size={ICON_SIZE} />;\n}\n\nexport function SplitCellIcon(): React.ReactElement {\n return <MaterialSymbol name=\"call_split\" size={ICON_SIZE} />;\n}\n\nexport function DeleteTableIcon(): React.ReactElement {\n return <MaterialSymbol name=\"delete\" size={ICON_SIZE} className=\"text-red-600\" />;\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst TOOLBAR_STYLES: Record<string, CSSProperties> = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: 'var(--doc-bg-subtle)',\n borderRadius: '4px',\n border: '1px solid var(--doc-border)',\n fontSize: '12px',\n },\n containerCompact: {\n padding: '2px 4px',\n gap: '2px',\n },\n containerFloating: {\n position: 'absolute',\n zIndex: 1000,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n },\n group: {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n },\n separator: {\n width: '1px',\n height: '20px',\n backgroundColor: 'var(--doc-border-dark)',\n margin: '0 4px',\n },\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '4px 8px',\n border: 'none',\n borderRadius: '3px',\n backgroundColor: 'transparent',\n color: 'var(--doc-text)',\n cursor: 'pointer',\n fontSize: '12px',\n lineHeight: '1',\n transition: 'background-color 0.15s, color 0.15s',\n },\n buttonCompact: {\n padding: '3px 5px',\n },\n buttonHover: {\n backgroundColor: 'var(--doc-border)',\n },\n buttonDisabled: {\n color: 'var(--doc-text-subtle)',\n cursor: 'not-allowed',\n },\n buttonDelete: {\n color: 'var(--doc-error)',\n },\n label: {\n fontSize: '11px',\n fontWeight: 500,\n color: 'var(--doc-text-muted)',\n marginRight: '8px',\n whiteSpace: 'nowrap',\n },\n hidden: {\n display: 'none',\n },\n};\n\n// ============================================================================\n// COMPONENTS\n// ============================================================================\n\n/**\n * Individual toolbar button\n */\nexport function TableToolbarButton({\n action,\n label,\n icon,\n disabled = false,\n onClick,\n showLabel = false,\n compact = false,\n shortcut,\n}: TableToolbarButtonProps): React.ReactElement {\n const [isHovered, setIsHovered] = React.useState(false);\n\n const isDeleteAction = typeof action === 'string' && action.startsWith('delete');\n\n const buttonStyle: CSSProperties = {\n ...TOOLBAR_STYLES.button,\n ...(compact ? TOOLBAR_STYLES.buttonCompact : {}),\n ...(isHovered && !disabled ? TOOLBAR_STYLES.buttonHover : {}),\n ...(disabled ? TOOLBAR_STYLES.buttonDisabled : {}),\n ...(isDeleteAction && !disabled ? TOOLBAR_STYLES.buttonDelete : {}),\n };\n\n const title = shortcut ? `${label} (${shortcut})` : label;\n\n return (\n <button\n type=\"button\"\n className={`docx-table-toolbar-button docx-table-toolbar-${typeof action === 'string' ? action : action.type}`}\n style={buttonStyle}\n disabled={disabled}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n title={title}\n aria-label={label}\n >\n {icon}\n {showLabel && <span>{label}</span>}\n </button>\n );\n}\n\n/**\n * Button group with separator\n */\nfunction ToolbarGroup({\n children,\n showSeparator = true,\n}: {\n children: ReactNode;\n showSeparator?: boolean;\n}): React.ReactElement {\n return (\n <>\n <div style={TOOLBAR_STYLES.group}>{children}</div>\n {showSeparator && <div style={TOOLBAR_STYLES.separator} />}\n </>\n );\n}\n\n/**\n * TableToolbar - Shows table manipulation controls when cursor is in a table\n */\nexport function TableToolbar({\n context,\n onAction,\n disabled = false,\n className,\n style,\n showLabels = false,\n compact = false,\n position = 'top',\n children,\n}: TableToolbarProps): React.ReactElement | null {\n // Don't render if not in a table\n if (!context) {\n return null;\n }\n\n const handleAction = (action: TableAction) => {\n if (!disabled && onAction && context) {\n onAction(action, context);\n }\n };\n\n // Check if actions are available\n const canDeleteRow = context.rowCount > 1;\n const canDeleteColumn = context.columnCount > 1;\n const canMerge = context.hasMultiCellSelection;\n const canSplit = context.canSplitCell;\n\n const containerStyle: CSSProperties = {\n ...TOOLBAR_STYLES.container,\n ...(compact ? TOOLBAR_STYLES.containerCompact : {}),\n ...(position === 'floating' ? TOOLBAR_STYLES.containerFloating : {}),\n ...style,\n };\n\n const classNames = ['docx-table-toolbar'];\n if (className) {\n classNames.push(className);\n }\n if (compact) {\n classNames.push('docx-table-toolbar-compact');\n }\n if (position === 'floating') {\n classNames.push('docx-table-toolbar-floating');\n }\n\n return (\n <div\n className={classNames.join(' ')}\n style={containerStyle}\n role=\"toolbar\"\n aria-label=\"Table editing tools\"\n >\n <span style={TOOLBAR_STYLES.label}>Table:</span>\n\n {/* Row operations */}\n <ToolbarGroup>\n <TableToolbarButton\n action=\"addRowAbove\"\n label=\"Insert Row Above\"\n icon={<AddRowAboveIcon />}\n disabled={disabled}\n onClick={() => handleAction('addRowAbove')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"addRowBelow\"\n label=\"Insert Row Below\"\n icon={<AddRowBelowIcon />}\n disabled={disabled}\n onClick={() => handleAction('addRowBelow')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"deleteRow\"\n label=\"Delete Row\"\n icon={<DeleteRowIcon />}\n disabled={disabled || !canDeleteRow}\n onClick={() => handleAction('deleteRow')}\n showLabel={showLabels}\n compact={compact}\n />\n </ToolbarGroup>\n\n {/* Column operations */}\n <ToolbarGroup>\n <TableToolbarButton\n action=\"addColumnLeft\"\n label=\"Insert Column Left\"\n icon={<AddColumnLeftIcon />}\n disabled={disabled}\n onClick={() => handleAction('addColumnLeft')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"addColumnRight\"\n label=\"Insert Column Right\"\n icon={<AddColumnRightIcon />}\n disabled={disabled}\n onClick={() => handleAction('addColumnRight')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"deleteColumn\"\n label=\"Delete Column\"\n icon={<DeleteColumnIcon />}\n disabled={disabled || !canDeleteColumn}\n onClick={() => handleAction('deleteColumn')}\n showLabel={showLabels}\n compact={compact}\n />\n </ToolbarGroup>\n\n {/* Merge/Split operations */}\n <ToolbarGroup showSeparator={false}>\n <TableToolbarButton\n action=\"mergeCells\"\n label=\"Merge Cells\"\n icon={<MergeCellsIcon />}\n disabled={disabled || !canMerge}\n onClick={() => handleAction('mergeCells')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"splitCell\"\n label=\"Split Cell\"\n icon={<SplitCellIcon />}\n disabled={disabled || !canSplit}\n onClick={() => handleAction('splitCell')}\n showLabel={showLabels}\n compact={compact}\n />\n <TableToolbarButton\n action=\"deleteTable\"\n label=\"Delete Table\"\n icon={<DeleteTableIcon />}\n disabled={disabled}\n onClick={() => handleAction('deleteTable')}\n showLabel={showLabels}\n compact={compact}\n />\n </ToolbarGroup>\n\n {/* Custom content */}\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Create a table context from a table and selection\n */\nexport function createTableContext(table: Table, selection: TableSelection): TableContext {\n const rowCount = table.rows.length;\n const columnCount = getColumnCount(table);\n\n // Check if multi-cell selection\n const hasMultiCellSelection = !!(\n selection.selectedCells &&\n (selection.selectedCells.startRow !== selection.selectedCells.endRow ||\n selection.selectedCells.startCol !== selection.selectedCells.endCol)\n );\n\n // Check if current cell can be split (has gridSpan > 1 or vMerge)\n const currentCell = getCellAt(table, selection.rowIndex, selection.columnIndex);\n const canSplitCell = !!(\n currentCell &&\n ((currentCell.formatting?.gridSpan ?? 1) > 1 || currentCell.formatting?.vMerge === 'restart')\n );\n\n return {\n table,\n selection,\n hasMultiCellSelection,\n canSplitCell,\n rowCount,\n columnCount,\n };\n}\n\n/**\n * Get column count from a table\n */\nexport function getColumnCount(table: Table): number {\n if (!table.rows.length) return 0;\n\n let maxCols = 0;\n for (const row of table.rows) {\n let colCount = 0;\n for (const cell of row.cells) {\n colCount += cell.formatting?.gridSpan ?? 1;\n }\n maxCols = Math.max(maxCols, colCount);\n }\n return maxCols;\n}\n\n/**\n * Get cell at specific row and column index\n */\nexport function getCellAt(table: Table, rowIndex: number, columnIndex: number): TableCell | null {\n const row = table.rows[rowIndex];\n if (!row) return null;\n\n let currentCol = 0;\n for (const cell of row.cells) {\n const colspan = cell.formatting?.gridSpan ?? 1;\n if (columnIndex >= currentCol && columnIndex < currentCol + colspan) {\n return cell;\n }\n currentCol += colspan;\n }\n return null;\n}\n\n/**\n * Check if a selection spans multiple cells\n */\nexport function isMultiCellSelection(selection: TableSelection): boolean {\n if (!selection.selectedCells) return false;\n const { startRow, startCol, endRow, endCol } = selection.selectedCells;\n return startRow !== endRow || startCol !== endCol;\n}\n\n/**\n * Get the bounds of a selection\n */\nexport function getSelectionBounds(selection: TableSelection): {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n} {\n if (selection.selectedCells) {\n return selection.selectedCells;\n }\n return {\n startRow: selection.rowIndex,\n startCol: selection.columnIndex,\n endRow: selection.rowIndex,\n endCol: selection.columnIndex,\n };\n}\n\n/**\n * Check if a cell is within a selection\n */\nexport function isCellInSelection(\n rowIndex: number,\n colIndex: number,\n selection: TableSelection\n): boolean {\n const bounds = getSelectionBounds(selection);\n return (\n rowIndex >= bounds.startRow &&\n rowIndex <= bounds.endRow &&\n colIndex >= bounds.startCol &&\n colIndex <= bounds.endCol\n );\n}\n\n/**\n * Create an empty row with the same structure as an existing row\n */\nexport function createEmptyRow(templateRow: TableRow, columnCount: number): TableRow {\n const cells: TableCell[] = [];\n\n // Create cells matching the column structure\n let colIndex = 0;\n for (const templateCell of templateRow.cells) {\n const colspan = templateCell.formatting?.gridSpan ?? 1;\n cells.push({\n type: 'tableCell',\n content: [\n {\n type: 'paragraph' as const,\n content: [],\n formatting: {},\n },\n ],\n formatting: {\n ...templateCell.formatting,\n vMerge: undefined, // Don't copy vertical merge\n },\n });\n colIndex += colspan;\n }\n\n // If template row has fewer columns, add more cells\n while (colIndex < columnCount) {\n cells.push({\n type: 'tableCell',\n content: [\n {\n type: 'paragraph' as const,\n content: [],\n formatting: {},\n },\n ],\n formatting: {},\n });\n colIndex++;\n }\n\n return {\n type: 'tableRow',\n cells,\n formatting: {\n ...templateRow.formatting,\n header: false, // New rows aren't headers by default\n },\n };\n}\n\n/**\n * Create an empty cell\n */\nexport function createEmptyCell(): TableCell {\n return {\n type: 'tableCell',\n content: [\n {\n type: 'paragraph',\n content: [],\n formatting: {},\n },\n ],\n formatting: {},\n };\n}\n\n/**\n * Add a row to a table at the specified index\n */\nexport function addRow(\n table: Table,\n atIndex: number,\n position: 'before' | 'after' = 'after'\n): Table {\n const newRows = [...table.rows];\n const insertIndex = position === 'before' ? atIndex : atIndex + 1;\n const templateRow = table.rows[atIndex] || table.rows[0];\n const columnCount = getColumnCount(table);\n const newRow = createEmptyRow(templateRow, columnCount);\n\n newRows.splice(insertIndex, 0, newRow);\n\n return {\n ...table,\n rows: newRows,\n };\n}\n\n/**\n * Delete a row from a table\n */\nexport function deleteRow(table: Table, rowIndex: number): Table {\n if (table.rows.length <= 1) {\n return table; // Don't delete the last row\n }\n\n const newRows = table.rows.filter((_, index) => index !== rowIndex);\n\n return {\n ...table,\n rows: newRows,\n };\n}\n\n/**\n * Add a column to a table at the specified index\n */\nexport function addColumn(\n table: Table,\n atIndex: number,\n position: 'before' | 'after' = 'after'\n): Table {\n const insertIndex = position === 'before' ? atIndex : atIndex + 1;\n\n const newRows = table.rows.map((row) => {\n const newCells = [...row.cells];\n\n // Find the cell at the column index and insert a new cell\n let currentCol = 0;\n let insertCellIndex = 0;\n\n for (let i = 0; i < row.cells.length; i++) {\n const cell = row.cells[i];\n const colspan = cell.formatting?.gridSpan ?? 1;\n\n if (insertIndex <= currentCol + colspan) {\n insertCellIndex = position === 'before' ? i : i + 1;\n break;\n }\n currentCol += colspan;\n insertCellIndex = i + 1;\n }\n\n newCells.splice(insertCellIndex, 0, createEmptyCell());\n\n return {\n ...row,\n cells: newCells,\n };\n });\n\n // Update column widths if present\n let newColumnWidths = table.columnWidths;\n if (table.columnWidths && table.columnWidths.length > 0) {\n newColumnWidths = [...table.columnWidths];\n const templateWidth = table.columnWidths[atIndex] || table.columnWidths[0] || 1440; // Default 1 inch\n newColumnWidths.splice(insertIndex, 0, templateWidth);\n }\n\n return {\n ...table,\n rows: newRows,\n columnWidths: newColumnWidths,\n };\n}\n\n/**\n * Delete a column from a table\n */\nexport function deleteColumn(table: Table, columnIndex: number): Table {\n const columnCount = getColumnCount(table);\n if (columnCount <= 1) {\n return table; // Don't delete the last column\n }\n\n const newRows = table.rows.map((row) => {\n let currentCol = 0;\n const newCells: TableCell[] = [];\n\n for (const cell of row.cells) {\n const colspan = cell.formatting?.gridSpan ?? 1;\n\n // Check if this cell spans the column to delete\n if (columnIndex >= currentCol && columnIndex < currentCol + colspan) {\n if (colspan > 1) {\n // Reduce gridSpan by 1\n newCells.push({\n ...cell,\n formatting: {\n ...cell.formatting,\n gridSpan: colspan - 1,\n },\n });\n }\n // If colspan is 1, skip this cell (delete it)\n } else {\n newCells.push(cell);\n }\n\n currentCol += colspan;\n }\n\n return {\n ...row,\n cells: newCells,\n };\n });\n\n // Update column widths if present\n let newColumnWidths = table.columnWidths;\n if (table.columnWidths && table.columnWidths.length > columnIndex) {\n newColumnWidths = table.columnWidths.filter((_, i) => i !== columnIndex);\n }\n\n return {\n ...table,\n rows: newRows,\n columnWidths: newColumnWidths,\n };\n}\n\n/**\n * Merge cells in a selection\n */\nexport function mergeCells(table: Table, selection: TableSelection): Table {\n if (!selection.selectedCells) {\n return table;\n }\n\n const { startRow, startCol, endRow, endCol } = selection.selectedCells;\n const rowSpan = endRow - startRow + 1;\n const colSpan = endCol - startCol + 1;\n\n // Create new rows with merged cell\n const newRows = table.rows.map((row, rowIndex) => {\n if (rowIndex < startRow || rowIndex > endRow) {\n return row;\n }\n\n const newCells: TableCell[] = [];\n let currentCol = 0;\n\n for (const cell of row.cells) {\n const cellColSpan = cell.formatting?.gridSpan ?? 1;\n const cellEndCol = currentCol + cellColSpan - 1;\n\n // Check if this cell is in the selection\n const inSelection = currentCol <= endCol && cellEndCol >= startCol;\n\n if (!inSelection) {\n newCells.push(cell);\n } else if (rowIndex === startRow && currentCol === startCol) {\n // This is the top-left cell - it becomes the merged cell\n newCells.push({\n ...cell,\n formatting: {\n ...cell.formatting,\n gridSpan: colSpan,\n vMerge: rowSpan > 1 ? 'restart' : undefined,\n },\n });\n } else if (rowIndex > startRow && currentCol === startCol) {\n // Cells below the first row in merge area\n newCells.push({\n ...cell,\n formatting: {\n ...cell.formatting,\n gridSpan: colSpan,\n vMerge: 'continue',\n },\n });\n }\n // Skip other cells in the selection\n\n currentCol += cellColSpan;\n }\n\n return {\n ...row,\n cells: newCells,\n };\n });\n\n return {\n ...table,\n rows: newRows,\n };\n}\n\n/**\n * Split a merged cell\n */\nexport function splitCell(table: Table, rowIndex: number, columnIndex: number): Table {\n const cell = getCellAt(table, rowIndex, columnIndex);\n if (!cell) return table;\n\n const gridSpan = cell.formatting?.gridSpan ?? 1;\n const isVMergeStart = cell.formatting?.vMerge === 'restart';\n\n if (gridSpan <= 1 && !isVMergeStart) {\n return table; // Nothing to split\n }\n\n const newRows = table.rows.map((row, rIndex) => {\n if (rIndex !== rowIndex && !isVMergeStart) {\n return row;\n }\n\n const newCells: TableCell[] = [];\n let currentCol = 0;\n\n for (const rowCell of row.cells) {\n const cellColSpan = rowCell.formatting?.gridSpan ?? 1;\n\n if (\n currentCol === columnIndex ||\n (currentCol <= columnIndex && columnIndex < currentCol + cellColSpan)\n ) {\n // This is the cell to split\n if (gridSpan > 1) {\n // Split horizontally\n for (let i = 0; i < gridSpan; i++) {\n newCells.push({\n type: 'tableCell',\n content:\n i === 0\n ? rowCell.content\n : [{ type: 'paragraph' as const, content: [], formatting: {} }],\n formatting: {\n ...rowCell.formatting,\n gridSpan: undefined,\n vMerge: undefined,\n },\n });\n }\n } else if (isVMergeStart && rIndex === rowIndex) {\n // Remove vMerge from this cell\n newCells.push({\n ...rowCell,\n formatting: {\n ...rowCell.formatting,\n vMerge: undefined,\n },\n });\n } else if (rowCell.formatting?.vMerge === 'continue') {\n // This row was part of vMerge - restore as regular cell\n newCells.push({\n type: 'tableCell',\n content: [{ type: 'paragraph' as const, content: [], formatting: {} }],\n formatting: {\n ...rowCell.formatting,\n vMerge: undefined,\n },\n });\n } else {\n newCells.push(rowCell);\n }\n } else {\n newCells.push(rowCell);\n }\n\n currentCol += cellColSpan;\n }\n\n return {\n ...row,\n cells: newCells,\n };\n });\n\n return {\n ...table,\n rows: newRows,\n };\n}\n\n/** Simple (string) table actions */\ntype SimpleTableAction = Exclude<TableAction, { type: string }>;\n\n/**\n * Get action label for display\n */\nexport function getActionLabel(action: TableAction): string {\n if (typeof action === 'object') {\n if (action.type === 'cellFillColor') return 'Cell Fill Color';\n if (action.type === 'borderColor') return 'Border Color';\n return 'Unknown Action';\n }\n\n const labels: Record<SimpleTableAction, string> = {\n addRowAbove: 'Insert Row Above',\n addRowBelow: 'Insert Row Below',\n addColumnLeft: 'Insert Column Left',\n addColumnRight: 'Insert Column Right',\n deleteRow: 'Delete Row',\n deleteColumn: 'Delete Column',\n mergeCells: 'Merge Cells',\n splitCell: 'Split Cell',\n deleteTable: 'Delete Table',\n selectTable: 'Select Table',\n selectRow: 'Select Row',\n selectColumn: 'Select Column',\n borderAll: 'All Borders',\n borderOutside: 'Outside Borders',\n borderInside: 'Inside Borders',\n borderNone: 'No Borders',\n borderTop: 'Top Border',\n borderBottom: 'Bottom Border',\n borderLeft: 'Left Border',\n borderRight: 'Right Border',\n };\n return labels[action];\n}\n\n/**\n * Check if an action is a delete action\n */\nexport function isDeleteAction(action: TableAction): boolean {\n return (\n typeof action === 'string' &&\n (action === 'deleteRow' || action === 'deleteColumn' || action === 'deleteTable')\n );\n}\n\n/**\n * Handle keyboard shortcuts for table actions\n */\nexport function handleTableShortcut(\n _event: KeyboardEvent,\n context: TableContext | null\n): TableAction | null {\n if (!context) return null;\n\n // No default keyboard shortcuts defined for table operations\n // This function can be extended to add shortcuts like:\n // - Ctrl+Shift+R for add row\n // - Ctrl+Shift+C for add column\n // etc.\n\n return null;\n}\n\nexport default TableToolbar;\n","/**\n * Clipboard utilities for copy/paste with formatting\n *\n * Handles:\n * - Copy: puts formatted HTML and plain text on clipboard\n * - Paste: reads HTML clipboard, converts to runs with formatting\n * - Handles paste from Word (cleans up Word HTML)\n * - Ctrl+C, Ctrl+V, Ctrl+X keyboard shortcuts\n */\n\nimport type { Run, TextFormatting, Paragraph } from '../types/document';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Clipboard content format\n */\nexport interface ClipboardContent {\n /** Plain text representation */\n plainText: string;\n /** HTML representation */\n html: string;\n /** Internal format (JSON) for preserving full formatting */\n internal?: string;\n}\n\n/**\n * Parsed clipboard content\n */\nexport interface ParsedClipboardContent {\n /** Runs parsed from clipboard */\n runs: Run[];\n /** Whether content came from Word */\n fromWord: boolean;\n /** Whether content came from our editor */\n fromEditor: boolean;\n /** Original plain text */\n plainText: string;\n}\n\n/**\n * Options for clipboard operations\n */\nexport interface ClipboardOptions {\n /** Whether to include formatting in copy */\n includeFormatting?: boolean;\n /** Whether to clean Word-specific formatting */\n cleanWordFormatting?: boolean;\n /** Callback for handling errors */\n onError?: (error: Error) => void;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Custom MIME type for internal clipboard format\n */\nexport const INTERNAL_CLIPBOARD_TYPE = 'application/x-docx-editor';\n\n/**\n * Standard clipboard MIME types\n */\nexport const CLIPBOARD_TYPES = {\n HTML: 'text/html',\n PLAIN: 'text/plain',\n} as const;\n\n// ============================================================================\n// COPY FUNCTIONS\n// ============================================================================\n\n/**\n * Copy runs to clipboard with formatting\n */\nexport async function copyRuns(runs: Run[], options: ClipboardOptions = {}): Promise<boolean> {\n const { includeFormatting = true, onError } = options;\n\n try {\n const content = runsToClipboardContent(runs, includeFormatting);\n return await writeToClipboard(content);\n } catch (error) {\n onError?.(error as Error);\n return false;\n }\n}\n\n/**\n * Copy paragraphs to clipboard with formatting\n */\nexport async function copyParagraphs(\n paragraphs: Paragraph[],\n options: ClipboardOptions = {}\n): Promise<boolean> {\n const { includeFormatting = true, onError } = options;\n\n try {\n const content = paragraphsToClipboardContent(paragraphs, includeFormatting);\n return await writeToClipboard(content);\n } catch (error) {\n onError?.(error as Error);\n return false;\n }\n}\n\n/**\n * Convert runs to clipboard content (HTML and plain text)\n */\nexport function runsToClipboardContent(\n runs: Run[],\n includeFormatting: boolean = true\n): ClipboardContent {\n const plainText = runs.map(getRunText).join('');\n const html = includeFormatting ? runsToHtml(runs) : escapeHtml(plainText);\n const internal = JSON.stringify(runs);\n\n return { plainText, html, internal };\n}\n\n/**\n * Convert paragraphs to clipboard content\n */\nexport function paragraphsToClipboardContent(\n paragraphs: Paragraph[],\n includeFormatting: boolean = true\n): ClipboardContent {\n const plainText = paragraphs.map(getParagraphText).join('\\n');\n const html = includeFormatting ? paragraphsToHtml(paragraphs) : escapeHtml(plainText);\n const internal = JSON.stringify(paragraphs);\n\n return { plainText, html, internal };\n}\n\n/**\n * Write content to clipboard\n */\nexport async function writeToClipboard(content: ClipboardContent): Promise<boolean> {\n try {\n // Try to use the modern Clipboard API\n if (navigator.clipboard && navigator.clipboard.write) {\n const items = [\n new ClipboardItem({\n [CLIPBOARD_TYPES.PLAIN]: new Blob([content.plainText], { type: CLIPBOARD_TYPES.PLAIN }),\n [CLIPBOARD_TYPES.HTML]: new Blob([content.html], { type: CLIPBOARD_TYPES.HTML }),\n }),\n ];\n await navigator.clipboard.write(items);\n return true;\n }\n\n // Fallback to execCommand\n return writeToClipboardFallback(content);\n } catch {\n // Fallback to execCommand\n return writeToClipboardFallback(content);\n }\n}\n\n/**\n * Fallback method using execCommand\n */\nfunction writeToClipboardFallback(content: ClipboardContent): boolean {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = content.html;\n tempDiv.style.position = 'fixed';\n tempDiv.style.left = '-9999px';\n document.body.appendChild(tempDiv);\n\n try {\n const selection = window.getSelection();\n if (!selection) return false;\n\n const range = document.createRange();\n range.selectNodeContents(tempDiv);\n selection.removeAllRanges();\n selection.addRange(range);\n\n const result = document.execCommand('copy');\n selection.removeAllRanges();\n return result;\n } finally {\n document.body.removeChild(tempDiv);\n }\n}\n\n// ============================================================================\n// PASTE FUNCTIONS\n// ============================================================================\n\n/**\n * Read content from clipboard\n */\nexport async function readFromClipboard(\n options: ClipboardOptions = {}\n): Promise<ParsedClipboardContent | null> {\n const { cleanWordFormatting = true, onError } = options;\n\n try {\n // Try modern Clipboard API\n if (navigator.clipboard && navigator.clipboard.read) {\n const items = await navigator.clipboard.read();\n return await parseClipboardItems(items, cleanWordFormatting);\n }\n\n // Fallback to reading from event\n return null;\n } catch (error) {\n onError?.(error as Error);\n return null;\n }\n}\n\n/**\n * Parse clipboard items\n */\nasync function parseClipboardItems(\n items: ClipboardItems,\n cleanWordFormatting: boolean\n): Promise<ParsedClipboardContent> {\n let html = '';\n let plainText = '';\n\n for (const item of items) {\n // Get HTML content\n if (item.types.includes(CLIPBOARD_TYPES.HTML)) {\n const blob = await item.getType(CLIPBOARD_TYPES.HTML);\n html = await blob.text();\n }\n\n // Get plain text\n if (item.types.includes(CLIPBOARD_TYPES.PLAIN)) {\n const blob = await item.getType(CLIPBOARD_TYPES.PLAIN);\n plainText = await blob.text();\n }\n }\n\n return parseClipboardHtml(html, plainText, cleanWordFormatting);\n}\n\n/**\n * Handle paste event\n */\nexport function handlePasteEvent(\n event: ClipboardEvent,\n options: ClipboardOptions = {}\n): ParsedClipboardContent | null {\n const { cleanWordFormatting = true } = options;\n\n const clipboardData = event.clipboardData;\n if (!clipboardData) return null;\n\n const html = clipboardData.getData(CLIPBOARD_TYPES.HTML);\n const plainText = clipboardData.getData(CLIPBOARD_TYPES.PLAIN);\n\n return parseClipboardHtml(html, plainText, cleanWordFormatting);\n}\n\n/**\n * Parse HTML from clipboard\n */\nexport function parseClipboardHtml(\n html: string,\n plainText: string,\n cleanWordFormatting: boolean = true\n): ParsedClipboardContent {\n const fromWord = isWordHtml(html);\n const fromEditor = isEditorHtml(html);\n\n // If from our editor, try to parse internal format\n if (fromEditor) {\n // Look for internal data in HTML comments or data attributes\n const internalMatch = html.match(/data-docx-editor-content=\"([^\"]+)\"/);\n if (internalMatch) {\n try {\n const runs = JSON.parse(decodeURIComponent(internalMatch[1]));\n return { runs, fromWord: false, fromEditor: true, plainText };\n } catch {\n // Fall through to HTML parsing\n }\n }\n }\n\n // Clean Word HTML if needed\n let processedHtml = html;\n if (fromWord && cleanWordFormatting) {\n processedHtml = cleanWordHtml(html);\n }\n\n // Parse HTML to runs\n const runs = htmlToRuns(processedHtml, plainText);\n\n return { runs, fromWord, fromEditor, plainText };\n}\n\n/**\n * Check if HTML is from Microsoft Word\n */\nexport function isWordHtml(html: string): boolean {\n return (\n html.includes('urn:schemas-microsoft-com:office') ||\n html.includes('mso-') ||\n html.includes('MsoNormal') ||\n html.includes('class=\"Mso') ||\n html.includes('<!--[if gte mso')\n );\n}\n\n/**\n * Check if HTML is from our editor\n */\nexport function isEditorHtml(html: string): boolean {\n return (\n html.includes('data-docx-editor') ||\n html.includes('docx-run') ||\n html.includes('docx-paragraph')\n );\n}\n\n/**\n * Clean Microsoft Word HTML\n */\nexport function cleanWordHtml(html: string): string {\n let cleaned = html;\n\n // Remove Word-specific comments\n cleaned = cleaned.replace(/<!--\\[if[\\s\\S]*?<!\\[endif\\]-->/gi, '');\n cleaned = cleaned.replace(/<!--[\\s\\S]*?-->/g, '');\n\n // Remove XML declarations\n cleaned = cleaned.replace(/<\\?xml[^>]*>/gi, '');\n\n // Remove o: (Office) namespace tags\n cleaned = cleaned.replace(/<o:[^>]*>[\\s\\S]*?<\\/o:[^>]*>/gi, '');\n cleaned = cleaned.replace(/<o:[^>]*\\/>/gi, '');\n\n // Remove w: (Word) namespace tags\n cleaned = cleaned.replace(/<w:[^>]*>[\\s\\S]*?<\\/w:[^>]*>/gi, '');\n cleaned = cleaned.replace(/<w:[^>]*\\/>/gi, '');\n\n // Remove mso styles but keep other styles\n cleaned = cleaned.replace(/\\s*mso-[^:;]+:[^;]+;?/gi, '');\n\n // Remove empty style attributes\n cleaned = cleaned.replace(/\\s*style=\"\\s*\"/gi, '');\n\n // Remove class attributes containing Mso\n cleaned = cleaned.replace(/\\s*class=\"[^\"]*Mso[^\"]*\"/gi, '');\n\n // Remove empty spans\n cleaned = cleaned.replace(/<span[^>]*>\\s*<\\/span>/gi, '');\n\n // Remove font tags (convert to spans with style if needed)\n cleaned = cleaned.replace(/<\\/?font[^>]*>/gi, '');\n\n // Normalize whitespace\n cleaned = cleaned.replace(/\\s+/g, ' ').trim();\n\n return cleaned;\n}\n\n/**\n * Convert HTML to runs\n */\nexport function htmlToRuns(html: string, plainTextFallback: string): Run[] {\n if (!html || html.trim() === '') {\n // Use plain text fallback\n return plainTextFallback ? [createTextRun(plainTextFallback)] : [];\n }\n\n const container = document.createElement('div');\n container.innerHTML = html;\n\n const runs: Run[] = [];\n processNode(container, runs, {});\n\n // If no runs were extracted, use plain text\n if (runs.length === 0 && plainTextFallback) {\n return [createTextRun(plainTextFallback)];\n }\n\n return runs;\n}\n\n/**\n * Process a DOM node and extract runs\n */\nfunction processNode(node: Node, runs: Run[], inheritedFormatting: TextFormatting): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n if (text.trim() || text.includes(' ')) {\n runs.push(createTextRun(text, inheritedFormatting));\n }\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return;\n }\n\n const element = node as HTMLElement;\n const tagName = element.tagName.toLowerCase();\n\n // Merge formatting from this element\n const formatting = { ...inheritedFormatting, ...extractFormatting(element) };\n\n // Handle specific elements\n switch (tagName) {\n case 'br':\n runs.push(createBreakRun(formatting));\n return;\n\n case 'p':\n case 'div':\n // Process children\n for (const child of element.childNodes) {\n processNode(child, runs, formatting);\n }\n // Add line break after block elements if not the last element\n if (element.nextSibling) {\n runs.push(createBreakRun(formatting));\n }\n return;\n\n case 'b':\n case 'strong':\n formatting.bold = true;\n break;\n\n case 'i':\n case 'em':\n formatting.italic = true;\n break;\n\n case 'u':\n formatting.underline = { style: 'single' };\n break;\n\n case 's':\n case 'strike':\n case 'del':\n formatting.strike = true;\n break;\n\n case 'sup':\n formatting.vertAlign = 'superscript';\n break;\n\n case 'sub':\n formatting.vertAlign = 'subscript';\n break;\n\n case 'code':\n case 'pre':\n formatting.fontFamily = { ascii: 'Courier New' };\n break;\n }\n\n // Process children\n for (const child of element.childNodes) {\n processNode(child, runs, formatting);\n }\n}\n\n/**\n * Extract formatting from an HTML element\n */\nfunction extractFormatting(element: HTMLElement): TextFormatting {\n const formatting: TextFormatting = {};\n const style = element.style;\n\n // Font weight (bold)\n if (style.fontWeight === 'bold' || parseInt(style.fontWeight) >= 700) {\n formatting.bold = true;\n }\n\n // Font style (italic)\n if (style.fontStyle === 'italic') {\n formatting.italic = true;\n }\n\n // Text decoration (underline, strikethrough)\n const textDecoration = style.textDecoration || style.textDecorationLine;\n if (textDecoration) {\n if (textDecoration.includes('underline')) {\n formatting.underline = { style: 'single' };\n }\n if (textDecoration.includes('line-through')) {\n formatting.strike = true;\n }\n }\n\n // Font size\n if (style.fontSize) {\n const sizePx = parseFloat(style.fontSize);\n if (!isNaN(sizePx)) {\n // Convert pixels to half-points (1pt = 1.333px at 96dpi)\n formatting.fontSize = Math.round((sizePx / 1.333) * 2);\n }\n }\n\n // Font family\n if (style.fontFamily) {\n const fontFamily = style.fontFamily.replace(/[\"']/g, '').split(',')[0].trim();\n if (fontFamily) {\n formatting.fontFamily = { ascii: fontFamily };\n }\n }\n\n // Color\n if (style.color) {\n const hex = colorToHex(style.color);\n if (hex) {\n formatting.color = { rgb: hex };\n }\n }\n\n // Background color (highlight)\n if (style.backgroundColor && style.backgroundColor !== 'transparent') {\n const hex = colorToHex(style.backgroundColor);\n if (hex) {\n formatting.shading = { fill: { rgb: hex } };\n }\n }\n\n return formatting;\n}\n\n/**\n * Convert a CSS color value to hex\n */\nfunction colorToHex(color: string): string | null {\n if (!color || color === 'transparent' || color === 'inherit') {\n return null;\n }\n\n // Already hex\n if (color.startsWith('#')) {\n return color.slice(1).toUpperCase();\n }\n\n // RGB/RGBA\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1]).toString(16).padStart(2, '0');\n const g = parseInt(rgbMatch[2]).toString(16).padStart(2, '0');\n const b = parseInt(rgbMatch[3]).toString(16).padStart(2, '0');\n return (r + g + b).toUpperCase();\n }\n\n return null;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Get plain text from a run\n */\nfunction getRunText(run: Run): string {\n return run.content\n .map((content) => {\n if (content.type === 'text') return content.text;\n if (content.type === 'tab') return '\\t';\n if (content.type === 'break') return content.breakType === 'textWrapping' ? '\\n' : '';\n return '';\n })\n .join('');\n}\n\n/**\n * Get plain text from a paragraph\n */\nfunction getParagraphText(paragraph: Paragraph): string {\n return (paragraph.content || [])\n .map((content) => {\n if (content.type === 'run') return getRunText(content);\n return '';\n })\n .join('');\n}\n\n/**\n * Convert runs to HTML\n */\nfunction runsToHtml(runs: Run[]): string {\n return runs.map(runToHtml).join('');\n}\n\n/**\n * Convert paragraphs to HTML\n */\nfunction paragraphsToHtml(paragraphs: Paragraph[]): string {\n return paragraphs\n .map((p) => `<p>${runsToHtml(p.content?.filter((c): c is Run => c.type === 'run') || [])}</p>`)\n .join('');\n}\n\n/**\n * Convert a run to HTML\n */\nfunction runToHtml(run: Run): string {\n const text = getRunText(run);\n if (!text) return '';\n\n let html = escapeHtml(text);\n const formatting = run.formatting;\n\n if (!formatting) return html;\n\n // Apply formatting\n if (formatting.bold) {\n html = `<strong>${html}</strong>`;\n }\n if (formatting.italic) {\n html = `<em>${html}</em>`;\n }\n if (formatting.underline) {\n html = `<u>${html}</u>`;\n }\n if (formatting.strike) {\n html = `<s>${html}</s>`;\n }\n if (formatting.vertAlign === 'superscript') {\n html = `<sup>${html}</sup>`;\n }\n if (formatting.vertAlign === 'subscript') {\n html = `<sub>${html}</sub>`;\n }\n\n // Build inline styles\n const styles: string[] = [];\n\n if (formatting.fontSize) {\n const sizePt = formatting.fontSize / 2;\n styles.push(`font-size: ${sizePt}pt`);\n }\n\n if (formatting.fontFamily?.ascii) {\n styles.push(`font-family: \"${formatting.fontFamily.ascii}\"`);\n }\n\n if (formatting.color?.rgb) {\n styles.push(`color: #${formatting.color.rgb}`);\n }\n\n if (formatting.shading?.fill?.rgb) {\n styles.push(`background-color: #${formatting.shading.fill.rgb}`);\n }\n\n if (styles.length > 0) {\n html = `<span style=\"${styles.join('; ')}\">${html}</span>`;\n }\n\n return html;\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Create a text run\n */\nfunction createTextRun(text: string, formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [{ type: 'text', text }],\n };\n}\n\n/**\n * Create a break run\n */\nfunction createBreakRun(formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [{ type: 'break', breakType: 'textWrapping' }],\n };\n}\n\n// ============================================================================\n// KEYBOARD HANDLER\n// ============================================================================\n\n/**\n * Create clipboard keyboard handlers for an editor\n */\nexport function createClipboardHandlers(options: {\n onCopy?: () => { runs: Run[] } | null;\n onCut?: () => { runs: Run[] } | null;\n onPaste?: (content: ParsedClipboardContent) => void;\n clipboardOptions?: ClipboardOptions;\n}) {\n const { onCopy, onCut, onPaste, clipboardOptions = {} } = options;\n\n const handleCopy = async (event: ClipboardEvent) => {\n if (!onCopy) return;\n\n const data = onCopy();\n if (!data) return;\n\n event.preventDefault();\n\n const content = runsToClipboardContent(data.runs);\n\n if (event.clipboardData) {\n event.clipboardData.setData(CLIPBOARD_TYPES.PLAIN, content.plainText);\n event.clipboardData.setData(CLIPBOARD_TYPES.HTML, content.html);\n } else {\n await writeToClipboard(content);\n }\n };\n\n const handleCut = async (event: ClipboardEvent) => {\n if (!onCut) return;\n\n const data = onCut();\n if (!data) return;\n\n event.preventDefault();\n\n const content = runsToClipboardContent(data.runs);\n\n if (event.clipboardData) {\n event.clipboardData.setData(CLIPBOARD_TYPES.PLAIN, content.plainText);\n event.clipboardData.setData(CLIPBOARD_TYPES.HTML, content.html);\n } else {\n await writeToClipboard(content);\n }\n };\n\n const handlePaste = (event: ClipboardEvent) => {\n if (!onPaste) return;\n\n event.preventDefault();\n\n const content = handlePasteEvent(event, clipboardOptions);\n if (content) {\n onPaste(content);\n }\n };\n\n const handleKeyDown = async (event: KeyboardEvent) => {\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n // Ctrl+C / Cmd+C\n if (isCtrlOrMeta && event.key === 'c' && !event.shiftKey) {\n if (onCopy) {\n const data = onCopy();\n if (data) {\n await copyRuns(data.runs, clipboardOptions);\n }\n }\n }\n\n // Ctrl+X / Cmd+X\n if (isCtrlOrMeta && event.key === 'x' && !event.shiftKey) {\n if (onCut) {\n const data = onCut();\n if (data) {\n await copyRuns(data.runs, clipboardOptions);\n }\n }\n }\n\n // Ctrl+V / Cmd+V handled by paste event\n };\n\n return {\n handleCopy,\n handleCut,\n handlePaste,\n handleKeyDown,\n };\n}\n\nexport default {\n copyRuns,\n copyParagraphs,\n readFromClipboard,\n handlePasteEvent,\n htmlToRuns,\n cleanWordHtml,\n isWordHtml,\n isEditorHtml,\n createClipboardHandlers,\n};\n"]}