{"version":3,"sources":["../src/io/ooxml-marks.ts","../src/io/ooxml-units.ts","../src/io/table-model.ts","../src/page-setup.ts","../src/io/ooxml-parser.ts","../src/io/ooxml-serializer.ts","../src/theme.ts","../src/io/docx-package.ts","../src/io/save.ts","../src/extensions/registry.ts","../src/extensions/builtins/table-enhancements.ts","../src/extensions/builtins/font-size.ts","../src/extensions/builtins/page-break.ts","../src/extensions/builtins/docx-image.ts","../src/extensions/builtins/text-layout.ts","../src/extensions/builtins/image-interactions.ts","../src/extensions/builtins/legal-block.ts","../src/extensions/builtins/paragraph-layout.ts","../src/extensions/builtins/track-changes.ts","../src/extensions/builtins/history-diff-overlay.ts","../src/extensions/builtins/comments.ts","../src/extensions/builtins/content-controls.ts","../src/extensions/builtins/bookmarks.ts","../src/extensions/builtins/fields.ts","../src/extensions/builtins/tiptap-defaults.ts","../src/extensions/builtins/index.ts","../src/extensions/builtins/watermark.ts","../src/context/block-format.ts","../src/io/load.ts","../src/editor.ts","../src/io/html.ts","../src/io/embedded-fonts.ts","../src/react/icons.tsx","../src/react/TitleBar.tsx","../src/react/FloatingPanel.tsx","../src/react/ModeSwitcher.tsx","../src/react/HeaderActions.tsx","../src/react/history.ts","../src/react/history/historyDiff.ts","../src/react/history/useHistoryDiffPreview.ts","../src/react/history/HistoryEntryRow.tsx","../src/react/history/HistorySidebar.tsx","../src/react/MenuBar/MenuDropdown.tsx","../src/react/MenuBar/MenuDropdownItem.tsx","../src/react/MenuBar/MenuDropdownSeparator.tsx","../src/react/MenuBar/MenuDropdownLabel.tsx","../src/react/helpers.ts","../src/react/document-structure/index.ts","../src/react/document-structure/PageSetupDialog.tsx","../src/react/document-structure/dialogStyles.ts","../src/react/document-structure/PromptDialog.tsx","../src/react/document-structure/InsertSymbolDialog.tsx","../src/react/document-structure/PasteSpecialDialog.tsx","../src/react/document-structure/WatermarkDialog.tsx","../src/react/document-structure/GoogleDocsPasteInliner.ts","../src/react/document-structure/DocumentOutline.tsx","../src/react/document-structure/ParagraphStylePicker.tsx","../src/react/page-setup-storage.ts","../src/react/MenuBar/MenuBar.tsx","../src/react/Dropdown.tsx","../src/react/ToolbarPrimitives/ToolbarGroup.tsx","../src/react/ToolbarPrimitives/ToolbarIconButton.tsx","../src/react/ToolbarPrimitives/ToolbarTextButton.tsx","../src/react/ToolbarPrimitives/ToolbarIconMenu.tsx","../src/react/ToolbarPrimitives/palette.ts","../src/react/ToolbarPrimitives/ColorButton.tsx","../src/react/TableSizePicker.tsx","../src/react/TemplatePicker.tsx","../src/react/Toolbar.tsx","../src/react/mobile/MobileMoreSheet.tsx","../src/react/mobile/MobileHeader.tsx","../src/react/ui-widgets/usePageZoom.ts","../src/react/mobile/MobileZoomControl.tsx","../src/react/mobile/MobileStatusBar.tsx","../src/react/mobile/useScrollEdges.ts","../src/react/mobile/MobileToolbar.tsx","../src/react/mobile/useKeyboardInset.ts","../src/react/mobile/SelectionFormatBar.tsx","../src/react/StatusBar.tsx","../src/extensions/builtins/table-attr-sync.ts","../src/extensions/builtins/table-hover-utils.ts","../src/extensions/builtins/table-row-resize.ts","../src/extensions/builtins/table-insert-buttons.ts","../src/extensions/builtins/table-move-handle.ts","../src/extensions/builtins/table-selector-handles.ts","../src/extensions/builtins/table-interactions.ts","../src/react/ui-widgets/ZoomControl.tsx","../src/react/ui-widgets/PageIndicator.tsx","../src/react/ui-widgets/UnsavedIndicator.tsx","../src/react/ui-widgets/useWheelZoom.ts","../src/react/ui-widgets/ErrorBoundary.tsx","../src/react/ui-widgets/KeyboardShortcutsDialog.tsx","../src/react/ui-widgets/HyperlinkPopup.tsx","../src/react/ui-widgets/ContextMenu.tsx","../src/react/ui-widgets/TextContextMenu.tsx","../src/react/ui-widgets/ImageContextMenu.tsx","../src/react/context-menu/menuPrimitives/useClampedPosition.ts","../src/react/context-menu/menuPrimitives/useCloseOnOutside.ts","../src/react/context-menu/menuPrimitives/menuStyle.ts","../src/react/context-menu/menuPrimitives/MenuRow.tsx","../src/react/context-menu/menuPrimitives/MenuDivider.tsx","../src/react/context-menu/menuPrimitives/FormatIconRow.tsx","../src/react/context-menu/menuPrimitives/FontSizeRow.tsx","../src/react/context-menu/menuPrimitives/ColorRow.tsx","../src/react/context-menu/SelectionContextMenu.tsx","../src/react/context-menu/PageContextMenu.tsx","../src/react/context-menu/TableContextMenu/TablePropertiesDialog.tsx","../src/react/context-menu/TableContextMenu/TableContextMenu.tsx","../src/react/context-menu/LinkDialog.tsx","../src/react/context-menu/LinkHoverCard.tsx","../src/react/context-menu/EditorContextMenuLayer.tsx","../src/react/AgentMention/AgentMentionMenu.tsx","../src/react/AgentMention/activityMerge.ts","../src/react/AgentMention/toolLabels.ts","../src/react/AgentMention/ToolTimelineRow.tsx","../src/react/AgentMention/ToolTimeline.tsx","../src/react/AgentMention/PulseDots.tsx","../src/react/AgentMention/ThinkingRow.tsx","../src/react/AgentMention/ActivityFeed.tsx","../src/react/usePointerDrag.ts","../src/react/MobileSheet.tsx","../src/react/AgentMention/AgentMentionBubble.tsx","../src/react/AgentMention/AgentMentionView.tsx","../src/react/SuggestionLayer.tsx","../src/react/comments-store.ts","../src/react/Comments/CommentsToggleButton.tsx","../src/react/Comments/CommentAddTrigger.tsx","../src/react/Comments/useMentionAutocomplete.ts","../src/react/Comments/CommentComposer.tsx","../src/react/Comments/CommentThreadItem.tsx","../src/react/Comments/CommentsPanel.tsx","../src/react/Comments/CommentsLayer.tsx","../src/react/find-replace-search.ts","../src/react/FindReplace.tsx","../src/react/Ruler.tsx","../src/react/ReactDocxEditor.tsx","../src/react/auto-save.ts"],"names":["n","PAGE_SIZE_PRESETS","documentXml","stylesXml","coreXml","numberingXml","commentsXml","base","getJSZip","EMU_PER_PX","escapeXml","saveDocxFromJSON","JSZip","hasComments","Table","TableRow","TableCell","TableHeader","Extension","Node","mergeAttributes","Selection","Plugin","PluginKey","state","Image","Mark","ReplaceStep","Decoration","DecorationSet","StarterKit","Underline","TextAlign","TextStyle","Color","FontFamily","Highlight","Subscript","Superscript","Link","Placeholder","mammoth","Editor","TextSelection","jsxs","jsx","React","createPortal","React2","React3","slot","name","React4","i","j","React5","React6","React7","React8","React9","React10","React11","Fragment","React12","React13","React14","React15","React16","React17","React18","React19","React20","React21","React22","React23","React24","React25","React26","React27","React28","React29","React30","applyRowHeight","CellSelection","React31","React32","React33","React34","overlayStyle","dialogStyle","closeBtnStyle","React35","React36","React37","React38","menuStyle","getMarkRange","React39","React40","toggle","React41","React42","id","React43","React44","React45","React46","React47","React48","VIEWPORT_MARGIN","React49","React50","React51","SNIPPET_MAX","snippet","formatWhen","React52","React53","React54","React55","React56","React57","React58"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * Shared mark <-> OOXML attribute tables, used by the parser, the selective\n * serializer, and the full-rebuild (`docx` library) save path.\n *\n * `ooxml-parser.ts` and `ooxml-serializer.ts` used to each carry their own\n * copy of the highlight-color table — the parser's OOXML-name-to-hex map had\n * 15 entries, the serializer's reverse hex-to-name map had only 6, so\n * highlighting a run `darkGreen` in Word and round-tripping it through a\n * selective save silently turned it `yellow` (the serializer's fallback)\n * because `#006400` wasn't in its table at all. Deriving the reverse map\n * from the same table makes the two directions structurally impossible to\n * disagree.\n */\n\n/** Canonical OOXML highlight-color name -> CSS hex color. */\nexport const HIGHLIGHT_COLORS: Record<string, string> = {\n  yellow: '#fff3a0',\n  green: '#90ee90',\n  cyan: '#87ceeb',\n  magenta: '#ffb6c1',\n  blue: '#add8e6',\n  red: '#ffb3b3',\n  darkBlue: '#00008b',\n  darkCyan: '#008b8b',\n  darkGreen: '#006400',\n  darkMagenta: '#8b008b',\n  darkRed: '#8b0000',\n  darkYellow: '#8b8b00',\n  darkGray: '#a9a9a9',\n  lightGray: '#d3d3d3',\n  black: '#000000',\n};\n\n/** Derived reverse lookup — always symmetric with `HIGHLIGHT_COLORS` above. */\nconst HEX_TO_HIGHLIGHT_NAME: Record<string, string> = Object.fromEntries(\n  Object.entries(HIGHLIGHT_COLORS).map(([name, hex]) => [hex.toLowerCase(), name]),\n);\n\n/** OOXML highlight name -> CSS hex, e.g. `\"darkGreen\"` -> `\"#006400\"`. Unknown names fall back to yellow. */\nexport function highlightNameToHex(ooxmlColor: string): string {\n  return HIGHLIGHT_COLORS[ooxmlColor] ?? HIGHLIGHT_COLORS.yellow;\n}\n\n/** CSS hex -> OOXML highlight name, e.g. `\"#006400\"` -> `\"darkGreen\"`. Unknown colors fall back to yellow. */\nexport function hexToHighlightName(hex: string): string {\n  return HEX_TO_HIGHLIGHT_NAME[(hex ?? '').toLowerCase()] ?? 'yellow';\n}\n","/**\n * Shared unit-conversion constants for OOXML <-> CSS px, used by the parser,\n * the selective serializer, and the full-rebuild (`docx` library) save path.\n *\n * Previously each of those three places carried its own copy of the\n * point/pixel ratio as a bare `1.333` literal (`ooxml-parser.ts` and\n * `ooxml-serializer.ts`), which is an approximation of the real ratio and\n * risked drifting further apart if one side's rounding were ever tweaked\n * without touching the other. Centralizing it here means parse and\n * serialize always agree exactly, since they're the same function.\n */\n\n/** CSS px per point at 96 DPI (the standard \"1 CSS px = 1/96 inch\" ratio). */\nexport const PX_PER_POINT = 96 / 72;\n\n/** OOXML expresses font sizes in half-points (`w:sz`). Convert to CSS px. */\nexport function halfPointsToPx(halfPoints: number): number {\n  return (halfPoints / 2) * PX_PER_POINT;\n}\n\n/** Convert a CSS px font size back to OOXML half-points, rounded. */\nexport function pxToHalfPoints(px: number): number {\n  return Math.round((px / PX_PER_POINT) * 2);\n}\n","/**\n * Shared table-layout model — the single source of truth both DOCX save\n * paths (`io/save.ts` via the `docx` library, and `io/ooxml-serializer.ts`\n * via raw OOXML strings) use to turn a TipTap `table` node into a real\n * grid.\n *\n * Why this exists: a TipTap/ProseMirror table only stores the cells that\n * *originate* in each row. A cell with `rowspan > 1` appears once, in its\n * top row; the positions it covers in the rows below are simply absent\n * from those rows' `content`. To emit correct OOXML (`<w:gridSpan>` for\n * horizontal merges, `<w:vMerge>` restart/continue for vertical merges,\n * and a `<w:tblGrid>` whose column count matches every row) we have to\n * reconstruct the full rectangular grid — which is exactly what both\n * serializers were missing, so column widths, merged cells, shading and\n * alignment were all being dropped on export.\n *\n * Keeping this in one module means the two export paths can't drift out of\n * sync on how they interpret `colwidth`/`colspan`/`rowspan`.\n */\n\n/** 1 CSS px @ 96dpi = 1/96 in; 1 in = 1440 twips → 15 twips per px. */\nexport const TWIPS_PER_PX = 15;\n\nexport interface TableCellModel {\n  /** The originating TipTap cell node (tableCell | tableHeader). */\n  node: any;\n  /** Whether this cell is a header cell (`tableHeader`). */\n  isHeader: boolean;\n  /** Horizontal span (OOXML `w:gridSpan`). >= 1. */\n  colspan: number;\n  /** Vertical span (drives OOXML `w:vMerge` restart). >= 1. */\n  rowspan: number;\n  /** 0-based index of this cell's first column in the reconstructed grid. */\n  gridColStart: number;\n  /** Combined width in px across the columns this cell spans, or null when\n   *  no `colwidth` info is available for any spanned column. */\n  widthPx: number | null;\n  /** Per-column background fill (hex without '#'), or null. */\n  backgroundColor: string | null;\n  /** True for the synthetic continuation cells emitted in the rows a\n   *  rowspan covers — these must render as `<w:vMerge/>` (continue) with no\n   *  content of their own. */\n  vMergeContinue: boolean;\n}\n\nexport interface TableRowModel {\n  cells: TableCellModel[];\n  /** Explicit row height in px (from the `rowHeight` attr), or null. */\n  heightPx: number | null;\n}\n\nexport interface TableModel {\n  rows: TableRowModel[];\n  /** Number of grid columns (max across all rows). */\n  columns: number;\n  /** Per-grid-column width in px. Entries are null where unknown. */\n  colWidthsPx: (number | null)[];\n  /** Table-level attributes, normalized. */\n  tableWidthPx: number | null;\n  tableWidthPercent: number | null;\n  align: 'left' | 'center' | 'right' | null;\n  borderStyle: string | null;\n  tableStyleId: string | null;\n}\n\n/** Parse a CSS length like \"120px\", \"50%\", or a bare number to px. Returns\n *  `{ px }`, `{ percent }`, or null when unresolvable. */\nfunction parseLength(value: any): { px?: number; percent?: number } | null {\n  if (value === null || value === undefined || value === '') return null;\n  const str = String(value).trim();\n  if (str.endsWith('%')) {\n    const n = parseFloat(str);\n    return isNaN(n) ? null : { percent: n };\n  }\n  const n = parseFloat(str);\n  return isNaN(n) || n <= 0 ? null : { px: Math.round(n) };\n}\n\n/** Normalize a CSS color to an OOXML hex ('RRGGBB', no '#'), or null.\n *  Supports #rgb, #rrggbb, and a small set of common names. */\nexport function cssColorToHex(value: any): string | null {\n  if (!value) return null;\n  let s = String(value).trim().toLowerCase();\n  const NAMED: Record<string, string> = {\n    white: 'FFFFFF', black: '000000', red: 'FF0000', green: '008000',\n    blue: '0000FF', yellow: 'FFFF00', gray: '808080', grey: '808080',\n    silver: 'C0C0C0', transparent: '',\n  };\n  if (s in NAMED) return NAMED[s] || null;\n  const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/.exec(s);\n  if (!m) return null;\n  let hex = m[1];\n  if (hex.length === 3) hex = hex.split('').map((c) => c + c).join('');\n  return hex.toUpperCase();\n}\n\nfunction cellAttr(node: any, key: string): any {\n  return node?.attrs ? node.attrs[key] : undefined;\n}\n\n/**\n * Reconstruct the full rectangular grid of a TipTap `table` node,\n * resolving colspan/rowspan into explicit per-row cells (including\n * synthetic vMerge-continuation cells) and computing per-column widths.\n */\nexport function buildTableModel(tableNode: any): TableModel {\n  const rowNodes = (tableNode?.content ?? []).filter(\n    (r: any) => r?.type === 'tableRow',\n  );\n\n  // Occupancy tracker: for each grid column, how many more rows a rowspan\n  // from above still covers, plus the info needed to emit its continuation.\n  interface Pending {\n    remaining: number;\n    colspan: number;\n    isHeader: boolean;\n    widthPx: number | null;\n    backgroundColor: string | null;\n  }\n  const pending: (Pending | null)[] = [];\n  const rows: TableRowModel[] = [];\n  const colWidthsPx: (number | null)[] = [];\n\n  const noteColWidth = (gridCol: number, span: number, colwidth: any) => {\n    // `colwidth` is an array (one entry per spanned grid column) per the\n    // prosemirror-tables schema. Record each column's own width.\n    if (Array.isArray(colwidth)) {\n      for (let k = 0; k < span; k++) {\n        const w = colwidth[k];\n        if (typeof w === 'number' && w > 0 && colWidthsPx[gridCol + k] == null) {\n          colWidthsPx[gridCol + k] = Math.round(w);\n        }\n      }\n    }\n  };\n\n  for (const rowNode of rowNodes) {\n    const cellsOut: TableCellModel[] = [];\n    const rowCells = (rowNode.content ?? []).filter(\n      (c: any) => c?.type === 'tableCell' || c?.type === 'tableHeader',\n    );\n\n    let gridCol = 0;\n    let cellIdx = 0;\n\n    // Emit continuation cells for any rowspans coming from above, and place\n    // this row's real cells in the gaps between them.\n    const advancePending = () => {\n      while (pending[gridCol] && pending[gridCol]!.remaining > 0) {\n        const p = pending[gridCol]!;\n        cellsOut.push({\n          node: null,\n          isHeader: p.isHeader,\n          colspan: p.colspan,\n          rowspan: 1,\n          gridColStart: gridCol,\n          widthPx: p.widthPx,\n          backgroundColor: p.backgroundColor,\n          vMergeContinue: true,\n        });\n        p.remaining -= 1;\n        const span = p.colspan;\n        if (p.remaining <= 0) {\n          for (let k = 0; k < span; k++) pending[gridCol + k] = null;\n        }\n        gridCol += span;\n      }\n    };\n\n    while (cellIdx < rowCells.length || (pending[gridCol] && pending[gridCol]!.remaining > 0)) {\n      advancePending();\n      if (cellIdx >= rowCells.length) break;\n\n      const cell = rowCells[cellIdx++];\n      const colspan = Math.max(1, Number(cellAttr(cell, 'colspan')) || 1);\n      const rowspan = Math.max(1, Number(cellAttr(cell, 'rowspan')) || 1);\n      const isHeader = cell.type === 'tableHeader';\n      const colwidth = cellAttr(cell, 'colwidth');\n      const backgroundColor = cssColorToHex(cellAttr(cell, 'backgroundColor'));\n\n      noteColWidth(gridCol, colspan, colwidth);\n      let widthPx: number | null = null;\n      if (Array.isArray(colwidth)) {\n        const sum = colwidth\n          .slice(0, colspan)\n          .reduce((a: number, b: any) => a + (typeof b === 'number' ? b : 0), 0);\n        if (sum > 0) widthPx = Math.round(sum);\n      }\n\n      cellsOut.push({\n        node: cell,\n        isHeader,\n        colspan,\n        rowspan,\n        gridColStart: gridCol,\n        widthPx,\n        backgroundColor,\n        vMergeContinue: false,\n      });\n\n      if (rowspan > 1) {\n        for (let k = 0; k < colspan; k++) {\n          pending[gridCol + k] = {\n            remaining: rowspan - 1,\n            colspan: 1,\n            isHeader,\n            widthPx: null,\n            backgroundColor,\n          };\n        }\n        // Store the full colspan on the first covered column so the\n        // continuation renders one cell of the right span.\n        if (pending[gridCol]) pending[gridCol]!.colspan = colspan;\n        for (let k = 1; k < colspan; k++) pending[gridCol + k] = null;\n      }\n\n      gridCol += colspan;\n    }\n    // Flush any trailing rowspans that extend past the last real cell.\n    advancePending();\n\n    const heightLen = parseLength(cellAttr(rowNode, 'rowHeight'));\n    rows.push({\n      cells: cellsOut,\n      heightPx: heightLen?.px ?? null,\n    });\n  }\n\n  const columns = rows.reduce(\n    (max, r) => Math.max(max, r.cells.reduce((s, c) => s + c.colspan, 0)),\n    0,\n  );\n  // Pad width array to column count.\n  for (let i = 0; i < columns; i++) if (colWidthsPx[i] === undefined) colWidthsPx[i] = null;\n\n  const tableWidthLen = parseLength(cellAttr(tableNode, 'tableWidth'));\n  const alignRaw = cellAttr(tableNode, 'tableAlign');\n  const align =\n    alignRaw === 'center' || alignRaw === 'right' || alignRaw === 'left'\n      ? alignRaw\n      : null;\n\n  return {\n    rows,\n    columns,\n    colWidthsPx: colWidthsPx.slice(0, columns),\n    tableWidthPx: tableWidthLen?.px ?? null,\n    tableWidthPercent: tableWidthLen?.percent ?? null,\n    align,\n    borderStyle: cellAttr(tableNode, 'borderStyle') ?? null,\n    tableStyleId: cellAttr(tableNode, 'tableStyleId') ?? null,\n  };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Border + table-style preset resolution                                     */\n/* -------------------------------------------------------------------------- */\n\nexport interface BorderSpec {\n  /** OOXML border value: 'single' | 'none'. */\n  val: 'single' | 'none';\n  /** Eighths of a point. */\n  sz: number;\n  /** Hex color or 'auto'. */\n  color: string;\n}\n\nexport interface TableBorders {\n  top: BorderSpec;\n  bottom: BorderSpec;\n  left: BorderSpec;\n  right: BorderSpec;\n  insideH: BorderSpec;\n  insideV: BorderSpec;\n}\n\nconst B = (val: 'single' | 'none', color = 'auto', sz = 4): BorderSpec => ({ val, sz, color });\nconst NONE: BorderSpec = { val: 'none', sz: 0, color: 'auto' };\n\n/**\n * Resolve the effective table borders from the editor's `data-border-style`\n * / `data-table-style` presets so the exported .docx matches what the CSS\n * shows on screen. Mirrors the `[data-border-style]` / `[data-table-style]`\n * rules in `editor.css`.\n */\nexport function resolveTableBorders(model: TableModel): TableBorders {\n  const all = (): TableBorders => ({\n    top: B('single', 'D0D7DE'), bottom: B('single', 'D0D7DE'),\n    left: B('single', 'D0D7DE'), right: B('single', 'D0D7DE'),\n    insideH: B('single', 'D0D7DE'), insideV: B('single', 'D0D7DE'),\n  });\n  const none = (): TableBorders => ({\n    top: NONE, bottom: NONE, left: NONE, right: NONE, insideH: NONE, insideV: NONE,\n  });\n\n  switch (model.borderStyle) {\n    case 'none':\n      return none();\n    case 'outside': {\n      const b = none();\n      const edge = B('single', '1F2328');\n      return { ...b, top: edge, bottom: edge, left: edge, right: edge };\n    }\n    case 'inside': {\n      const b = all();\n      return { ...b, top: NONE, bottom: NONE, left: NONE, right: NONE };\n    }\n    case 'top':\n      return { ...none(), top: B('single', '1F2328') };\n    case 'bottom':\n      return { ...none(), bottom: B('single', '1F2328') };\n    case 'left':\n      return { ...none(), left: B('single', '1F2328') };\n    case 'right':\n      return { ...none(), right: B('single', '1F2328') };\n    case 'all':\n      return all();\n  }\n\n  // Fall back to table-style presets when no explicit border style is set.\n  switch (model.tableStyleId) {\n    case 'medium-grid': {\n      const g = B('single', '1F2937');\n      return { top: g, bottom: g, left: g, right: g, insideH: g, insideV: g };\n    }\n    case 'plain': {\n      const g = B('single', 'ECEEF1');\n      return { top: g, bottom: g, left: g, right: g, insideH: g, insideV: g };\n    }\n    case 'light-shading': {\n      const g = B('single', 'BFDBFE');\n      return { top: g, bottom: g, left: g, right: g, insideH: g, insideV: g };\n    }\n    case 'light-shading-accent': {\n      const g = B('single', 'BBF7D0');\n      return { top: g, bottom: g, left: g, right: g, insideH: g, insideV: g };\n    }\n  }\n\n  // Default editor table styling: 1px #d0d7de all around.\n  return all();\n}\n\n/** Per-cell fill resolved from the table-style preset, for cells that have\n *  no explicit `backgroundColor`. `rowIndex` is 0-based; `isHeader` marks\n *  header cells. Returns a hex (no '#') or null. */\nexport function presetCellFill(\n  model: TableModel,\n  isHeader: boolean,\n  rowIndex: number,\n): string | null {\n  switch (model.tableStyleId) {\n    case 'light-shading':\n      if (isHeader) return 'DBEAFE';\n      return rowIndex % 2 === 1 ? 'EFF6FF' : null;\n    case 'light-shading-accent':\n      if (isHeader) return 'DCFCE7';\n      return rowIndex % 2 === 1 ? 'F0FDF4' : null;\n    case 'medium-grid':\n      if (isHeader) return '1F2937';\n      return null;\n    case 'grid-light':\n      if (isHeader) return 'F3F4F6';\n      return null;\n    case 'plain':\n      return null;\n    default:\n      // Default editor styling: header row shaded light gray.\n      return isHeader ? 'F6F8FA' : null;\n  }\n}\n","/**\n * Page setup — size presets, custom dimensions, orientation, and margins.\n *\n * Framework-agnostic (no React import): `DocxEditor.setPageSetup()` in\n * `editor.ts` needs this data/logic directly, and `packages/editor/src/react/\n * document-structure.tsx`'s `PageSetupDialog` re-exports the types/presets\n * from here rather than defining its own copy.\n *\n * Margins are `marginX`/`marginY` (horizontal / vertical), not 4 independent\n * sides — the theme/CSS-var system (`--de-page-margin-x`/`-y`) only supports\n * symmetric margins, so this matches what can actually be applied.\n */\nimport { TWIPS_PER_PX } from './io/table-model';\n\nexport type PageSizePreset =\n  | 'letter'\n  | 'a4'\n  | 'legal'\n  | 'a3'\n  | 'a5'\n  | 'b5'\n  | 'executive'\n  | 'custom';\n\nexport interface PageSetup {\n  size: PageSizePreset;\n  orientation: 'portrait' | 'landscape';\n  /** Only used when `size === 'custom'`. Millimeters. */\n  customWidthMm?: number;\n  /** Only used when `size === 'custom'`. Millimeters. */\n  customHeightMm?: number;\n  /** Horizontal margin (left + right), inches. */\n  marginX: number;\n  /** Vertical margin (top + bottom), inches. */\n  marginY: number;\n}\n\nexport const PAGE_SIZE_PRESETS: Record<\n  Exclude<PageSizePreset, 'custom'>,\n  { label: string; width: string; height: string }\n> = {\n  letter: { label: 'Letter (8.5 x 11 in)', width: '816px', height: '1056px' },\n  a4: { label: 'A4 (210 x 297mm)', width: '794px', height: '1123px' },\n  legal: { label: 'Legal (8.5 x 14 in)', width: '816px', height: '1344px' },\n  a3: { label: 'A3 (297 x 420mm)', width: '1123px', height: '1587px' },\n  a5: { label: 'A5 (148 x 210mm)', width: '559px', height: '794px' },\n  b5: { label: 'B5 (176 x 250mm)', width: '666px', height: '945px' },\n  executive: { label: 'Executive (7.25 x 10.5 in)', width: '696px', height: '1008px' },\n};\n\nexport const DEFAULT_PAGE_SETUP: PageSetup = {\n  size: 'a4',\n  orientation: 'portrait',\n  marginX: 1,\n  marginY: 1,\n};\n\nexport function mmToPx(mm: number): number {\n  return (mm / 25.4) * 96;\n}\n\nexport function pxToMm(px: number): number {\n  return (px / 96) * 25.4;\n}\n\n/** Resolve a PageSetup into concrete pixel dimensions, honoring orientation swap. */\nexport function resolvePageDimensions(setup: PageSetup): { widthPx: number; heightPx: number } {\n  let widthPx: number;\n  let heightPx: number;\n  if (setup.size === 'custom') {\n    widthPx = mmToPx(setup.customWidthMm ?? 210);\n    heightPx = mmToPx(setup.customHeightMm ?? 297);\n  } else {\n    const preset = PAGE_SIZE_PRESETS[setup.size];\n    widthPx = parseInt(preset.width, 10);\n    heightPx = parseInt(preset.height, 10);\n  }\n  if (setup.orientation === 'landscape') {\n    [widthPx, heightPx] = [heightPx, widthPx];\n  }\n  return { widthPx, heightPx };\n}\n\n/** OOXML page size/margin dimensions, in twips (DXA — 1/1440 inch). */\nexport interface PageDimensionsTwips {\n  widthTwips: number;\n  heightTwips: number;\n  marginXTwips: number;\n  marginYTwips: number;\n}\n\nconst TWIPS_PER_INCH = 1440;\n\n/**\n * Resolve a PageSetup into OOXML twips, for `<w:pgSz>`/`<w:pgMar>` — used by\n * both `.docx` export paths (`io/save.ts`'s `docx`-library rebuild and\n * `io/ooxml-serializer.ts`'s raw-XML rebuild) so an exported file's page\n * size/margins always match what's shown on screen, instead of each save\n * path hardcoding its own default (previously: both silently exported US\n * Letter with 1in margins regardless of the live page setup).\n */\nexport function resolvePageDimensionsTwips(setup: PageSetup): PageDimensionsTwips {\n  const { widthPx, heightPx } = resolvePageDimensions(setup);\n  return {\n    widthTwips: Math.round(widthPx * TWIPS_PER_PX),\n    heightTwips: Math.round(heightPx * TWIPS_PER_PX),\n    marginXTwips: Math.round(setup.marginX * TWIPS_PER_INCH),\n    marginYTwips: Math.round(setup.marginY * TWIPS_PER_INCH),\n  };\n}\n\n/**\n * Real Word documents store \"true\" ISO/ANSI paper dimensions in twips\n * (e.g. A4 = 11906x16838), which differ by a few twips (<0.5mm) from this\n * app's own px-rounded presets run back through `resolvePageDimensionsTwips`\n * (e.g. A4 = 11910x16845) — this tolerance absorbs that drift without risking\n * misclassifying a genuinely different custom size as a preset.\n */\nconst PRESET_MATCH_TOLERANCE_TWIPS = 20;\n\nfunction closeEnough(a: number, b: number): boolean {\n  return Math.abs(a - b) <= PRESET_MATCH_TOLERANCE_TWIPS;\n}\n\n/**\n * Reverse of `resolvePageDimensionsTwips()`: given a page size/margin read\n * from a loaded .docx's `<w:sectPr>`, find the matching size preset +\n * orientation, or fall back to `'custom'` with the size expressed in mm —\n * so opening an existing A4/Legal/custom-size document restores the\n * editor's on-screen page setup to match, instead of resetting to whatever\n * the app's own default/last-used preference was.\n */\nexport function pageSetupFromTwips(pd: PageDimensionsTwips): PageSetup {\n  const marginX = Math.round((pd.marginXTwips / TWIPS_PER_INCH) * 100) / 100;\n  const marginY = Math.round((pd.marginYTwips / TWIPS_PER_INCH) * 100) / 100;\n\n  for (const size of Object.keys(PAGE_SIZE_PRESETS) as Array<Exclude<PageSizePreset, 'custom'>>) {\n    const preset = PAGE_SIZE_PRESETS[size];\n    const presetWidthTwips = Math.round(parseInt(preset.width, 10) * TWIPS_PER_PX);\n    const presetHeightTwips = Math.round(parseInt(preset.height, 10) * TWIPS_PER_PX);\n    if (closeEnough(pd.widthTwips, presetWidthTwips) && closeEnough(pd.heightTwips, presetHeightTwips)) {\n      return { size, orientation: 'portrait', marginX, marginY };\n    }\n    if (closeEnough(pd.widthTwips, presetHeightTwips) && closeEnough(pd.heightTwips, presetWidthTwips)) {\n      return { size, orientation: 'landscape', marginX, marginY };\n    }\n  }\n\n  return {\n    size: 'custom',\n    orientation: 'portrait',\n    customWidthMm: Math.round((pd.widthTwips / TWIPS_PER_INCH) * 25.4),\n    customHeightMm: Math.round((pd.heightTwips / TWIPS_PER_INCH) * 25.4),\n    marginX,\n    marginY,\n  };\n}\n","/**\n * OOXML Parser — parse word/document.xml directly into TipTap JSON.\n *\n * This replaces mammoth (which converts to lossy HTML) with a direct\n * XML → JSON converter that preserves:\n *   - Paragraph styles (Heading 1-6, Normal, Quote, Code)\n *   - Character formatting (bold, italic, underline, strike, color, font size, font family)\n *   - Text alignment (left, center, right, justify)\n *   - Line spacing\n *   - Tables (with cell content, borders, widths)\n *   - Lists (bullet, numbered with indentation)\n *   - Images (inline and floating, with dimensions)\n *   - Hyperlinks (with href)\n *   - Page breaks (w:br w:type=\"page\")\n *   - Bookmarks and internal links\n *\n * The parser reads the raw XML from the .docx ZIP, so it has access to\n * ALL formatting information — not just what mammoth chooses to expose.\n */\n\nimport { highlightNameToHex } from './ooxml-marks';\nimport { halfPointsToPx } from './ooxml-units';\nimport { TWIPS_PER_PX } from './table-model';\nimport { pageSetupFromTwips, type PageSetup } from '../page-setup';\n\n// Lazy-load JSZip\nlet JSZip: any = null;\nasync function getJSZip(): Promise<any> {\n  if (JSZip) return JSZip;\n  const mod = await import('jszip');\n  JSZip = mod.default || mod;\n  return JSZip;\n}\n\n/**\n * OOXML drawing units are EMUs (English Metric Units), 914400 per inch. At\n * the standard 96dpi CSS uses, that's 9525 EMU per pixel — the same constant\n * `ooxml-serializer.ts` uses when writing `<wp:extent>`, so a load → save\n * round-trip reproduces the original size (mod rounding) instead of drifting\n * through a second, slightly different ratio.\n */\nconst EMU_PER_PX = 9525;\n\n/**\n * Maps a media part's file extension to the MIME type its bytes need to be\n * tagged with in the `data:` URI the editor's image node expects as `src`.\n * The inverse of the serializer's `IMAGE_EXT_BY_MIME` (kept as its own local\n * table since that one isn't exported) — the two lists must still agree on\n * the same formats, or an image would parse on import but fail to decode on\n * the way back out.\n */\nconst MIME_BY_EXT: Record<string, string> = {\n  png: 'image/png',\n  jpg: 'image/jpeg',\n  jpeg: 'image/jpeg',\n  gif: 'image/gif',\n  bmp: 'image/bmp',\n  webp: 'image/webp',\n  svg: 'image/svg+xml',\n  tif: 'image/tiff',\n  tiff: 'image/tiff',\n  ico: 'image/x-icon',\n};\n\n/* -------------------------------------------------------------------------- */\n/* Types                                                                       */\n/* -------------------------------------------------------------------------- */\n\nexport interface ParsedOOXML {\n  /** TipTap JSON document (ready for editor.setJSON()). */\n  json: any;\n  /** Raw document.xml string (for selective save round-trip). */\n  documentXml: string;\n  /** Styles.xml parsed as a Map<styleId, StyleDef>. */\n  styles: Map<string, StyleDef>;\n  /** Document metadata from core.xml. */\n  metadata: DocxMetadata;\n  /** Any parsing warnings. */\n  warnings: string[];\n  /** Comment threads from word/comments.xml, keyed to the `comment` mark ids\n   *  in `json`. Seed a `CommentsStorageAdapter` with these after import. */\n  commentThreads: import('../comments-types').CommentThread[];\n  /** Header/footer content as plain HTML paragraphs (default type only, v1). */\n  headerHTML?: string;\n  footerHTML?: string;\n}\n\n/**\n * Raw `<w:ind>` attribute values in twips, before conversion to the editor's\n * px-based paragraph attrs. Kept in twips at this layer — on both a style\n * and a paragraph — so `resolveStyleIndent()` can hand back a style's whole\n * declared indentation unconverted, exactly mirroring how `ownNumId`/\n * `resolveStyleNumId()` handle numbering below.\n */\ninterface IndTwips {\n  left?: number;\n  right?: number;\n  firstLine?: number;\n  hanging?: number;\n}\n\n/** Read `<w:ind>`'s twips attributes — `w:left`/`w:start`, `w:right`/`w:end`,\n *  `w:firstLine`, `w:hanging` — or `undefined` if none of them are actually\n *  set (an empty `<w:ind/>` isn't meaningfully different from no element at\n *  all for callers deciding whether to fall back to a style's indentation). */\nfunction readIndAttrs(el: Element): IndTwips | undefined {\n  const left = parseInt(el.getAttribute('w:left') || el.getAttribute('w:start') || '', 10);\n  const right = parseInt(el.getAttribute('w:right') || el.getAttribute('w:end') || '', 10);\n  const firstLine = parseInt(el.getAttribute('w:firstLine') || '', 10);\n  const hanging = parseInt(el.getAttribute('w:hanging') || '', 10);\n  const out: IndTwips = {};\n  if (!isNaN(left) && left !== 0) out.left = left;\n  if (!isNaN(right) && right !== 0) out.right = right;\n  if (!isNaN(firstLine) && firstLine !== 0) out.firstLine = firstLine;\n  if (!isNaN(hanging) && hanging !== 0) out.hanging = hanging;\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport interface StyleDef {\n  styleId: string;\n  name: string;\n  type: 'paragraph' | 'character' | 'table' | 'numbering';\n  basedOn?: string;\n  headingLevel?: number;\n  alignment?: string;\n  /** `w:default=\"1\"` — Word's fallback style for runs/paragraphs of this type. */\n  isDefault?: boolean;\n  /**\n   * `w:numId` declared on this style's `<w:pPr><w:numPr>`. Word lets a\n   * paragraph style (e.g. \"List Number\") carry the numbering, so a clause\n   * paragraph states only `<w:pStyle w:val=\"ListNumber\"/>` with no direct\n   * `numPr` — common in legal documents. Resolved via `resolveStyleNumId()`.\n   */\n  ownNumId?: string;\n  /**\n   * The run formatting declared directly on this style (`<w:style><w:rPr>`),\n   * BEFORE `basedOn` inheritance is resolved. Word applies formatting through\n   * named styles at least as often as through direct run properties, so a\n   * faithful import has to read this — not just the run's own `<w:rPr>` — and\n   * fold it into the effective formatting. See `resolveStyleRunProps()`.\n   */\n  ownRunProps?: RunProps;\n  /**\n   * `w:ind` declared directly on this style's `<w:pPr>` — the indentation\n   * equivalent of `ownNumId`. A legal-document paragraph style (\"Clause\",\n   * \"Sub-Clause\") very often carries its indentation this way rather than\n   * repeating `<w:ind>` on every paragraph, so resolving only a paragraph's\n   * own direct `<w:ind>` would leave most of a template's indentation\n   * unresolved. See `resolveStyleIndent()`.\n   */\n  ownIndent?: IndTwips;\n}\n\n/**\n * A resolved set of character-formatting properties, in the editor's own\n * units (css color/px/font-stack), independent of where in the OOXML style\n * cascade they came from. Toggle properties (bold/italic/…) are tri-state:\n * `true` = on, `false` = explicitly turned off (a lower-priority \"on\" must\n * not win), `undefined` = not specified at this level (inherit).\n */\nexport interface RunProps {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  strike?: boolean;\n  vertAlign?: 'superscript' | 'subscript';\n  color?: string;\n  fontSizePx?: string;\n  fontFamily?: string;\n  highlight?: string;\n}\n\n/** Latin typefaces from `theme1.xml`'s font scheme, for `w:*Theme` refs. */\ninterface ThemeFonts {\n  major?: string;\n  minor?: string;\n}\n\n/**\n * Everything the paragraph/run parsers need to resolve a run's *effective*\n * formatting: the style table, numbering, the document defaults, the theme\n * fonts, and a memo cache so a style's `basedOn` chain is only walked once.\n */\ninterface ParseCtx {\n  styles: Map<string, StyleDef>;\n  numberingMap: Map<string, NumberingInfo>;\n  docDefaults: RunProps;\n  themeFonts: ThemeFonts;\n  styleRunPropsCache: Map<string, RunProps>;\n  /**\n   * `document.xml.rels` relationship id → target. A hyperlink stores only an\n   * `r:id` (e.g. \"rId7\"); the real URL lives in the rels part. Without this,\n   * links import with `href=\"rId7\"` — a dead link.\n   */\n  relations: Map<string, string>;\n  /**\n   * The `w:default=\"1\"` paragraph/character style ids. Word applies these to\n   * any paragraph/run that names no explicit `w:pStyle`/`w:rStyle`, so a\n   * template that puts its body font on the `Normal` style (rather than in\n   * `docDefaults`) still resolves correctly. See eigenpal/docx-editor's\n   * `style-cascade.ts` — the same \"defaults → bases → style → direct\" order.\n   */\n  defaultParaStyleId?: string;\n  defaultCharStyleId?: string;\n  /**\n   * `word/media/*` part contents, pre-read as `data:` URIs and keyed by the\n   * path a relationship's `Target` names (e.g. \"media/image1.png\") — see\n   * `readMediaParts()`. Images are embedded as base64 in the editor's node\n   * `src`, and the DOM-based paragraph/run parsers below are synchronous, so\n   * this has to be resolved once, up front, rather than awaited per-image\n   * deep inside `parseRun()`.\n   */\n  media: Map<string, string>;\n  /**\n   * Shared with the top-level `warnings` array `parseDocxOOXML` returns, so\n   * a run whose image can't be resolved (dangling relationship, unreadable\n   * media part) can record *why* it was dropped instead of failing silently\n   * or throwing and aborting the whole import.\n   */\n  warnings: string[];\n}\n\nexport interface DocxMetadata {\n  title?: string;\n  creator?: string;\n  created?: string;\n  modified?: string;\n  subject?: string;\n  description?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Main parse function                                                         */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parse a .docx ArrayBuffer into TipTap JSON with high fidelity.\n *\n * Unlike mammoth (which converts to HTML), this parser reads the raw\n * OOXML XML and converts directly to TipTap's ProseMirror JSON format,\n * preserving all formatting attributes.\n *\n * @param buffer - .docx file as ArrayBuffer\n * @returns Parsed document with JSON, raw XML, styles, and metadata\n */\nexport async function parseDocxOOXML(buffer: ArrayBuffer): Promise<ParsedOOXML> {\n  const zip = await getJSZip();\n  const doc = await zip.loadAsync(buffer);\n  const warnings: string[] = [];\n\n  // 1. Read document.xml\n  const documentFile = doc.file('word/document.xml');\n  if (!documentFile) throw new Error('word/document.xml not found in .docx');\n  const documentXml = await documentFile.async('string');\n\n  // 2. Read theme1.xml for the font scheme (so `w:asciiTheme=\"minorHAnsi\"`\n  //    — how Word records the ubiquitous Calibri default and heading fonts —\n  //    resolves to a real typeface instead of being dropped).\n  const themeFile = doc.file('word/theme/theme1.xml');\n  const themeXml = themeFile ? await themeFile.async('string') : '';\n  const themeFonts = parseThemeFonts(themeXml);\n\n  // 3. Read styles.xml — capturing each style's own run properties, not just\n  //    its heading level/alignment, so style-based formatting can be resolved.\n  const stylesFile = doc.file('word/styles.xml');\n  const stylesXml = stylesFile ? await stylesFile.async('string') : '';\n  const styles = parseStylesXml(stylesXml, themeFonts);\n  const docDefaults = parseDocDefaults(stylesXml, themeFonts);\n\n  // 4. Read core.xml for metadata\n  const coreFile = doc.file('docProps/core.xml');\n  const coreXml = coreFile ? await coreFile.async('string') : '';\n  const metadata = parseCoreXml(coreXml);\n\n  // 5. Read numbering.xml for list definitions\n  const numberingFile = doc.file('word/numbering.xml');\n  const numberingXml = numberingFile ? await numberingFile.async('string') : '';\n  const numberingMap = parseNumberingXml(numberingXml);\n\n  // 5b. Read document.xml.rels so hyperlink `r:id`s resolve to real URLs.\n  const relsFile = doc.file('word/_rels/document.xml.rels');\n  const relsXml = relsFile ? await relsFile.async('string') : '';\n  const relations = parseRelationships(relsXml);\n\n  // 5c. Read every `word/media/*` binary part up front into `data:` URIs,\n  // keyed by the path relationships reference them by. Images are resolved\n  // deep inside the synchronous DOM paragraph/run parsers below, so this has\n  // to happen as a batch here rather than as an async read per `<w:drawing>`.\n  const media = await readMediaParts(doc, warnings);\n\n  // 6. Parse document.xml → TipTap JSON\n  let defaultParaStyleId: string | undefined;\n  let defaultCharStyleId: string | undefined;\n  for (const s of styles.values()) {\n    // \"Last wins\" among defaults of a type, matching Word (and how duplicate\n    // style ids resolve): don't break, let a later default overwrite.\n    if (s.isDefault && s.type === 'paragraph') defaultParaStyleId = s.styleId;\n    if (s.isDefault && s.type === 'character') defaultCharStyleId = s.styleId;\n  }\n\n  const ctx: ParseCtx = {\n    styles,\n    numberingMap,\n    docDefaults,\n    themeFonts,\n    styleRunPropsCache: new Map(),\n    relations,\n    defaultParaStyleId,\n    defaultCharStyleId,\n    media,\n    warnings,\n  };\n  const json = convertDocumentXmlToJson(documentXml, ctx, warnings);\n\n  // 7. Read word/comments.xml — thread content for the `comment` marks\n  // `convertDocumentXmlToJson` already anchored via w:commentRangeStart/End.\n  const commentsFile = doc.file('word/comments.xml');\n  const commentsXml = commentsFile ? await commentsFile.async('string') : '';\n  const commentThreads = buildCommentThreads(commentsXml, json);\n\n  // 8. Read the default header/footer parts, resolved via document.xml.rels\n  // from the sectPr's headerReference/footerReference. Plain-text paragraphs\n  // only (v1) — rich formatting inside a header/footer isn't round-tripped.\n  const headerHTML = await readHeaderFooterPart(doc, documentXml, relations, 'header');\n  const footerHTML = await readHeaderFooterPart(doc, documentXml, relations, 'footer');\n\n  return { json, documentXml, styles, metadata, warnings, commentThreads, headerHTML, footerHTML };\n}\n\n/** Reads the \"default\" header or footer part referenced from `<w:sectPr>`. */\nasync function readHeaderFooterPart(\n  doc: any,\n  documentXml: string,\n  relations: Map<string, string>,\n  kind: 'header' | 'footer',\n): Promise<string | undefined> {\n  const tag = kind === 'header' ? 'headerReference' : 'footerReference';\n  const re = new RegExp(`<w:${tag}[^>]*w:type=\"default\"[^>]*r:id=\"([^\"]+)\"`);\n  const match = re.exec(documentXml) ?? new RegExp(`<w:${tag}[^>]*r:id=\"([^\"]+)\"`).exec(documentXml);\n  if (!match) return undefined;\n  const target = relations.get(match[1]);\n  if (!target) return undefined;\n  const path = target.startsWith('word/') ? target : `word/${target.replace(/^\\.\\//, '')}`;\n  const file = doc.file(path);\n  if (!file) return undefined;\n  const xml = await file.async('string');\n  return headerFooterXmlToHTML(xml);\n}\n\n/** `<w:p>` runs → `<p>text</p>`, one per paragraph. Plain text only (v1). */\nfunction headerFooterXmlToHTML(xml: string): string | undefined {\n  if (typeof DOMParser === 'undefined') return '';\n  const doc = new DOMParser().parseFromString(xml, 'text/xml');\n  const paras = Array.from(doc.getElementsByTagName('w:p'));\n  const html = paras\n    .map((p) => {\n      const texts = Array.from(p.getElementsByTagName('w:t')).map((t) => t.textContent ?? '');\n      return `<p>${escapeHtml(texts.join(''))}</p>`;\n    })\n    .join('');\n  return html || undefined;\n}\n\nfunction escapeHtml(s: string): string {\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/** Parses `<w:comment>` elements (id, author, date, text) from comments.xml. */\nfunction parseCommentsXml(xml: string): Array<{ id: string; author?: string; date?: string; text: string }> {\n  if (!xml) return [];\n  const doc = new DOMParser().parseFromString(xml, 'text/xml');\n  const comments = doc.getElementsByTagName('w:comment');\n  const result: Array<{ id: string; author?: string; date?: string; text: string }> = [];\n  for (let i = 0; i < comments.length; i++) {\n    const el = comments[i];\n    const id = el.getAttribute('w:id');\n    if (!id) continue;\n    const tNodes = el.getElementsByTagName('w:t');\n    let text = '';\n    for (let j = 0; j < tNodes.length; j++) text += tNodes[j].textContent || '';\n    result.push({\n      id,\n      author: el.getAttribute('w:author') || undefined,\n      date: el.getAttribute('w:date') || undefined,\n      text,\n    });\n  }\n  return result;\n}\n\n/** Text anchored under each comment id, walking the parsed TipTap JSON. */\nfunction extractCommentQuotes(json: any): Map<string, string> {\n  const quotes = new Map<string, string>();\n  const walk = (node: any) => {\n    if (!node) return;\n    if (node.type === 'text' && Array.isArray(node.marks)) {\n      for (const mark of node.marks) {\n        if (mark.type === 'comment' && mark.attrs?.id) {\n          quotes.set(mark.attrs.id, (quotes.get(mark.attrs.id) ?? '') + (node.text ?? ''));\n        }\n      }\n    }\n    if (Array.isArray(node.content)) node.content.forEach(walk);\n  };\n  walk(json);\n  return quotes;\n}\n\n/** Combines comments.xml content + in-doc anchors into loadable CommentThreads. */\nfunction buildCommentThreads(commentsXml: string, json: any): import('../comments-types').CommentThread[] {\n  const quotes = extractCommentQuotes(json);\n  return parseCommentsXml(commentsXml).map((c) => {\n    const date = c.date ?? new Date().toISOString();\n    return {\n      id: c.id,\n      quote: quotes.get(c.id) ?? '',\n      resolved: false,\n      createdAt: date,\n      messages: [\n        { id: `${c.id}-0`, author: c.author ?? 'Unknown', body: c.text, mentions: [], createdAt: date },\n      ],\n    };\n  });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Page setup (size/orientation/margins)                                      */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Read just the page size/orientation/margins from a .docx's `<w:sectPr>` —\n * independent of (and cheaper than) full body-content parsing, so the\n * editor's on-screen page geometry can be restored to match what a loaded\n * file actually used regardless of whether `parseDocxOOXML()` or the\n * mammoth fallback ends up handling the body content.\n *\n * Returns `null` if the file has no readable `<w:sectPr>`/`<w:pgSz>` —\n * callers should leave the current page setup untouched in that case\n * rather than resetting it to a default.\n */\nexport async function readPageSetupFromDocx(buffer: ArrayBuffer): Promise<PageSetup | null> {\n  try {\n    const zip = await getJSZip();\n    const doc = await zip.loadAsync(buffer);\n    const documentFile = doc.file('word/document.xml');\n    if (!documentFile) return null;\n    const documentXml = await documentFile.async('string');\n    return parseSectPrPageSetup(documentXml);\n  } catch {\n    return null;\n  }\n}\n\nfunction parseSectPrPageSetup(documentXml: string): PageSetup | null {\n  if (typeof DOMParser === 'undefined') return null;\n  try {\n    const doc = new DOMParser().parseFromString(documentXml, 'text/xml');\n    const body = doc.getElementsByTagName('w:body')[0];\n    if (!body) return null;\n\n    // The body's own <w:sectPr> (document-level page setup) is a direct\n    // child, conventionally the last one — distinct from a mid-document\n    // section break's <w:p><w:pPr><w:sectPr> (not handled here; a\n    // multi-section document's editor-wide page setup uses this last one).\n    let sectPr: Element | null = null;\n    for (let i = 0; i < body.children.length; i++) {\n      const el = body.children[i];\n      const tag = el.localName || el.tagName.replace(/.*:/, '');\n      if (tag === 'sectPr') sectPr = el;\n    }\n    if (!sectPr) return null;\n\n    const pgSz = sectPr.getElementsByTagName('w:pgSz')[0];\n    if (!pgSz) return null;\n    const widthTwips = parseInt(pgSz.getAttribute('w:w') || '', 10);\n    const heightTwips = parseInt(pgSz.getAttribute('w:h') || '', 10);\n    if (!widthTwips || !heightTwips) return null;\n\n    const pgMar = sectPr.getElementsByTagName('w:pgMar')[0];\n    const marginXTwips = parseInt(pgMar?.getAttribute('w:left') || '', 10) || 1440;\n    const marginYTwips = parseInt(pgMar?.getAttribute('w:top') || '', 10) || 1440;\n\n    return pageSetupFromTwips({ widthTwips, heightTwips, marginXTwips, marginYTwips });\n  } catch {\n    return null;\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Styles parser                                                               */\n/* -------------------------------------------------------------------------- */\n\nfunction parseStylesXml(xml: string, themeFonts: ThemeFonts): Map<string, StyleDef> {\n  const styles = new Map<string, StyleDef>();\n  if (!xml || typeof DOMParser === 'undefined') return styles;\n\n  try {\n    const doc = new DOMParser().parseFromString(xml, 'text/xml');\n    const styleEls = doc.getElementsByTagName('w:style');\n    for (let i = 0; i < styleEls.length; i++) {\n      const el = styleEls[i];\n      const styleId = el.getAttribute('w:styleId') || '';\n      if (!styleId) continue;\n\n      const type = (el.getAttribute('w:type') || 'paragraph') as StyleDef['type'];\n      const isDefault = el.getAttribute('w:default') === '1' || el.getAttribute('w:default') === 'true';\n      const nameEl = el.getElementsByTagName('w:name')[0];\n      const name = nameEl?.getAttribute('w:val') || styleId;\n      const basedOnEl = el.getElementsByTagName('w:basedOn')[0];\n      const basedOn = basedOnEl?.getAttribute('w:val');\n\n      // Check if it's a heading style\n      let headingLevel: number | undefined;\n      if (styleId.toLowerCase().includes('heading') || name.toLowerCase().includes('heading')) {\n        const match = styleId.match(/heading(\\d)/i) || name.match(/heading\\s*(\\d)/i);\n        if (match) headingLevel = parseInt(match[1]);\n      }\n\n      // Check for alignment in pPr\n      const pPr = firstDirectChild(el, 'pPr');\n      let alignment: string | undefined;\n      if (pPr) {\n        const jc = firstDirectChild(pPr, 'jc');\n        if (jc) alignment = jc.getAttribute('w:val') || undefined;\n      }\n\n      // Capture the style's own run properties (`<w:style><w:rPr>`), the piece\n      // the old parser threw away. `basedOn` inheritance is resolved lazily\n      // later (resolveStyleRunProps) so the whole map is available first.\n      const rPr = firstDirectChild(el, 'rPr');\n      const ownRunProps = rPr ? parseRunPropsEl(rPr, themeFonts) : undefined;\n\n      // Numbering declared on the style itself (`<w:pPr><w:numPr><w:numId>`).\n      let ownNumId: string | undefined;\n      const styleNumPr = pPr ? firstDirectChild(pPr, 'numPr') : undefined;\n      if (styleNumPr) ownNumId = styleNumPr.getElementsByTagName('w:numId')[0]?.getAttribute('w:val') || undefined;\n\n      // Indentation declared on the style itself (`<w:pPr><w:ind>`) — see\n      // `resolveStyleIndent()` for why this needs the same capture as `ownNumId`.\n      const styleIndEl = pPr ? firstDirectChild(pPr, 'ind') : undefined;\n      const ownIndent = styleIndEl ? readIndAttrs(styleIndEl) : undefined;\n\n      styles.set(styleId, {\n        styleId,\n        name,\n        type,\n        basedOn: basedOn ?? undefined,\n        headingLevel,\n        alignment: alignment ?? undefined,\n        isDefault,\n        ownRunProps,\n        ownNumId,\n        ownIndent,\n      });\n    }\n  } catch (e) {\n    // Ignore parse errors\n  }\n\n  return styles;\n}\n\n/**\n * Resolve a style's *effective* run properties by walking its `basedOn`\n * chain (memoized). A derived style's own props override the ones it inherits.\n * A short cycle guard keeps a malformed `basedOn` loop from recursing forever.\n */\nfunction resolveStyleRunProps(styleId: string | undefined, ctx: ParseCtx, seen?: Set<string>): RunProps {\n  if (!styleId) return {};\n  const cached = ctx.styleRunPropsCache.get(styleId);\n  if (cached) return cached;\n  const style = ctx.styles.get(styleId);\n  if (!style) return {};\n  const guard = seen ?? new Set<string>();\n  if (guard.has(styleId)) return style.ownRunProps ?? {};\n  guard.add(styleId);\n  const base = style.basedOn ? resolveStyleRunProps(style.basedOn, ctx, guard) : {};\n  const merged = mergeRunProps(base, style.ownRunProps);\n  ctx.styleRunPropsCache.set(styleId, merged);\n  return merged;\n}\n\n/**\n * The `w:numId` a paragraph style contributes, walking its `basedOn` chain\n * (nearest definition wins). Lets a \"List Number\"-style paragraph with no\n * direct `numPr` still import as a real list — how legal clause numbering is\n * usually authored.\n */\nfunction resolveStyleNumId(styleId: string | undefined, ctx: ParseCtx, seen?: Set<string>): string | undefined {\n  if (!styleId) return undefined;\n  const style = ctx.styles.get(styleId);\n  if (!style) return undefined;\n  if (style.ownNumId) return style.ownNumId;\n  const guard = seen ?? new Set<string>();\n  if (guard.has(styleId)) return undefined;\n  guard.add(styleId);\n  return style.basedOn ? resolveStyleNumId(style.basedOn, ctx, guard) : undefined;\n}\n\n/**\n * The `w:ind` a paragraph style contributes, walking its `basedOn` chain the\n * same way `resolveStyleNumId` does (nearest definition wins) — but as a\n * whole-element override rather than a field-by-field merge: a style's own\n * `<w:ind>` is returned as-is instead of combined with an ancestor's,\n * matching how Word treats a directly declared `<w:ind>` as replacing the\n * inherited one rather than patching it.\n */\nfunction resolveStyleIndent(styleId: string | undefined, ctx: ParseCtx, seen?: Set<string>): IndTwips | undefined {\n  if (!styleId) return undefined;\n  const style = ctx.styles.get(styleId);\n  if (!style) return undefined;\n  if (style.ownIndent) return style.ownIndent;\n  const guard = seen ?? new Set<string>();\n  if (guard.has(styleId)) return undefined;\n  guard.add(styleId);\n  return style.basedOn ? resolveStyleIndent(style.basedOn, ctx, guard) : undefined;\n}\n\n/**\n * Later (higher-priority) props override earlier ones. Only keys the override\n * actually declares win — an `undefined` value inherits, so a bold paragraph\n * style isn't cancelled by a run that simply doesn't mention bold.\n */\nfunction mergeRunProps(base: RunProps, over: RunProps | undefined): RunProps {\n  if (!over) return { ...base };\n  const out: RunProps = { ...base };\n  for (const key of Object.keys(over) as (keyof RunProps)[]) {\n    const v = over[key];\n    if (v !== undefined) (out as any)[key] = v;\n  }\n  return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Numbering parser                                                            */\n/* -------------------------------------------------------------------------- */\n\nexport interface NumberingInfo {\n  numId: string;\n  format: 'bullet' | 'decimal' | 'lowerLetter' | 'upperLetter';\n}\n\n/**\n * Parse `word/numbering.xml` into a `numId -> {numId, format}` map.\n *\n * Exported so the serializer can reuse it too: when doing a selective save,\n * resolving a bullet/ordered list's `w:numId` from the *original* document's\n * actual numbering definitions (instead of hardcoding numId 1/2, which only\n * happens to be correct by convention) requires the same parsing this\n * function already does for loading.\n */\nexport function parseNumberingXml(xml: string): Map<string, NumberingInfo> {\n  const map = new Map<string, NumberingInfo>();\n  if (!xml || typeof DOMParser === 'undefined') return map;\n\n  try {\n    const doc = new DOMParser().parseFromString(xml, 'text/xml');\n    // Parse abstractNum elements to get format\n    const abstractNums = doc.getElementsByTagName('w:abstractNum');\n    const formatMap = new Map<string, string>();\n    for (let i = 0; i < abstractNums.length; i++) {\n      const abstractId = abstractNums[i].getAttribute('w:abstractNumId') || '';\n      const lvlEls = abstractNums[i].getElementsByTagName('w:lvl');\n      if (lvlEls.length > 0) {\n        const numFmt = lvlEls[0].getElementsByTagName('w:numFmt')[0];\n        const fmt = numFmt?.getAttribute('w:val') || 'bullet';\n        formatMap.set(abstractId, fmt);\n      }\n    }\n    // Parse num elements to map numId → abstractNumId\n    const nums = doc.getElementsByTagName('w:num');\n    for (let i = 0; i < nums.length; i++) {\n      const numId = nums[i].getAttribute('w:numId') || '';\n      const abstractRef = nums[i].getElementsByTagName('w:abstractNumId')[0];\n      const abstractId = abstractRef?.getAttribute('w:val') || '';\n      const fmt = formatMap.get(abstractId) || 'bullet';\n      map.set(numId, { numId, format: fmt as any });\n    }\n  } catch (e) {\n    // Ignore\n  }\n\n  return map;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Core XML metadata parser                                                    */\n/* -------------------------------------------------------------------------- */\n\nfunction parseCoreXml(xml: string): DocxMetadata {\n  if (!xml) return {};\n  const get = (tag: string): string | undefined => {\n    const match = xml.match(new RegExp(`<(?:cp|dc|dcterms|ep):${tag}[^>]*>([^<]*)<`));\n    return match?.[1]?.trim();\n  };\n  return {\n    title: get('title'),\n    creator: get('creator'),\n    created: get('created'),\n    modified: get('modified'),\n    subject: get('subject'),\n    description: get('description'),\n  };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Document XML → TipTap JSON converter                                        */\n/* -------------------------------------------------------------------------- */\n\nfunction convertDocumentXmlToJson(\n  documentXml: string,\n  ctx: ParseCtx,\n  warnings: string[],\n): any {\n  if (typeof DOMParser === 'undefined') {\n    warnings.push('DOMParser not available — cannot parse OOXML');\n    return { type: 'doc', content: [{ type: 'paragraph' }] };\n  }\n\n  const doc = new DOMParser().parseFromString(documentXml, 'text/xml');\n  const body = doc.getElementsByTagName('w:body')[0];\n  if (!body) {\n    warnings.push('No <w:body> found in document.xml');\n    return { type: 'doc', content: [{ type: 'paragraph' }] };\n  }\n\n  const blocks: any[] = [];\n\n  // Iterate over children of body (w:p, w:tbl, w:sectPr)\n  for (let i = 0; i < body.children.length; i++) {\n    const el = body.children[i];\n    const tagName = el.localName || el.tagName.replace(/.*:/, '');\n\n    if (tagName === 'p') {\n      const block = parseParagraph(el as Element, ctx);\n      if (block) blocks.push(...(Array.isArray(block) ? block : [block]));\n    } else if (tagName === 'tbl') {\n      const block = parseTable(el as Element, ctx);\n      if (block) blocks.push(block);\n    } else if (tagName === 'sectPr') {\n      // Section properties — skip for now (would need section break support)\n    }\n  }\n\n  if (blocks.length === 0) {\n    blocks.push({ type: 'paragraph' });\n  }\n\n  return { type: 'doc', content: mergeAdjacentLists(blocks) };\n}\n\n/**\n * Each list paragraph is parsed into its own one-item list node. Left as-is,\n * consecutive items render as separate lists that each restart at \"1.\" — a\n * five-item numbered list would show \"1. 1. 1. 1. 1.\" instead of \"1.\"–\"5.\".\n * Merge runs of adjacent same-type list nodes into a single list so ordered\n * numbering is continuous and bullets share one list.\n */\nfunction mergeAdjacentLists(blocks: any[]): any[] {\n  const out: any[] = [];\n  for (const block of blocks) {\n    const prev = out[out.length - 1];\n    const isList = block?.type === 'bulletList' || block?.type === 'orderedList';\n    if (isList && prev?.type === block.type && Array.isArray(prev.content) && Array.isArray(block.content)) {\n      prev.content.push(...block.content);\n    } else {\n      out.push(block);\n    }\n  }\n  return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Paragraph parser                                                            */\n/* -------------------------------------------------------------------------- */\n\nfunction parseParagraph(\n  el: Element,\n  ctx: ParseCtx,\n): any | any[] | null {\n  const pPr = firstDirectChild(el, 'pPr');\n\n  // Extract paragraph style\n  let styleId: string | undefined;\n  let headingLevel: number | undefined;\n  let alignment: string | undefined;\n  let lineHeight: string | undefined;\n  let listInfo: { numId: string; format: 'bullet' | 'decimal' | 'lowerLetter' | 'upperLetter' } | undefined;\n  // Indentation (see the `<w:ind>` handling below): `indent` is the\n  // left/start margin, `textIndent` the first-line offset (negative =\n  // hanging), `indentRight` the right/end margin. `indent`/`textIndent`\n  // names match exactly what `paragraphPropParts()` in ooxml-serializer.ts\n  // already reads off these same paragraph attrs, so this closes the\n  // round-trip instead of inventing a second convention. `indentRight` is\n  // the one exception: the serializer has no `w:right` support today, so it\n  // parses but won't currently re-export — kept anyway so the JSON model\n  // doesn't silently discard it.\n  let indent: number | undefined;\n  let textIndent: number | undefined;\n  let indentRight: number | undefined;\n  let tabStops: Array<{ pos: number; val: string }> | undefined;\n\n  if (pPr) {\n    // pStyle\n    const pStyle = firstDirectChild(pPr, 'pStyle');\n    if (pStyle) {\n      styleId = pStyle.getAttribute('w:val') || undefined;\n      const style = styleId ? ctx.styles.get(styleId) : undefined;\n      if (style?.headingLevel) headingLevel = style.headingLevel;\n    }\n\n    // Alignment\n    const jc = firstDirectChild(pPr, 'jc');\n    if (jc) {\n      alignment = jc.getAttribute('w:val') || undefined;\n    }\n\n    // Line spacing\n    const spacing = firstDirectChild(pPr, 'spacing');\n    if (spacing) {\n      const line = spacing.getAttribute('w:line');\n      const lineRule = spacing.getAttribute('w:lineRule');\n      if (line && lineRule !== 'exact') {\n        // Convert twips to multiplier (240 = single)\n        const multiplier = parseInt(line) / 240;\n        lineHeight = String(multiplier);\n      }\n    }\n\n    // Numbering (lists) — direct `numPr` on the paragraph wins; otherwise fall\n    // back to numbering carried by the paragraph's style (legal clause styles).\n    const numPr = firstDirectChild(pPr, 'numPr');\n    let numId: string | undefined;\n    if (numPr) numId = numPr.getElementsByTagName('w:numId')[0]?.getAttribute('w:val') || undefined;\n    if (!numId) numId = resolveStyleNumId(styleId, ctx);\n    // `numId=\"0\"` is Word's explicit \"no numbering\" override — not a list.\n    if (numId && numId !== '0' && ctx.numberingMap.has(numId)) {\n      listInfo = ctx.numberingMap.get(numId);\n    }\n\n    // Indentation — a direct paragraph `<w:ind>` always wins outright over\n    // whatever the paragraph's style declares (an explicit element replaces\n    // the inherited one rather than merging field-by-field, matching Word).\n    // Only fall back to the style's `<w:ind>` when the paragraph names none\n    // at all; legal templates lean heavily on style-level indentation for\n    // numbered/sub-numbered clauses, so skipping this fallback would leave\n    // most of a template's indentation unresolved on import.\n    const indEl = firstDirectChild(pPr, 'ind');\n    const resolvedIndent = (indEl ? readIndAttrs(indEl) : undefined) ?? resolveStyleIndent(styleId, ctx);\n    if (resolvedIndent) {\n      if (resolvedIndent.left) indent = Math.round(resolvedIndent.left / TWIPS_PER_PX);\n      if (resolvedIndent.right) indentRight = Math.round(resolvedIndent.right / TWIPS_PER_PX);\n      // `w:hanging` and `w:firstLine` are mutually exclusive in OOXML and both\n      // map to the same `textIndent` attr (positive = first-line indent,\n      // negative = hanging) — mirrors paragraphPropParts()'s logic on the way\n      // back out.\n      if (resolvedIndent.hanging) textIndent = -Math.round(resolvedIndent.hanging / TWIPS_PER_PX);\n      else if (resolvedIndent.firstLine) textIndent = Math.round(resolvedIndent.firstLine / TWIPS_PER_PX);\n    }\n\n    // Tab stops (`<w:tabs><w:tab w:val=\"left|center|right|decimal|bar\" w:pos=\"…\"/></w:tabs>`).\n    const tabsEl = firstDirectChild(pPr, 'tabs');\n    if (tabsEl) {\n      const tabEls = tabsEl.getElementsByTagName('w:tab');\n      const stops: Array<{ pos: number; val: string }> = [];\n      for (let i = 0; i < tabEls.length; i++) {\n        const val = tabEls[i].getAttribute('w:val');\n        const pos = tabEls[i].getAttribute('w:pos');\n        if (val && val !== 'clear' && pos) stops.push({ pos: Math.round(Number(pos) / TWIPS_PER_PX), val });\n      }\n      if (stops.length > 0) tabStops = stops;\n    }\n  }\n\n  // The formatting a run in this paragraph inherits before its own rPr:\n  // document defaults → paragraph style (basedOn-resolved) → the paragraph\n  // mark's own run props (<w:pPr><w:rPr>). A run's <w:rStyle>/direct <w:rPr>\n  // layer on top of this inside parseRun. A paragraph naming no pStyle still\n  // inherits the document's default (`w:default=\"1\"`) paragraph style.\n  const effStyleId = styleId ?? ctx.defaultParaStyleId;\n  let paraBase = mergeRunProps(ctx.docDefaults, resolveStyleRunProps(effStyleId, ctx));\n  const pMarkRPr = pPr ? firstDirectChild(pPr, 'rPr') : undefined;\n  if (pMarkRPr) paraBase = mergeRunProps(paraBase, parseRunPropsEl(pMarkRPr, ctx.themeFonts));\n\n  // Extract runs. A run stream can contain inline page breaks (`<w:br\n  // w:type=\"page\">`) or images (`<w:drawing>`) — TipTap's image node is\n  // block-level (`DocxImage.configure({ inline: false })`), so like a page\n  // break it can't live inside a paragraph's own inline content. Split into\n  // text segments around BOTH so a paragraph holding text alongside a\n  // break/image keeps its text (a page break used to replace the whole\n  // paragraph wholesale — silent data loss — and an image run would have hit\n  // the same fate before `w:drawing` handling existed at all).\n  const runs = parseRuns(el, ctx, paraBase);\n  const segments: any[][] = [[]];\n  const interrupts: any[] = [];\n  for (const r of runs) {\n    if (r.type === 'pageBreak' || r.type === 'image') {\n      interrupts.push(r);\n      segments.push([]);\n    } else {\n      segments[segments.length - 1].push(r);\n    }\n  }\n  const breakCount = interrupts.length;\n  const contentRuns = runs.filter((r: any) => r.type !== 'pageBreak' && r.type !== 'image');\n  const content = contentRuns.length > 0 ? contentRuns : undefined;\n  const paraAttrs = {\n    ...(alignment ? { textAlign: alignment } : {}),\n    ...(lineHeight ? { lineHeight } : {}),\n    ...(indent !== undefined ? { indent } : {}),\n    ...(textIndent !== undefined ? { textIndent } : {}),\n    ...(indentRight !== undefined ? { indentRight } : {}),\n    ...(tabStops ? { tabStops } : {}),\n  };\n  // A page break or image inside a heading/list/quote is rare; keep the\n  // block's text and place the interrupt(s) after it rather than splitting\n  // those structures apart.\n  const withTrailingBreaks = (block: any) => (breakCount > 0 ? [block, ...interrupts] : block);\n\n  // Build the block node\n  if (headingLevel) {\n    return withTrailingBreaks({\n      type: 'heading',\n      attrs: { level: headingLevel, ...paraAttrs },\n      content,\n    });\n  }\n\n  if (listInfo) {\n    // Wrap as a list item — but TipTap expects list nodes at the top level,\n    // so we return a list node containing this as a listItem\n    const listType = listInfo.format === 'bullet' ? 'bulletList' : 'orderedList';\n    return withTrailingBreaks({\n      type: listType,\n      content: [\n        {\n          type: 'listItem',\n          content: [{ type: 'paragraph', attrs: paraAttrs, content }],\n        },\n      ],\n    });\n  }\n\n  // Check for blockquote style\n  if (styleId && (styleId.toLowerCase().includes('quote') || styleId.toLowerCase().includes('blockquote'))) {\n    return withTrailingBreaks({\n      type: 'blockquote',\n      content: [{ type: 'paragraph', content }],\n    });\n  }\n\n  // Check for code style\n  if (styleId && (styleId.toLowerCase().includes('code') || styleId.toLowerCase().includes('source'))) {\n    return withTrailingBreaks({\n      type: 'codeBlock',\n      content: content || [],\n    });\n  }\n\n  // Default: paragraph. Emit one paragraph per text segment with the\n  // interrupt(s) (page breaks/images) placed in their real position\n  // (before/between/after text) rather than moved to the end.\n  if (breakCount > 0) {\n    const blocks: any[] = [];\n    segments.forEach((seg, i) => {\n      if (i > 0) blocks.push(interrupts[i - 1]);\n      if (seg.length > 0) blocks.push({ type: 'paragraph', attrs: paraAttrs, content: seg });\n    });\n    return blocks.length > 0 ? blocks : interrupts[0];\n  }\n\n  return { type: 'paragraph', attrs: paraAttrs, content };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Runs parser                                                                 */\n/* -------------------------------------------------------------------------- */\n\nfunction parseRuns(\n  paragraphEl: Element,\n  ctx: ParseCtx,\n  paraBase: RunProps,\n  activeComments: Set<string> = new Set(),\n  activeBookmarks: Set<string> = new Set(),\n): any[] {\n  const nodes: any[] = [];\n\n  // Iterate over children of paragraph\n  for (let i = 0; i < paragraphEl.children.length; i++) {\n    const child = paragraphEl.children[i];\n    const tag = child.localName || child.tagName.replace(/.*:/, '');\n\n    if (tag === 'r') {\n      const runNode = parseRun(child as Element, ctx, paraBase);\n      if (runNode) nodes.push(withRangeMarks(runNode, activeComments, activeBookmarks));\n    } else if (tag === 'hyperlink') {\n      // An external link stores an `r:id` pointing into document.xml.rels; an\n      // internal link stores a `w:anchor` (a bookmark name). Resolve the r:id\n      // to its real target so the href is a usable URL, not \"rId7\".\n      const rId = child.getAttribute('r:id');\n      const anchor = child.getAttribute('w:anchor');\n      const href = rId\n        ? ctx.relations.get(rId) || ''\n        : anchor\n          ? `#${anchor}`\n          : '';\n      const linkRuns = parseRuns(child as Element, ctx, paraBase, activeComments, activeBookmarks);\n      for (const run of linkRuns) {\n        if (run.type === 'text' && href) {\n          const marks = run.marks ?? [];\n          marks.push({ type: 'link', attrs: { href } });\n          nodes.push({ ...run, marks });\n        } else {\n          nodes.push(run);\n        }\n      }\n    } else if (tag === 'ins') {\n      // Tracked insertion: keep as real content, tagged with an `insertion` mark\n      // so Suggesting mode / redlines survive the round trip.\n      const author = child.getAttribute('w:author') || undefined;\n      const date = child.getAttribute('w:date') || undefined;\n      const id = child.getAttribute('w:id') || undefined;\n      // The recursive parseRuns() call already applied comment/bookmark\n      // marks (it shares those sets), so just layer the insertion mark on top.\n      for (const run of parseRuns(child as Element, ctx, paraBase, activeComments, activeBookmarks)) {\n        nodes.push(addTrackChangeMark(run, 'insertion', { id, author, date }));\n      }\n    } else if (tag === 'del') {\n      // Tracked deletion: keep the text (via `<w:delText>`, read by parseRun)\n      // tagged with a `deletion` mark instead of dropping it.\n      const author = child.getAttribute('w:author') || undefined;\n      const date = child.getAttribute('w:date') || undefined;\n      const id = child.getAttribute('w:id') || undefined;\n      for (const run of parseRuns(child as Element, ctx, paraBase, activeComments, activeBookmarks)) {\n        nodes.push(addTrackChangeMark(run, 'deletion', { id, author, date }));\n      }\n    } else if (tag === 'sdt') {\n      // Content control: <w:sdtPr> (tag/alias/id) + <w:sdtContent> (normal\n      // run-level children). Block-level sdt (wrapping paragraphs/tables) is\n      // not handled — v1 scope is inline placeholders only.\n      const sdtPr = firstDirectChild(child as Element, 'sdtPr');\n      const sdtContent = firstDirectChild(child as Element, 'sdtContent');\n      const ccTag = sdtPr ? firstDirectChild(sdtPr, 'tag')?.getAttribute('w:val') || undefined : undefined;\n      const alias = sdtPr ? firstDirectChild(sdtPr, 'alias')?.getAttribute('w:val') || undefined : undefined;\n      const ccId = sdtPr ? firstDirectChild(sdtPr, 'id')?.getAttribute('w:val') || undefined : undefined;\n      if (sdtContent) {\n        for (const run of parseRuns(sdtContent, ctx, paraBase, activeComments, activeBookmarks)) {\n          nodes.push(addContentControlMark(run, { id: ccId, tag: ccTag, alias }));\n        }\n      }\n    } else if (tag === 'fldSimple') {\n      // Simple field (PAGE, DATE, …): keep the cached display text, tagged\n      // with the instruction so it round-trips. Not recalculated.\n      const instr = child.getAttribute('w:instr') || undefined;\n      for (const run of parseRuns(child as Element, ctx, paraBase, activeComments, activeBookmarks)) {\n        nodes.push(addFieldMark(run, instr));\n      }\n    } else if (tag === 'commentRangeStart') {\n      // Marks the start of a Word comment anchor. Scoped to one paragraph —\n      // a comment spanning multiple paragraphs won't fully round-trip (v1).\n      const id = child.getAttribute('w:id');\n      if (id) activeComments.add(id);\n    } else if (tag === 'commentRangeEnd') {\n      const id = child.getAttribute('w:id');\n      if (id) activeComments.delete(id);\n    } else if (tag === 'bookmarkStart') {\n      const name = child.getAttribute('w:name');\n      if (name) activeBookmarks.add(name);\n    } else if (tag === 'bookmarkEnd') {\n      // w:bookmarkEnd carries the matching bookmarkStart's w:id, not its\n      // name, so there's nothing to remove by. activeBookmarks is scoped\n      // per-paragraph (a fresh Set each call from parseParagraph), so\n      // leaving the name active until the paragraph ends is an acceptable\n      // v1 simplification — most bookmarks span a single paragraph anyway.\n    }\n  }\n\n  return nodes;\n}\n\n// Adds `comment`/`bookmark` marks for every range currently open at this\n// point in the paragraph (usually zero or one each, but ranges can overlap).\nfunction withRangeMarks(node: any, activeComments: Set<string>, activeBookmarks: Set<string>): any {\n  if (!node || node.type !== 'text' || (activeComments.size === 0 && activeBookmarks.size === 0)) return node;\n  const marks = node.marks ?? [];\n  const commentMarks = [...activeComments].map((id) => ({ type: 'comment', attrs: { id } }));\n  const bookmarkMarks = [...activeBookmarks].map((name) => ({ type: 'bookmark', attrs: { name } }));\n  return { ...node, marks: [...marks, ...commentMarks, ...bookmarkMarks] };\n}\n\n// Tags a parsed run/image node with a `contentControl` mark (w:sdt import).\nfunction addContentControlMark(node: any, attrs: { id?: string; tag?: string; alias?: string }): any {\n  if (!node || node.type !== 'text') return node;\n  const marks = node.marks ?? [];\n  return { ...node, marks: [...marks, { type: 'contentControl', attrs }] };\n}\n\n// Tags a parsed run/image node with a `field` mark (w:fldSimple import).\nfunction addFieldMark(node: any, instr: string | undefined): any {\n  if (!node || node.type !== 'text' || !instr) return node;\n  const marks = node.marks ?? [];\n  return { ...node, marks: [...marks, { type: 'field', attrs: { instr } }] };\n}\n\n// Tags a parsed run/image node with a track-changes mark (`insertion` or\n// `deletion`). Non-text nodes (images, page breaks) get their marks array\n// too, so an image inserted while suggesting still round-trips.\nfunction addTrackChangeMark(\n  node: any,\n  type: 'insertion' | 'deletion',\n  attrs: { id?: string; author?: string; date?: string },\n): any {\n  if (!node || node.type !== 'text') return node;\n  const marks = node.marks ?? [];\n  return { ...node, marks: [...marks, { type, attrs }] };\n}\n\nfunction parseRun(el: Element, ctx: ParseCtx, paraBase: RunProps): any | null {\n  const rPr = firstDirectChild(el, 'rPr');\n\n  // Resolve the run's *effective* formatting through the full cascade:\n  //   paragraph base (docDefaults + paragraph style)\n  //   → character style referenced by <w:rStyle>\n  //   → the run's own direct <w:rPr>.\n  // The default character style (`w:default=\"1\"`, usually DefaultParagraphFont)\n  // sits under any explicit rStyle, which sits under the run's direct rPr.\n  let effective = mergeRunProps(paraBase, resolveStyleRunProps(ctx.defaultCharStyleId, ctx));\n  if (rPr) {\n    const rStyle = firstDirectChild(rPr, 'rStyle')?.getAttribute('w:val') || undefined;\n    if (rStyle) effective = mergeRunProps(effective, resolveStyleRunProps(rStyle, ctx));\n    effective = mergeRunProps(effective, parseRunPropsEl(rPr, ctx.themeFonts));\n  }\n  const marks: any[] = runPropsToMarks(effective);\n\n  // Extract text content from <w:t>/<w:br>/<w:tab>, and any embedded image\n  // from <w:drawing>. A run holds at most one of these in practice (Word\n  // never mixes a picture and literal text in the same <w:r>), so the first\n  // <w:drawing> found wins and short-circuits below, the same way a page\n  // break already does.\n  let text = '';\n  let hasPageBreak = false;\n  let imageNode: any = null;\n\n  for (let i = 0; i < el.children.length; i++) {\n    const child = el.children[i];\n    const tag = child.localName || child.tagName.replace(/.*:/, '');\n\n    if (tag === 't' || tag === 'delText') {\n      text += child.textContent || '';\n    } else if (tag === 'br') {\n      const type = child.getAttribute('w:type');\n      if (type === 'page') {\n        hasPageBreak = true;\n      } else {\n        text += '\\n';\n      }\n    } else if (tag === 'tab') {\n      text += '\\t';\n    } else if (tag === 'drawing') {\n      imageNode = imageNode ?? parseDrawing(child as Element, ctx);\n    }\n  }\n\n  if (imageNode) {\n    return imageNode;\n  }\n\n  if (hasPageBreak) {\n    return { type: 'pageBreak' };\n  }\n\n  if (!text) return null;\n\n  return {\n    type: 'text',\n    text,\n    marks: marks.length > 0 ? marks : undefined,\n  };\n}\n\n/**\n * Parse a `<w:drawing>` run child (the OOXML wrapper for an embedded\n * picture) into an `image` node matching `DocxImage`'s attrs (`src`,\n * `width`, `height`, `alt`) — see `extensions/builtins/docx-image.ts` and\n * the serializer's `imageRunXml()`, which this mirrors exactly so a\n * load → save round-trip is lossless.\n *\n * Handles both wrapper shapes the same way: `<wp:inline>` (flows with text)\n * and `<wp:anchor>` (floating/wrapped). `<wp:extent>` and the\n * `<a:blip r:embed=\"…\">` sit at the same relative position under either, and\n * this editor's image node has no floating-position model (no page-relative\n * offset, no wrap-around-text polygon) — so an anchored image imports as an\n * ordinary inline image rather than being dropped. That loses Word's exact\n * float position for that one picture, but the picture itself — and\n * everything else in the document — survives, which silently dropping it\n * would not.\n *\n * Never throws: a `<w:drawing>` with no raster image (a shape/SmartArt/chart)\n * returns `null` quietly, while a dangling `r:embed` or an unreadable media\n * part returns `null` AND records why in `ctx.warnings`, so the caller can\n * surface it instead of the image just silently vanishing.\n */\nfunction parseDrawing(drawingEl: Element, ctx: ParseCtx): any | null {\n  const blip = drawingEl.getElementsByTagName('a:blip')[0];\n  const relId = blip?.getAttribute('r:embed');\n  if (!relId) return null;\n\n  const target = ctx.relations.get(relId);\n  if (!target) {\n    ctx.warnings.push(`Image relationship \"${relId}\" has no matching entry in document.xml.rels — image dropped.`);\n    return null;\n  }\n\n  // Targets are stored relative to word/ (e.g. \"media/image1.png\"); strip a\n  // leading \"./\" some writers emit before looking it up in the media map.\n  const normalizedTarget = target.replace(/^\\.\\//, '');\n  const src = ctx.media.get(normalizedTarget);\n  if (!src) {\n    ctx.warnings.push(\n      `Image part \"${normalizedTarget}\" (relationship \"${relId}\") could not be read — image dropped.`,\n    );\n    return null;\n  }\n\n  const extentEl = drawingEl.getElementsByTagName('wp:extent')[0];\n  const cx = parseInt(extentEl?.getAttribute('cx') || '', 10);\n  const cy = parseInt(extentEl?.getAttribute('cy') || '', 10);\n\n  const attrs: any = { src };\n  if (!isNaN(cx) && cx > 0) attrs.width = `${Math.round(cx / EMU_PER_PX)}px`;\n  if (!isNaN(cy) && cy > 0) attrs.height = `${Math.round(cy / EMU_PER_PX)}px`;\n\n  const docPr = drawingEl.getElementsByTagName('wp:docPr')[0];\n  const alt = docPr?.getAttribute('descr') || docPr?.getAttribute('name');\n  if (alt) attrs.alt = alt;\n\n  return { type: 'image', attrs };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Table parser                                                                */\n/* -------------------------------------------------------------------------- */\n\nfunction parseTable(\n  el: Element,\n  ctx: ParseCtx,\n): any | null {\n  const rows: any[] = [];\n  const trEls = el.getElementsByTagName('w:tr');\n\n  // Column widths from <w:tblGrid> (twips → px), used as a fallback for\n  // cells that don't carry their own <w:tcW>.\n  const gridColPx: number[] = [];\n  const tblGrid = el.getElementsByTagName('w:tblGrid')[0];\n  if (tblGrid && tblGrid.parentElement === el) {\n    const gridColEls = tblGrid.getElementsByTagName('w:gridCol');\n    for (let g = 0; g < gridColEls.length; g++) {\n      const w = parseInt(gridColEls[g].getAttribute('w:w') || '', 10);\n      gridColPx.push(isNaN(w) ? 0 : Math.round(w / TWIPS_PER_PX));\n    }\n  }\n\n  for (let i = 0; i < trEls.length; i++) {\n    const trEl = trEls[i];\n    // Make sure this tr is a direct child of the table (not nested)\n    if (trEl.parentElement !== el) continue;\n\n    const cells: any[] = [];\n    const tcEls = trEl.getElementsByTagName('w:tc');\n\n    let gridCol = 0;\n    for (let j = 0; j < tcEls.length; j++) {\n      const tcEl = tcEls[j];\n      if (tcEl.parentElement !== trEl) continue;\n\n      const tcPr = tcEl.getElementsByTagName('w:tcPr')[0];\n\n      // gridSpan → colspan\n      const gridSpanEl = tcPr?.getElementsByTagName('w:gridSpan')[0];\n      const colspan = Math.max(1, parseInt(gridSpanEl?.getAttribute('w:val') || '1', 10) || 1);\n\n      // vMerge: a bare <w:vMerge/> (or w:val=\"continue\") is a covered cell.\n      // ProseMirror represents merges by omitting covered cells and bumping\n      // the originating cell's rowspan, so skip continuation cells here and\n      // count them onto the originating cell above.\n      const vMergeEl = tcPr?.getElementsByTagName('w:vMerge')[0];\n      const vMergeVal = vMergeEl ? vMergeEl.getAttribute('w:val') || 'continue' : null;\n      if (vMergeEl && vMergeVal !== 'restart') {\n        for (let r = rows.length - 1; r >= 0; r--) {\n          const origin = rows[r].content.find((c: any) => c.attrs?._gridColStart === gridCol);\n          if (origin && origin.attrs) {\n            origin.attrs.rowspan = (origin.attrs.rowspan || 1) + 1;\n            break;\n          }\n        }\n        gridCol += colspan;\n        continue;\n      }\n\n      // Parse cell content (paragraphs)\n      const cellBlocks: any[] = [];\n      const pEls = tcEl.getElementsByTagName('w:p');\n      for (let k = 0; k < pEls.length; k++) {\n        const pEl = pEls[k];\n        if (pEl.parentElement !== tcEl) continue;\n        const block = parseParagraph(pEl, ctx);\n        if (block) {\n          // A page break inside a table cell can't become a top-level pageBreak\n          // node; keep only the real content blocks (paragraphs) here.\n          const arr = (Array.isArray(block) ? block : [block]).filter((b) => b.type !== 'pageBreak');\n          cellBlocks.push(...arr);\n        }\n      }\n\n      // Header cell?\n      const isHeader = !!tcPr?.getElementsByTagName('w:th').length;\n\n      // Cell width: prefer <w:tcW w:type=\"dxa\">, fall back to the grid.\n      const tcW = tcPr?.getElementsByTagName('w:tcW')[0];\n      const tcWType = tcW?.getAttribute('w:type');\n      const tcWVal = parseInt(tcW?.getAttribute('w:w') || '', 10);\n      const colwidth: number[] = [];\n      for (let c = 0; c < colspan; c++) {\n        if (c === 0 && tcWType === 'dxa' && !isNaN(tcWVal) && tcWVal > 0) {\n          colwidth.push(Math.round(tcWVal / TWIPS_PER_PX));\n        } else {\n          colwidth.push(gridColPx[gridCol + c] || 0);\n        }\n      }\n      const hasWidth = colwidth.some((w) => w > 0);\n\n      // Shading → backgroundColor\n      const shd = tcPr?.getElementsByTagName('w:shd')[0];\n      const fill = shd?.getAttribute('w:fill');\n      const backgroundColor = fill && /^[0-9a-fA-F]{6}$/.test(fill) && fill.toLowerCase() !== 'auto'\n        ? `#${fill}`\n        : null;\n\n      const attrs: any = { _gridColStart: gridCol };\n      if (colspan > 1) attrs.colspan = colspan;\n      if (hasWidth) attrs.colwidth = colwidth;\n      if (backgroundColor) attrs.backgroundColor = backgroundColor;\n\n      cells.push({\n        type: isHeader ? 'tableHeader' : 'tableCell',\n        attrs,\n        content: cellBlocks.length > 0 ? cellBlocks : [{ type: 'paragraph' }],\n      });\n\n      gridCol += colspan;\n    }\n\n    rows.push({\n      type: 'tableRow',\n      content: cells,\n      tableHeader: i === 0,\n    });\n  }\n\n  if (rows.length === 0) return null;\n\n  // Strip the internal `_gridColStart` bookkeeping attr now that vMerge\n  // resolution is done, and drop any now-empty attrs objects.\n  for (const row of rows) {\n    for (const cell of row.content) {\n      if (cell.attrs) {\n        delete cell.attrs._gridColStart;\n        if (Object.keys(cell.attrs).length === 0) delete cell.attrs;\n      }\n    }\n  }\n\n  // Table-level: alignment (<w:jc>) and explicit width (<w:tblW w:type=\"dxa\">).\n  const tblPr = el.getElementsByTagName('w:tblPr')[0];\n  const tableAttrs: any = {};\n  if (tblPr && tblPr.parentElement === el) {\n    const jc = tblPr.getElementsByTagName('w:jc')[0];\n    const jcVal = jc?.getAttribute('w:val');\n    if (jcVal === 'center' || jcVal === 'right' || jcVal === 'left') tableAttrs.tableAlign = jcVal;\n    const tblW = tblPr.getElementsByTagName('w:tblW')[0];\n    if (tblW?.getAttribute('w:type') === 'dxa') {\n      const w = parseInt(tblW.getAttribute('w:w') || '', 10);\n      if (!isNaN(w) && w > 0) tableAttrs.tableWidth = `${Math.round(w / TWIPS_PER_PX)}px`;\n    }\n  }\n\n  return {\n    type: 'table',\n    ...(Object.keys(tableAttrs).length ? { attrs: tableAttrs } : {}),\n    content: rows,\n  };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Run-property parsing + style cascade                                        */\n/* -------------------------------------------------------------------------- */\n\n/** First direct child of `el` with the given local name (namespace-agnostic). */\nfunction firstDirectChild(el: Element, localName: string): Element | undefined {\n  for (let i = 0; i < el.children.length; i++) {\n    const c = el.children[i];\n    const tag = c.localName || c.tagName.replace(/.*:/, '');\n    if (tag === localName) return c;\n  }\n  return undefined;\n}\n\n/** An OOXML on/off toggle element → tri-state. Absent = `undefined` (inherit). */\nfunction toggle(el: Element | undefined): boolean | undefined {\n  if (!el) return undefined;\n  const v = el.getAttribute('w:val');\n  if (v == null) return true;\n  return !(v === '0' || v === 'false' || v === 'off' || v === 'no');\n}\n\n/**\n * Parse an `<w:rPr>` element into editor-space {@link RunProps}. Used for both\n * a run's own direct formatting and a style's declared formatting, so the two\n * merge on equal footing in the cascade.\n */\nfunction parseRunPropsEl(rPr: Element, themeFonts: ThemeFonts): RunProps {\n  const props: RunProps = {};\n\n  props.bold = toggle(rPr.getElementsByTagName('w:b')[0]);\n  props.italic = toggle(rPr.getElementsByTagName('w:i')[0]);\n\n  // Underline: `w:val=\"none\"` explicitly turns it off; any other value is on.\n  const uEl = rPr.getElementsByTagName('w:u')[0];\n  if (uEl) {\n    const v = uEl.getAttribute('w:val');\n    props.underline = v !== 'none';\n  }\n\n  // Strike / double-strike both map to the single strike mark.\n  const strikeEl = rPr.getElementsByTagName('w:strike')[0];\n  const dstrikeEl = rPr.getElementsByTagName('w:dstrike')[0];\n  const strike = toggle(strikeEl);\n  const dstrike = toggle(dstrikeEl);\n  if (strike !== undefined || dstrike !== undefined) {\n    props.strike = strike === true || dstrike === true;\n  }\n\n  const vertAlign = rPr.getElementsByTagName('w:vertAlign')[0];\n  if (vertAlign) {\n    const val = vertAlign.getAttribute('w:val');\n    if (val === 'superscript' || val === 'subscript') props.vertAlign = val;\n    else if (val === 'baseline') props.vertAlign = undefined;\n  }\n\n  const colorEl = rPr.getElementsByTagName('w:color')[0];\n  if (colorEl) {\n    const color = colorEl.getAttribute('w:val');\n    if (color && color !== 'auto' && /^[0-9a-fA-F]{6}$/.test(color)) {\n      props.color = `#${color}`;\n    }\n  }\n\n  const szEl = rPr.getElementsByTagName('w:sz')[0];\n  if (szEl) {\n    const halfPoints = parseInt(szEl.getAttribute('w:val') || '0', 10);\n    if (halfPoints > 0) props.fontSizePx = `${halfPointsToPx(halfPoints)}px`;\n  }\n\n  const rFonts = rPr.getElementsByTagName('w:rFonts')[0];\n  if (rFonts) {\n    const font = resolveRFont(rFonts, themeFonts);\n    if (font) props.fontFamily = `${font}, sans-serif`;\n  }\n\n  const highlightEl = rPr.getElementsByTagName('w:highlight')[0];\n  if (highlightEl) {\n    const color = highlightEl.getAttribute('w:val');\n    if (color && color !== 'none') props.highlight = highlightNameToHex(color);\n  }\n\n  return props;\n}\n\n/**\n * A real typeface name from `<w:rFonts>`: an explicit `w:ascii` wins, else the\n * `w:asciiTheme` reference (`minor*`/`major*`) is resolved against the theme's\n * font scheme. Word records the near-universal Calibri body font and its\n * heading font only as theme refs, so without this they'd import as no font.\n */\nfunction resolveRFont(rFonts: Element, themeFonts: ThemeFonts): string | undefined {\n  const explicit = rFonts.getAttribute('w:ascii') || rFonts.getAttribute('w:hAnsi');\n  if (explicit) return explicit;\n  const theme = rFonts.getAttribute('w:asciiTheme') || rFonts.getAttribute('w:hAnsiTheme');\n  if (theme) {\n    if (theme.startsWith('major')) return themeFonts.major;\n    if (theme.startsWith('minor')) return themeFonts.minor;\n  }\n  return undefined;\n}\n\n/** {@link RunProps} → TipTap marks, mirroring the serializer's mark → OOXML. */\nfunction runPropsToMarks(props: RunProps): any[] {\n  const marks: any[] = [];\n  if (props.bold) marks.push({ type: 'bold' });\n  if (props.italic) marks.push({ type: 'italic' });\n  if (props.underline) marks.push({ type: 'underline' });\n  if (props.strike) marks.push({ type: 'strike' });\n  if (props.vertAlign === 'superscript') marks.push({ type: 'superscript' });\n  else if (props.vertAlign === 'subscript') marks.push({ type: 'subscript' });\n\n  const textStyle: any = {};\n  if (props.color) textStyle.color = props.color;\n  if (props.fontSizePx) textStyle.fontSize = props.fontSizePx;\n  if (props.fontFamily) textStyle.fontFamily = props.fontFamily;\n  if (Object.keys(textStyle).length > 0) marks.push({ type: 'textStyle', attrs: textStyle });\n\n  if (props.highlight) marks.push({ type: 'highlight', attrs: { color: props.highlight } });\n  return marks;\n}\n\n/** Parse `<w:docDefaults><w:rPrDefault>` — the root of the formatting cascade. */\nfunction parseDocDefaults(stylesXml: string, themeFonts: ThemeFonts): RunProps {\n  if (!stylesXml || typeof DOMParser === 'undefined') return {};\n  try {\n    const doc = new DOMParser().parseFromString(stylesXml, 'text/xml');\n    const rPrDefault = doc.getElementsByTagName('w:rPrDefault')[0];\n    const rPr = rPrDefault ? firstDirectChild(rPrDefault, 'rPr') : undefined;\n    return rPr ? parseRunPropsEl(rPr, themeFonts) : {};\n  } catch {\n    return {};\n  }\n}\n\n/** Parse `word/_rels/document.xml.rels` → `relationshipId -> target` map. */\nfunction parseRelationships(relsXml: string): Map<string, string> {\n  const map = new Map<string, string>();\n  if (!relsXml || typeof DOMParser === 'undefined') return map;\n  try {\n    const doc = new DOMParser().parseFromString(relsXml, 'text/xml');\n    const rels = doc.getElementsByTagName('Relationship');\n    for (let i = 0; i < rels.length; i++) {\n      const id = rels[i].getAttribute('Id');\n      const target = rels[i].getAttribute('Target');\n      if (id && target) map.set(id, target);\n    }\n  } catch {\n    // Ignore\n  }\n  return map;\n}\n\n/**\n * Read every part under `word/media/` into a `data:` URI, keyed by the path\n * relative to `word/` (e.g. \"media/image1.png\") — the same string a\n * relationship's `Target` attribute names, so resolving an `r:embed` is a\n * single map lookup. Reading these eagerly (rather than lazily per image)\n * keeps the rest of the parse synchronous, since the DOMParser-based\n * paragraph/run walk below has no natural place to `await` a per-element\n * zip read.\n *\n * An unsupported binary type (anything not in `MIME_BY_EXT` — e.g. a legacy\n * WMF/EMF vector image Word sometimes embeds) is skipped rather than guessed\n * at; the run referencing it will warn and drop, same as an unresolvable\n * relationship.\n */\nasync function readMediaParts(doc: any, warnings: string[]): Promise<Map<string, string>> {\n  const map = new Map<string, string>();\n  const files = doc.files as Record<string, any>;\n  for (const path of Object.keys(files ?? {})) {\n    const match = /^word\\/(media\\/[^/]+)$/.exec(path);\n    if (!match) continue;\n    const relPath = match[1];\n    const ext = relPath.split('.').pop()?.toLowerCase() || '';\n    const mime = MIME_BY_EXT[ext];\n    if (!mime) continue;\n    try {\n      const base64 = await files[path].async('base64');\n      map.set(relPath, `data:${mime};base64,${base64}`);\n    } catch {\n      warnings.push(`Could not read image part \"${relPath}\".`);\n    }\n  }\n  return map;\n}\n\n/** Parse the latin major/minor typefaces from `word/theme/theme1.xml`. */\nfunction parseThemeFonts(themeXml: string): ThemeFonts {\n  if (!themeXml || typeof DOMParser === 'undefined') return {};\n  try {\n    const doc = new DOMParser().parseFromString(themeXml, 'text/xml');\n    const read = (tag: string): string | undefined => {\n      const scheme = doc.getElementsByTagName(tag)[0];\n      const latin = scheme?.getElementsByTagName('a:latin')[0];\n      const face = latin?.getAttribute('typeface');\n      return face && face !== '+mn-lt' && face !== '+mj-lt' ? face : undefined;\n    };\n    return { major: read('a:majorFont'), minor: read('a:minorFont') };\n  } catch {\n    return {};\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers                                                                     */\n/* -------------------------------------------------------------------------- */\n\n// Highlight color mapping lives in `./ooxml-marks` — shared with the\n// serializer so the two directions can't drift out of sync (see that\n// file's docstring for why this used to silently corrupt round-trips).\n","/**\n * OOXML Serializer — convert TipTap JSON back to OOXML <w:body> XML.\n *\n * This replaces the `docx` library (which rebuilds the entire document\n * from scratch) with a serializer that generates proper <w:p>, <w:r>,\n * <w:t> elements. When used with selective save, only changed paragraphs\n * are patched into the original XML — preserving unchanged content\n * byte-for-byte for Word Compare compatibility.\n */\n\nimport { hexToHighlightName } from './ooxml-marks';\nimport { PX_PER_POINT, pxToHalfPoints } from './ooxml-units';\nimport { parseNumberingXml, type NumberingInfo } from './ooxml-parser';\nimport {\n  buildTableModel,\n  resolveTableBorders,\n  presetCellFill,\n  TWIPS_PER_PX,\n  type BorderSpec,\n} from './table-model';\nimport type { PageDimensionsTwips } from '../page-setup';\n\n// Lazy-load JSZip\nlet _JSZip: any = null;\nasync function getJSZip(): Promise<any> {\n  if (_JSZip) return _JSZip;\n  const mod = await import('jszip');\n  _JSZip = mod.default || mod;\n  return _JSZip;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Image embedding                                                             */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Real image embedding requires more than XML text: the binary bytes need\n * to land in `word/media/*`, a relationship needs to be registered in\n * `word/_rels/document.xml.rels` mapping an `rId` to that media file, and\n * `[Content_Types].xml` needs a `Default` entry for the file extension.\n * `ImageCollector` gathers that side-table while `blockToXml`/`imageToXml`\n * walk the document, so the caller can apply it to the zip in one pass\n * after serialization.\n */\nexport interface CollectedImage {\n  relId: string;\n  fileName: string;\n  contentType: string;\n  bytes: Uint8Array;\n}\n\n/** An external hyperlink target that needs an `TargetMode=\"External\"`\n *  relationship written alongside the images. */\nexport interface CollectedLink {\n  relId: string;\n  href: string;\n}\n\nexport class ImageCollector {\n  readonly images: CollectedImage[] = [];\n  /** External hyperlink targets, sharing this collector's `rId` counter so\n   *  image and link relationship ids can never collide. */\n  readonly links: CollectedLink[] = [];\n  private nextRelIdNum: number;\n  private nextMediaNum: number;\n  private linkRelIdByHref = new Map<string, string>();\n\n  constructor(startRelIdNum = 1, startMediaNum = 1) {\n    this.nextRelIdNum = startRelIdNum;\n    this.nextMediaNum = startMediaNum;\n  }\n\n  /** Register an image `src` (data URI) for embedding. Returns the `r:embed`\n   *  relationship id to reference from the drawing XML, or null if `src`\n   *  isn't something we can embed (e.g. a remote URL we can't fetch here). */\n  add(src: string): string | null {\n    const decoded = decodeDataUri(src);\n    if (!decoded) return null;\n    const relId = `rId${this.nextRelIdNum++}`;\n    const fileName = `image${this.nextMediaNum++}.${decoded.ext}`;\n    this.images.push({ relId, fileName, contentType: decoded.contentType, bytes: decoded.bytes });\n    return relId;\n  }\n\n  /**\n   * Register an external hyperlink target. Returns the `r:id` for the\n   * `<w:hyperlink>` element.\n   *\n   * `<w:hyperlink>` addresses its target by relationship id, so a link is only\n   * a link if a matching entry exists in `word/_rels/document.xml.rels`.\n   * Without this the serializer emitted a hardcoded `r:id=\"rIdLink\"` that\n   * resolved to nothing — Word treats an unresolvable relationship as a\n   * damaged part and offers to repair the file. Identical hrefs share one\n   * relationship, the way Word itself writes them.\n   */\n  addLink(href: string): string {\n    const existing = this.linkRelIdByHref.get(href);\n    if (existing) return existing;\n    const relId = `rId${this.nextRelIdNum++}`;\n    this.linkRelIdByHref.set(href, relId);\n    this.links.push({ relId, href });\n    return relId;\n  }\n}\n\nconst IMAGE_EXT_BY_MIME: Record<string, string> = {\n  'image/jpeg': 'jpg',\n  'image/jpg': 'jpg',\n  'image/png': 'png',\n  'image/gif': 'gif',\n  'image/bmp': 'bmp',\n  'image/webp': 'webp',\n  'image/svg+xml': 'svg',\n  'image/tiff': 'tiff',\n  'image/x-icon': 'ico',\n};\n\n/** Decode a `data:` URI into raw bytes + a file extension/content type. */\nfunction decodeDataUri(src: string): { bytes: Uint8Array; ext: string; contentType: string } | null {\n  const match = /^data:([^;,]+)(?:;charset=[^;,]+)?;base64,([\\s\\S]*)$/.exec(src);\n  if (!match) return null;\n  const contentType = match[1].toLowerCase();\n  const ext = IMAGE_EXT_BY_MIME[contentType] ?? contentType.split('/')[1]?.split('+')[0] ?? 'png';\n  try {\n    return { bytes: base64ToBytes(match[2]), ext, contentType };\n  } catch {\n    return null;\n  }\n}\n\n/** Base64 → bytes. Works in the browser (`atob`) and in Node (`Buffer`). */\nfunction base64ToBytes(base64: string): Uint8Array {\n  if (typeof atob === 'function') {\n    const binary = atob(base64);\n    const bytes = new Uint8Array(binary.length);\n    for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n    return bytes;\n  }\n  const nodeBuffer = (globalThis as any).Buffer;\n  if (nodeBuffer) {\n    const buf = nodeBuffer.from(base64, 'base64');\n    return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n  }\n  throw new Error('No base64 decoder available in this environment');\n}\n\nconst EMU_PER_PX = 9525; // 1px @ 96dpi, the standard OOXML drawing unit conversion\n\n/** Convert a CSS length (e.g. \"300px\") to EMUs, falling back to a default\n *  pixel size when the value is missing or is a percentage (which we can't\n *  resolve to an absolute size without knowing the page's content width). */\nfunction lengthToEmu(value: string | number | null | undefined, fallbackPx: number): number {\n  if (value === null || value === undefined || value === '') return fallbackPx * EMU_PER_PX;\n  const str = String(value).trim();\n  if (str.endsWith('%')) return fallbackPx * EMU_PER_PX;\n  const num = parseFloat(str);\n  if (isNaN(num) || num <= 0) return fallbackPx * EMU_PER_PX;\n  return Math.round(num * EMU_PER_PX);\n}\n\nconst RELS_PATH = 'word/_rels/document.xml.rels';\nconst CONTENT_TYPES_PATH = '[Content_Types].xml';\nconst IMAGE_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image';\nconst HYPERLINK_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink';\n\n/** Figure out the next free `rIdN` / `imageN` numbers so newly-added\n *  relationships/media never collide with what's already in the .docx. */\nasync function computeNextImageIds(zip: any): Promise<{ nextRelIdNum: number; nextMediaNum: number }> {\n  let nextRelIdNum = 1;\n  let nextMediaNum = 1;\n  try {\n    const relsXml = await zip.file(RELS_PATH)?.async('string');\n    if (relsXml) {\n      for (const m of relsXml.matchAll(/Id=\"rId(\\d+)\"/g)) {\n        nextRelIdNum = Math.max(nextRelIdNum, parseInt(m[1], 10) + 1);\n      }\n    }\n  } catch {\n    // ignore — start from 1\n  }\n  try {\n    for (const path of Object.keys(zip.files ?? {})) {\n      const m = /^word\\/media\\/image(\\d+)\\./.exec(path);\n      if (m) nextMediaNum = Math.max(nextMediaNum, parseInt(m[1], 10) + 1);\n    }\n  } catch {\n    // ignore — start from 1\n  }\n  return { nextRelIdNum, nextMediaNum };\n}\n\n/** Write collected images' bytes into `word/media/*`, and register them in\n *  `word/_rels/document.xml.rels` + `[Content_Types].xml` so Word can\n *  actually resolve the `r:embed` references in the body XML. */\nasync function applyImageCollectorToZip(zip: any, collector: ImageCollector): Promise<void> {\n  if (collector.images.length === 0 && collector.links.length === 0) return;\n\n  for (const img of collector.images) {\n    zip.file(`word/media/${img.fileName}`, img.bytes);\n  }\n\n  let relsXml: string | undefined = await zip.file(RELS_PATH)?.async('string');\n  if (!relsXml) {\n    relsXml =\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>';\n  }\n  const relEntries =\n    collector.images\n      .map((img) => `<Relationship Id=\"${img.relId}\" Type=\"${IMAGE_REL_TYPE}\" Target=\"media/${img.fileName}\"/>`)\n      .join('') +\n    collector.links\n      .map(\n        (link) =>\n          `<Relationship Id=\"${link.relId}\" Type=\"${HYPERLINK_REL_TYPE}\" Target=\"${escapeXml(link.href)}\" TargetMode=\"External\"/>`,\n      )\n      .join('');\n  relsXml = relsXml.includes('</Relationships>')\n    ? relsXml.replace('</Relationships>', `${relEntries}</Relationships>`)\n    : relsXml + relEntries;\n  zip.file(RELS_PATH, relsXml);\n\n  let typesXml: string | undefined = await zip.file(CONTENT_TYPES_PATH)?.async('string');\n  if (!typesXml) {\n    typesXml =\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"></Types>';\n  }\n  const seenExt = new Set<string>();\n  let defaultsToAdd = '';\n  for (const img of collector.images) {\n    const ext = img.fileName.split('.').pop()!;\n    if (seenExt.has(ext)) continue;\n    seenExt.add(ext);\n    if (!new RegExp(`Extension=\"${ext}\"`, 'i').test(typesXml)) {\n      defaultsToAdd += `<Default Extension=\"${ext}\" ContentType=\"${img.contentType}\"/>`;\n    }\n  }\n  if (defaultsToAdd) {\n    typesXml = typesXml.includes('</Types>')\n      ? typesXml.replace('</Types>', `${defaultsToAdd}</Types>`)\n      : typesXml + defaultsToAdd;\n    zip.file(CONTENT_TYPES_PATH, typesXml);\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Types                                                                       */\n/* -------------------------------------------------------------------------- */\n\nexport interface SerializeOptions {\n  /** If provided, only serialize blocks whose indices are in this set.\n   *  Others will be left unchanged in the original XML. */\n  changedBlockIndices?: Set<number>;\n  /** Collects images encountered during serialization (bytes + assigned\n   *  relationship id) so the caller can embed them into the .docx zip.\n   *  If omitted, images are serialized as `[Image: ...]` placeholder text. */\n  imageCollector?: ImageCollector;\n  /**\n   * Numbering definitions read from the *original* document's\n   * `word/numbering.xml` (via `parseNumberingXml`). When present, bullet and\n   * ordered lists resolve their `w:numId` to a definition that actually\n   * exists in that document instead of hardcoding numId \"1\"/\"2\" — which\n   * only happens to be correct by convention and can point a list at the\n   * wrong (or a nonexistent) numbering definition otherwise.\n   */\n  numberingMap?: Map<string, NumberingInfo>;\n  /** Reference default header/footer parts in sectPr (rel ids fixed to\n   *  match docx-package.ts's buildFreshDocxPackage). */\n  hasHeader?: boolean;\n  hasFooter?: boolean;\n  /**\n   * Page size/margins in OOXML twips, from `resolvePageDimensionsTwips()`\n   * (`../page-setup`). Defaults to US Letter (12240x15840 twips) with 1in\n   * margins — matching Word's own built-in default — when omitted.\n   */\n  pageDimensions?: PageDimensionsTwips;\n}\n\nexport interface SerializeResult {\n  /** Full <w:body> XML string (for full document replacement). */\n  bodyXml: string;\n  /** Array of { index, xml } for individual changed paragraphs (for selective patching). */\n  changedParagraphs: Array<{ index: number; xml: string }>;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Main serialize function                                                     */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Convert TipTap JSON to OOXML <w:body> XML.\n *\n * @param json - TipTap document JSON\n * @param options - Serialization options\n * @returns XML string + per-paragraph XML for selective patching\n */\nexport function serializeTipTapToOOXML(\n  json: any,\n  options: SerializeOptions = {},\n): SerializeResult {\n  const blocks = json?.content ?? [];\n  const changedParagraphs: Array<{ index: number; xml: string }> = [];\n  const bodyParts: string[] = [];\n  const collector = options.imageCollector;\n  const numberingMap = options.numberingMap;\n  revisionIdCounter = 0;\n  bookmarkIdCounter = 0;\n\n  for (let i = 0; i < blocks.length; i++) {\n    const block = blocks[i];\n    const xml = blockToXml(block, collector, numberingMap);\n\n    bodyParts.push(xml);\n\n    if (options.changedBlockIndices?.has(i)) {\n      changedParagraphs.push({ index: i, xml });\n    }\n  }\n\n  const pd = options.pageDimensions ?? {\n    widthTwips: 12240,\n    heightTwips: 15840,\n    marginXTwips: 1440,\n    marginYTwips: 1440,\n  };\n  const headerRef = options.hasHeader ? '<w:headerReference w:type=\"default\" r:id=\"rIdHeader\"/>' : '';\n  const footerRef = options.hasFooter ? '<w:footerReference w:type=\"default\" r:id=\"rIdFooter\"/>' : '';\n  const bodyXml = `<w:body>${bodyParts.join('')}<w:sectPr>${headerRef}${footerRef}<w:pgSz w:w=\"${pd.widthTwips}\" w:h=\"${pd.heightTwips}\"/><w:pgMar w:top=\"${pd.marginYTwips}\" w:right=\"${pd.marginXTwips}\" w:bottom=\"${pd.marginYTwips}\" w:left=\"${pd.marginXTwips}\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/><w:cols w:space=\"720\"/><w:docGrid w:linePitch=\"360\"/></w:sectPr></w:body>`;\n\n  return { bodyXml, changedParagraphs };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Block → XML converters                                                      */\n/* -------------------------------------------------------------------------- */\n\nfunction blockToXml(block: any, collector?: ImageCollector, numberingMap?: Map<string, NumberingInfo>): string {\n  if (!block) return '';\n\n  switch (block.type) {\n    case 'paragraph':\n      return paragraphToXml(block, collector);\n    case 'heading':\n      return headingToXml(block, collector);\n    case 'bulletList':\n      return listToXml(block, 'bullet', collector, numberingMap);\n    case 'orderedList':\n      return listToXml(block, 'decimal', collector, numberingMap);\n    case 'blockquote':\n      return blockquoteToXml(block, collector);\n    case 'codeBlock':\n      return codeBlockToXml(block);\n    case 'horizontalRule':\n      return '<w:p><w:pPr><w:pBdr><w:bottom w:val=\"single\" w:sz=\"6\" w:space=\"1\" w:color=\"auto\"/></w:pBdr></w:pPr></w:p>';\n    case 'pageBreak':\n      return '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\n    case 'table':\n      return tableToXml(block, collector, numberingMap);\n    case 'image':\n      return imageToXml(block, collector);\n    default:\n      // Unknown block — try as paragraph\n      if (block.content) return paragraphToXml(block, collector);\n      return '<w:p/>';\n  }\n}\n\n/**\n * The `<w:pPr>` children shared by every paragraph-ish block (plain\n * paragraphs, headings, list items, quotes) — alignment, line spacing and\n * indentation, i.e. the paragraph properties the editor renders on screen.\n * Extracted so a list item doesn't silently lose the alignment/spacing a\n * plain paragraph keeps.\n */\nfunction paragraphPropParts(attrs: any): string[] {\n  const parts: string[] = [];\n\n  if (attrs?.textAlign) {\n    parts.push(`<w:jc w:val=\"${attrs.textAlign}\"/>`);\n  }\n\n  if (attrs?.lineHeight) {\n    const multiplier = parseFloat(attrs.lineHeight);\n    if (!isNaN(multiplier)) {\n      // `w:line` is in 240ths of a line when `w:lineRule=\"auto\"`.\n      parts.push(`<w:spacing w:line=\"${Math.round(multiplier * 240)}\" w:lineRule=\"auto\"/>`);\n    }\n  }\n\n  // Indentation (px in the editor's schema → twips). `textIndent` is the\n  // first-line indent; a negative value is a hanging indent, which OOXML\n  // spells as `w:hanging` rather than a negative `w:firstLine`.\n  const indentParts: string[] = [];\n  const indentPx = parseFloat(attrs?.indent);\n  if (!isNaN(indentPx) && indentPx !== 0) indentParts.push(`w:left=\"${Math.round(indentPx * TWIPS_PER_PX)}\"`);\n  const firstLinePx = parseFloat(attrs?.textIndent);\n  if (!isNaN(firstLinePx) && firstLinePx !== 0) {\n    indentParts.push(\n      firstLinePx > 0\n        ? `w:firstLine=\"${Math.round(firstLinePx * TWIPS_PER_PX)}\"`\n        : `w:hanging=\"${Math.round(-firstLinePx * TWIPS_PER_PX)}\"`,\n    );\n  }\n  if (indentParts.length > 0) parts.push(`<w:ind ${indentParts.join(' ')}/>`);\n\n  // Tab stops (px in the editor's schema → twips).\n  if (Array.isArray(attrs?.tabStops) && attrs.tabStops.length > 0) {\n    const tabEls = attrs.tabStops\n      .map((t: { pos: number; val: string }) => `<w:tab w:val=\"${t.val}\" w:pos=\"${Math.round(t.pos * TWIPS_PER_PX)}\"/>`)\n      .join('');\n    parts.push(`<w:tabs>${tabEls}</w:tabs>`);\n  }\n\n  return parts;\n}\n\nfunction paragraphToXml(block: any, collector?: ImageCollector): string {\n  const pPrParts = paragraphPropParts(block.attrs);\n  const pPr = pPrParts.length > 0 ? `<w:pPr>${pPrParts.join('')}</w:pPr>` : '';\n  const runs = runsToXml(block.content ?? [], collector);\n\n  return `<w:p>${pPr}${runs}</w:p>`;\n}\n\nfunction headingToXml(block: any, collector?: ImageCollector): string {\n  const level = block.attrs?.level ?? 2;\n  const styleId = `Heading${level}`;\n  const attrs = block.attrs ?? {};\n\n  const pPrParts: string[] = [`<w:pStyle w:val=\"${styleId}\"/>`, ...paragraphPropParts(attrs)];\n\n  const pPr = `<w:pPr>${pPrParts.join('')}</w:pPr>`;\n  const runs = runsToXml(block.content ?? [], collector);\n\n  return `<w:p>${pPr}${runs}</w:p>`;\n}\n\n/**\n * A bullet/ordered list → one `<w:p>` per list-item paragraph carrying a\n * `<w:numPr>`.\n *\n * `level` is the nesting depth (`w:ilvl`). A list nested inside a list item\n * used to be dropped on the floor — only direct `paragraph` children were\n * serialized — so a two-level list exported as a flat one with its sub-items\n * missing entirely. Nested lists now recurse with `level + 1`, which is also\n * how Word itself represents them (a flat run of paragraphs distinguished\n * only by `w:ilvl`, not by nesting in the XML). Levels beyond the 9 defined\n * in numbering.xml clamp to the last one, matching Word's own limit.\n */\nfunction listToXml(\n  block: any,\n  format: 'bullet' | 'decimal',\n  collector?: ImageCollector,\n  numberingMap?: Map<string, NumberingInfo>,\n  level = 0,\n): string {\n  const items = block.content ?? [];\n  const parts: string[] = [];\n  const numId = resolveNumId(format, numberingMap);\n  const ilvl = Math.min(level, 8);\n\n  for (const item of items) {\n    if (item.type !== 'listItem') continue;\n    for (const child of item.content ?? []) {\n      if (child.type === 'paragraph') {\n        const numPr = `<w:numPr><w:ilvl w:val=\"${ilvl}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`;\n        // `ListParagraph` is the style Word tags list items with; without it\n        // exported items lose the list's own indentation/spacing.\n        const pPrParts = [`<w:pStyle w:val=\"ListParagraph\"/>`, numPr, ...paragraphPropParts(child.attrs)];\n        const runs = runsToXml(child.content ?? [], collector);\n        parts.push(`<w:p><w:pPr>${pPrParts.join('')}</w:pPr>${runs}</w:p>`);\n      } else if (child.type === 'bulletList' || child.type === 'orderedList') {\n        parts.push(\n          listToXml(child, child.type === 'bulletList' ? 'bullet' : 'decimal', collector, numberingMap, level + 1),\n        );\n      } else {\n        parts.push(blockToXml(child, collector, numberingMap));\n      }\n    }\n  }\n\n  return parts.join('');\n}\n\n/**\n * Resolve the `w:numId` a bullet/ordered list should reference: the first\n * definition in the *original* document's numbering.xml matching the\n * requested format, so a selective save points lists at a numbering\n * definition that actually exists rather than assuming numId \"1\" is always\n * bullets and \"2\" is always decimal.\n *\n * Falls back to that convention only when there's no numbering map to draw\n * from (no `numbering.xml` in the original .docx, or this is a full/fresh\n * save with no \"original document\" at all) — a best-effort default, not a\n * guarantee, since a document with unconventional numId assignments and no\n * matching list already in it has no existing definition to point to.\n */\nfunction resolveNumId(format: 'bullet' | 'decimal', numberingMap?: Map<string, NumberingInfo>): string {\n  if (numberingMap) {\n    for (const info of numberingMap.values()) {\n      const isBullet = info.format === 'bullet';\n      if ((format === 'bullet') === isBullet) return info.numId;\n    }\n  }\n  return format === 'bullet' ? '1' : '2';\n}\n\nfunction blockquoteToXml(block: any, collector?: ImageCollector): string {\n  const paragraphs = block.content ?? [];\n  const parts: string[] = [];\n  for (const p of paragraphs) {\n    if (p.type === 'paragraph') {\n      const pPr = '<w:pPr><w:pStyle w:val=\"Quote\"/></w:pPr>';\n      const runs = runsToXml(p.content ?? [], collector);\n      parts.push(`<w:p>${pPr}${runs}</w:p>`);\n    }\n  }\n  return parts.join('') || '<w:p><w:pPr><w:pStyle w:val=\"Quote\"/></w:pPr></w:p>';\n}\n\nfunction codeBlockToXml(block: any): string {\n  const pPr = '<w:pPr><w:pStyle w:val=\"Code\"/></w:pPr>';\n  const runs = runsToXml(block.content ?? []);\n  return `<w:p>${pPr}${runs}</w:p>`;\n}\n\n/** One `<w:*>` border element from a shared BorderSpec. */\nfunction borderXml(tag: string, spec: BorderSpec): string {\n  if (spec.val === 'none') return `<w:${tag} w:val=\"none\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\"/>`;\n  return `<w:${tag} w:val=\"single\" w:sz=\"${spec.sz}\" w:space=\"0\" w:color=\"${spec.color}\"/>`;\n}\n\n/**\n * Serialize a TipTap `table` node to OOXML, preserving the full grid.\n *\n * The previous version emitted an empty `<w:tblGrid/>`, `w:type=\"auto\"`\n * cell widths and hard-coded borders — so Word re-flowed every column to\n * auto-width, dropped all merges, shading and alignment, and ignored the\n * editor's border/table-style presets. This rebuilds the real grid via\n * `buildTableModel` and emits a proper `<w:tblGrid>`, per-cell `<w:tcW>`\n * widths, `<w:gridSpan>` / `<w:vMerge>` for merged cells, `<w:shd>` fills,\n * borders resolved from the editor's presets, and table width/alignment.\n */\nfunction tableToXml(block: any, collector?: ImageCollector, numberingMap?: Map<string, NumberingInfo>): string {\n  const model = buildTableModel(block);\n  const borders = resolveTableBorders(model);\n  const trParts: string[] = [];\n\n  model.rows.forEach((rowModel, rowIndex) => {\n    const tcParts: string[] = [];\n\n    for (const cellModel of rowModel.cells) {\n      const tcPrParts: string[] = [];\n\n      // Width (twips). Known width → dxa; otherwise auto.\n      if (cellModel.widthPx != null) {\n        tcPrParts.push(`<w:tcW w:w=\"${Math.round(cellModel.widthPx * TWIPS_PER_PX)}\" w:type=\"dxa\"/>`);\n      } else {\n        tcPrParts.push('<w:tcW w:w=\"0\" w:type=\"auto\"/>');\n      }\n\n      if (cellModel.colspan > 1) tcPrParts.push(`<w:gridSpan w:val=\"${cellModel.colspan}\"/>`);\n\n      if (cellModel.vMergeContinue) {\n        tcPrParts.push('<w:vMerge/>');\n      } else if (cellModel.rowspan > 1) {\n        tcPrParts.push('<w:vMerge w:val=\"restart\"/>');\n      }\n\n      const fill = cellModel.backgroundColor ?? presetCellFill(model, cellModel.isHeader, rowIndex);\n      if (fill) tcPrParts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${fill}\"/>`);\n\n      const tcPr = `<w:tcPr>${tcPrParts.join('')}</w:tcPr>`;\n\n      // Continuation cells carry no content of their own.\n      const cellParas: string[] = [];\n      if (!cellModel.vMergeContinue) {\n        for (const p of cellModel.node?.content ?? []) {\n          if (p.type === 'paragraph') {\n            const runs = runsToXml(p.content ?? [], collector);\n            cellParas.push(`<w:p>${runs}</w:p>`);\n          } else {\n            cellParas.push(blockToXml(p, collector, numberingMap));\n          }\n        }\n      }\n\n      tcParts.push(`<w:tc>${tcPr}${cellParas.join('') || '<w:p/>'}</w:tc>`);\n    }\n\n    const trPrParts: string[] = [];\n    if (rowIndex === 0 && rowModel.cells.some((c) => c.isHeader)) trPrParts.push('<w:tblHeader/>');\n    if (rowModel.heightPx != null) {\n      trPrParts.push(`<w:trHeight w:val=\"${Math.round(rowModel.heightPx * TWIPS_PER_PX)}\" w:hRule=\"atLeast\"/>`);\n    }\n    const trPr = trPrParts.length ? `<w:trPr>${trPrParts.join('')}</w:trPr>` : '';\n    trParts.push(`<w:tr>${trPr}${tcParts.join('')}</w:tr>`);\n  });\n\n  // Table width + alignment.\n  const tblWParts: string[] = [];\n  if (model.tableWidthPercent != null) {\n    tblWParts.push(`<w:tblW w:w=\"${Math.round(model.tableWidthPercent * 50)}\" w:type=\"pct\"/>`);\n  } else if (model.tableWidthPx != null) {\n    tblWParts.push(`<w:tblW w:w=\"${Math.round(model.tableWidthPx * TWIPS_PER_PX)}\" w:type=\"dxa\"/>`);\n  } else if (model.colWidthsPx.length > 0 && model.colWidthsPx.every((w) => w != null)) {\n    const total = (model.colWidthsPx as number[]).reduce((a, b) => a + b, 0);\n    tblWParts.push(`<w:tblW w:w=\"${Math.round(total * TWIPS_PER_PX)}\" w:type=\"dxa\"/>`);\n  } else {\n    tblWParts.push('<w:tblW w:w=\"5000\" w:type=\"pct\"/>');\n  }\n  if (model.align === 'center') tblWParts.push('<w:jc w:val=\"center\"/>');\n  else if (model.align === 'right') tblWParts.push('<w:jc w:val=\"right\"/>');\n\n  const tblBorders =\n    '<w:tblBorders>' +\n    borderXml('top', borders.top) +\n    borderXml('left', borders.left) +\n    borderXml('bottom', borders.bottom) +\n    borderXml('right', borders.right) +\n    borderXml('insideH', borders.insideH) +\n    borderXml('insideV', borders.insideV) +\n    '</w:tblBorders>';\n\n  const tblPr = `<w:tblPr>${tblWParts.join('')}${tblBorders}</w:tblPr>`;\n\n  // Grid: one <w:gridCol> per column, with widths when known.\n  const gridCols = model.colWidthsPx\n    .map((w) =>\n      w != null ? `<w:gridCol w:w=\"${Math.round(w * TWIPS_PER_PX)}\"/>` : '<w:gridCol/>',\n    )\n    .join('');\n  const tblGrid = `<w:tblGrid>${gridCols}</w:tblGrid>`;\n\n  return `<w:tbl>${tblPr}${tblGrid}${trParts.join('')}</w:tbl>`;\n}\n\n/**\n * Serialize an `image` node to real OOXML DrawingML — `<w:drawing>` with a\n * `<pic:pic>` that `r:embed`s a relationship id from `collector`. The\n * namespaces used (`wp`, `a`, `pic`, `r`) are declared right on `<w:drawing>`\n * itself so this fragment is also valid if it's ever parsed standalone (as\n * `patchDocumentXml`'s selective-paragraph-patch path does).\n *\n * Falls back to a `[Image: ...]` placeholder when there's no collector (the\n * caller didn't ask for image embedding) or the source can't be decoded\n * (e.g. a remote URL we have no way to fetch synchronously here).\n */\nfunction imageToXml(block: any, collector?: ImageCollector): string {\n  // A block-level image carries its own `alignment` attr (the editor's\n  // left/center/right image control) — without this the picture always\n  // exported flush left regardless of how it was placed on the page.\n  const imgAlign = block.attrs?.alignment;\n  const imgPPr = imgAlign ? `<w:pPr><w:jc w:val=\"${imgAlign}\"/></w:pPr>` : '';\n  return `<w:p>${imgPPr}${imageRunXml(block, collector)}</w:p>`;\n}\n\n/**\n * The `<w:r>` for an image, without a surrounding paragraph.\n *\n * Kept separate from `imageToXml` because an image can appear either as a\n * block (its own paragraph) or inline among text runs. Emitting the paragraph\n * wrapper in both cases nested a `<w:p>` inside a `<w:p>`, which is not legal\n * WordprocessingML — Word reports the document as damaged.\n */\nfunction imageRunXml(block: any, collector?: ImageCollector): string {\n  const src = block.attrs?.src || '';\n  const alt = escapeXml(block.attrs?.alt || 'Image');\n\n  const relId = collector && src ? collector.add(src) : null;\n  if (relId) {\n    const cx = lengthToEmu(block.attrs?.width, 400);\n    const cy = lengthToEmu(block.attrs?.height, 300);\n    const docPrId = collector!.images.length;\n    return (\n      '<w:r><w:drawing' +\n      ' xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"' +\n      ' xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"' +\n      ' xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"' +\n      ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n      `<wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\">` +\n      `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/>` +\n      `<wp:docPr id=\"${docPrId}\" name=\"Picture ${docPrId}\" descr=\"${alt}\"/>` +\n      '<a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">' +\n      '<pic:pic>' +\n      `<pic:nvPicPr><pic:cNvPr id=\"0\" name=\"Picture ${docPrId}\"/><pic:cNvPicPr/></pic:nvPicPr>` +\n      `<pic:blipFill><a:blip r:embed=\"${relId}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill>` +\n      `<pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n      '<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr>' +\n      '</pic:pic></a:graphicData></a:graphic>' +\n      '</wp:inline></w:drawing></w:r>'\n    );\n  }\n\n  // No collector, or the src couldn't be embedded — best-effort placeholder\n  // so round-tripping never silently loses the fact an image was there.\n  return `<w:r><w:t>[Image: ${alt}]</w:t></w:r>`;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Runs → XML converter                                                        */\n/* -------------------------------------------------------------------------- */\n\nlet revisionIdCounter = 0;\n\nfunction trackChangeMark(node: any): { type: 'insertion' | 'deletion'; attrs: any } | undefined {\n  return (node.marks ?? []).find((m: any) => m.type === 'insertion' || m.type === 'deletion');\n}\n\n// Wraps a run's XML in `<w:ins>`/`<w:del>` when it carries a track-changes\n// mark, so suggestions round-trip as real Word redlines.\nfunction wrapTrackChange(xml: string, node: any): string {\n  const mark = trackChangeMark(node);\n  if (!mark) return xml;\n  const id = revisionIdCounter++;\n  const author = escapeXml(mark.attrs?.author || 'Unknown');\n  const date = mark.attrs?.date || new Date().toISOString();\n  const tag = mark.type === 'insertion' ? 'ins' : 'del';\n  return `<w:${tag} w:id=\"${id}\" w:author=\"${author}\" w:date=\"${date}\">${xml}</w:${tag}>`;\n}\n\nfunction nodeRunXml(node: any, collector?: ImageCollector): string {\n  if (node.type === 'text') {\n    const isDeleted = trackChangeMark(node)?.type === 'deletion';\n    return wrapTrackChange(textRunToXml(node, collector, isDeleted), node);\n  }\n  if (node.type === 'hardBreak') return '<w:r><w:br/></w:r>';\n  if (node.type === 'image') return imageRunXml(node, collector); // inline image run\n  return '';\n}\n\nfunction commentId(node: any): string | undefined {\n  return (node.marks ?? []).find((m: any) => m.type === 'comment')?.attrs?.id;\n}\n\nfunction contentControlMark(node: any): { id?: string; tag?: string; alias?: string } | undefined {\n  return (node.marks ?? []).find((m: any) => m.type === 'contentControl')?.attrs;\n}\n\nfunction bookmarkName(node: any): string | undefined {\n  return (node.marks ?? []).find((m: any) => m.type === 'bookmark')?.attrs?.name;\n}\n\nfunction fieldInstr(node: any): string | undefined {\n  return (node.marks ?? []).find((m: any) => m.type === 'field')?.attrs?.instr;\n}\n\n// Composite range key: contiguous nodes sharing the exact same comment/\n// content-control/bookmark/field combination get bracketed together in one go.\nfunction rangeKey(node: any): string | null {\n  const cc = contentControlMark(node);\n  // Group by cc's id when present, else a shared marker so id-less content\n  // controls still bracket together (not by falling through to null).\n  const key = { comment: commentId(node), cc: cc ? (cc.id ?? '\\u0000') : undefined, bookmark: bookmarkName(node), field: fieldInstr(node) };\n  if (!key.comment && !key.cc && !key.bookmark && !key.field) return null;\n  return JSON.stringify(key);\n}\n\nlet bookmarkIdCounter = 0;\n\nfunction runsToXml(content: any[], collector?: ImageCollector): string {\n  if (!content || content.length === 0) return '';\n\n  const parts: string[] = [];\n  let i = 0;\n  while (i < content.length) {\n    const key = rangeKey(content[i]);\n    if (!key) {\n      parts.push(nodeRunXml(content[i], collector));\n      i++;\n      continue;\n    }\n    // Group consecutive runs sharing the same comment/content-control/\n    // bookmark combination into one bracket, matching how Word anchors these.\n    let j = i;\n    const groupXml: string[] = [];\n    while (j < content.length && rangeKey(content[j]) === key) {\n      groupXml.push(nodeRunXml(content[j], collector));\n      j++;\n    }\n    let xml = groupXml.join('');\n\n    const cId = commentId(content[i]);\n    if (cId) {\n      const safeId = escapeXml(cId);\n      xml = `<w:commentRangeStart w:id=\"${safeId}\"/>${xml}<w:commentRangeEnd w:id=\"${safeId}\"/><w:r><w:commentReference w:id=\"${safeId}\"/></w:r>`;\n    }\n\n    const cc = contentControlMark(content[i]);\n    if (cc) {\n      const props =\n        (cc.tag ? `<w:tag w:val=\"${escapeXml(cc.tag)}\"/>` : '') +\n        (cc.alias ? `<w:alias w:val=\"${escapeXml(cc.alias)}\"/>` : '') +\n        (cc.id ? `<w:id w:val=\"${escapeXml(cc.id)}\"/>` : '');\n      xml = `<w:sdt><w:sdtPr>${props}</w:sdtPr><w:sdtContent>${xml}</w:sdtContent></w:sdt>`;\n    }\n\n    const bName = bookmarkName(content[i]);\n    if (bName) {\n      const bId = bookmarkIdCounter++;\n      const safeName = escapeXml(bName);\n      xml = `<w:bookmarkStart w:id=\"${bId}\" w:name=\"${safeName}\"/>${xml}<w:bookmarkEnd w:id=\"${bId}\"/>`;\n    }\n\n    const instr = fieldInstr(content[i]);\n    if (instr) xml = `<w:fldSimple w:instr=\"${escapeXml(instr)}\">${xml}</w:fldSimple>`;\n\n    parts.push(xml);\n    i = j;\n  }\n\n  return parts.join('');\n}\n\nfunction textRunToXml(node: any, collector?: ImageCollector, asDeleted = false): string {\n  const marks = node.marks ?? [];\n  const rPrParts: string[] = [];\n\n  for (const mark of marks) {\n    switch (mark.type) {\n      case 'bold':\n        rPrParts.push('<w:b/>');\n        break;\n      case 'italic':\n        rPrParts.push('<w:i/>');\n        break;\n      case 'underline':\n        rPrParts.push('<w:u w:val=\"single\"/>');\n        break;\n      case 'strike':\n        rPrParts.push('<w:strike/>');\n        break;\n      case 'superscript':\n        rPrParts.push('<w:vertAlign w:val=\"superscript\"/>');\n        break;\n      case 'subscript':\n        rPrParts.push('<w:vertAlign w:val=\"subscript\"/>');\n        break;\n      case 'textStyle':\n        if (mark.attrs?.color) {\n          const color = mark.attrs.color.replace('#', '');\n          rPrParts.push(`<w:color w:val=\"${color}\"/>`);\n        }\n        if (mark.attrs?.fontSize) {\n          const px = parseFloat(mark.attrs.fontSize);\n          if (!isNaN(px)) {\n            const halfPoints = pxToHalfPoints(px);\n            rPrParts.push(`<w:sz w:val=\"${halfPoints}\"/>`);\n          }\n        }\n        if (mark.attrs?.fontFamily) {\n          const font = escapeXml(mark.attrs.fontFamily.split(',')[0].trim().replace(/\"/g, ''));\n          // `w:cs` covers complex scripts (Sinhala/Tamil run through it), so a\n          // Sinhala document keeps its font in Word instead of falling back to\n          // the theme's Latin face.\n          rPrParts.push(`<w:rFonts w:ascii=\"${font}\" w:hAnsi=\"${font}\" w:cs=\"${font}\"/>`);\n        }\n        if (mark.attrs?.letterSpacing) {\n          // CSS letter-spacing (px) → OOXML `w:spacing`, which is in twentieths\n          // of a point. Negative (tightened) values are legal in both.\n          const px = parseFloat(mark.attrs.letterSpacing);\n          if (!isNaN(px)) rPrParts.push(`<w:spacing w:val=\"${Math.round((px / PX_PER_POINT) * 20)}\"/>`);\n        }\n        if (mark.attrs?.backgroundColor) {\n          const fill = String(mark.attrs.backgroundColor).replace('#', '');\n          rPrParts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${fill}\"/>`);\n        }\n        break;\n      case 'textTransform':\n        // Word has no lowercase/capitalize run property — only all-caps and\n        // small-caps — so those two are left to render as authored.\n        if (mark.attrs?.transform === 'uppercase') rPrParts.push('<w:caps/>');\n        break;\n      case 'highlight':\n        if (mark.attrs?.color) {\n          const colorName = hexToHighlightName(mark.attrs.color);\n          rPrParts.push(`<w:highlight w:val=\"${colorName}\"/>`);\n        }\n        break;\n      case 'link':\n        // Links need relationship management — skip rPr, handle at paragraph level\n        break;\n    }\n  }\n\n  const rPr = rPrParts.length > 0 ? `<w:rPr>${rPrParts.join('')}</w:rPr>` : '';\n  const text = escapeXml(node.text || '');\n  // Deleted text goes in `<w:delText>`, not `<w:t>` — Word ignores `<w:t>`\n  // inside `<w:del>`.\n  const textTag = asDeleted ? 'delText' : 't';\n\n  // Check if this run has a link mark. `Hyperlink` is a character style\n  // defined in styles.xml (blue + underlined), matching how the editor draws\n  // links on screen — Word won't style a bare hyperlink run otherwise.\n  const linkMark = marks.find((m: any) => m.type === 'link');\n  const href = linkMark?.attrs?.href;\n  // An internal link (from a `bookmark` mark's name, imported as `#name`)\n  // uses `w:anchor`, not a relationship — there's nothing to add to rels.xml.\n  if (href?.startsWith('#')) {\n    const linkRPr = `<w:rPr><w:rStyle w:val=\"Hyperlink\"/>${rPrParts.join('')}</w:rPr>`;\n    return `<w:hyperlink w:anchor=\"${escapeXml(href.slice(1))}\" w:history=\"1\"><w:r>${linkRPr}<w:${textTag} xml:space=\"preserve\">${text}</w:${textTag}></w:r></w:hyperlink>`;\n  }\n  if (href && collector) {\n    const relId = collector.addLink(String(href));\n    const linkRPr = `<w:rPr><w:rStyle w:val=\"Hyperlink\"/>${rPrParts.join('')}</w:rPr>`;\n    return `<w:hyperlink r:id=\"${relId}\" w:history=\"1\"><w:r>${linkRPr}<w:${textTag} xml:space=\"preserve\">${text}</w:${textTag}></w:r></w:hyperlink>`;\n  }\n  if (href) {\n    // No collector to register the relationship with (e.g. a caller\n    // serializing a fragment) — emit a styled run rather than a\n    // `<w:hyperlink>` pointing at an id that won't exist in the package.\n    const linkRPr = `<w:rPr><w:rStyle w:val=\"Hyperlink\"/>${rPrParts.join('')}</w:rPr>`;\n    return `<w:r>${linkRPr}<w:${textTag} xml:space=\"preserve\">${text}</w:${textTag}></w:r>`;\n  }\n\n  return `<w:r>${rPr}<w:${textTag} xml:space=\"preserve\">${text}</w:${textTag}></w:r>`;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Selective XML patch                                                         */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Patch only the changed <w:p> elements in the original document.xml.\n *\n * This finds all <w:p> and <w:tbl> elements in the original XML,\n * replaces the ones at the given indices with the new XML, and\n * preserves everything else byte-for-byte.\n *\n * @param originalXml - The original word/document.xml string\n * @param changedParagraphs - Array of { index, xml } from serializeTipTapToOOXML\n * @returns Patched document.xml string\n */\nexport function patchDocumentXml(\n  originalXml: string,\n  changedParagraphs: Array<{ index: number; xml: string }>,\n): string {\n  if (changedParagraphs.length === 0) return originalXml;\n\n  if (typeof DOMParser === 'undefined') {\n    return originalXml; // Can't patch without DOMParser\n  }\n\n  try {\n    const doc = new DOMParser().parseFromString(originalXml, 'text/xml');\n    const body = doc.getElementsByTagName('w:body')[0];\n    if (!body) return originalXml;\n\n    // Collect all top-level children of body (w:p, w:tbl, etc.)\n    const children: Element[] = [];\n    for (let i = 0; i < body.children.length; i++) {\n      const child = body.children[i];\n      const tag = child.localName || child.tagName.replace(/.*:/, '');\n      if (tag === 'p' || tag === 'tbl') {\n        children.push(child);\n      }\n    }\n\n    // Apply patches\n    const changedMap = new Map(changedParagraphs.map((p) => [p.index, p.xml]));\n    for (let i = 0; i < children.length; i++) {\n      if (changedMap.has(i)) {\n        const newXml = changedMap.get(i)!;\n        const newEl = new DOMParser().parseFromString(newXml, 'text/xml').documentElement;\n        body.replaceChild(newEl, children[i]);\n      }\n    }\n\n    // Serialize back to string\n    const serializer = new XMLSerializer();\n    return serializer.serializeToString(doc);\n  } catch (e) {\n    console.warn('[docx-editor] Selective XML patch failed:', e);\n    return originalXml;\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Rezip — patch files in a .docx ZIP                                         */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Patch specific files in a .docx ZIP archive without rebuilding everything.\n *\n * @param docxBuffer - Original .docx as ArrayBuffer\n * @param patches - Map of { filePath: newContent } (string or ArrayBuffer)\n * @returns New .docx ArrayBuffer with patched files\n */\nexport async function rezipDocx(\n  docxBuffer: ArrayBuffer,\n  patches: Map<string, string | ArrayBuffer>,\n): Promise<ArrayBuffer> {\n  const JSZip = await getJSZip();\n  const zip = await JSZip.loadAsync(docxBuffer);\n\n  for (const [path, content] of patches) {\n    zip.file(path, content);\n  }\n\n  return zip.generateAsync({\n    type: 'arraybuffer',\n    compression: 'DEFLATE',\n    compressionOptions: { level: 6 },\n  });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Full save with selective patching                                          */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Save TipTap JSON to a .docx ArrayBuffer with selective XML patching.\n *\n * If originalBuffer is provided, only changed paragraphs are patched into\n * the original XML — preserving unchanged content byte-for-byte.\n * If originalBuffer is not provided, a full document is generated.\n *\n * @param json - TipTap document JSON\n * @param originalBuffer - Original .docx ArrayBuffer (for selective patching)\n * @param changedBlockIndices - Set of block indices that changed (for selective patching)\n * @param pageDimensions - Page size/margins in twips, from `resolvePageDimensionsTwips()`\n *   (`../page-setup`). Applied to the \"full save\" branch below (replacing\n *   `document.xml`'s `<w:sectPr>`) and to the no-`originalBuffer` fresh-build\n *   branch. Defaults to US Letter when omitted.\n * @returns .docx ArrayBuffer\n */\nexport async function saveDocxSelective(\n  json: any,\n  originalBuffer?: ArrayBuffer,\n  changedBlockIndices?: Set<number>,\n  pageDimensions?: PageDimensionsTwips,\n): Promise<ArrayBuffer> {\n  // No original document to patch into — there's no OOXML skeleton (media\n  // rels, content types, styles, etc.) to embed images into, so build a\n  // fresh .docx with the `docx` library instead. `saveDocxFromJSON`\n  // (io/save.ts) already embeds images properly via `ImageRun`, so this\n  // still produces a valid .docx with images intact.\n  if (!originalBuffer) {\n    const { saveDocxFromJSON } = await import('./save');\n    const blob = await saveDocxFromJSON(json, { pageDimensions });\n    return blob.arrayBuffer();\n  }\n\n  const JSZip = await getJSZip();\n  const zip = await JSZip.loadAsync(originalBuffer);\n\n  // Figure out where to start numbering new relationships/media files so\n  // they never collide with ones already in the original .docx.\n  const { nextRelIdNum, nextMediaNum } = await computeNextImageIds(zip);\n  const imageCollector = new ImageCollector(nextRelIdNum, nextMediaNum);\n\n  // Read the original document's numbering definitions (if any) so lists\n  // resolve to a real numId instead of an assumed one — see `resolveNumId`.\n  const numberingXml = await zip.file('word/numbering.xml')?.async('string');\n  const numberingMap = numberingXml ? parseNumberingXml(numberingXml) : undefined;\n\n  const serializeResult = serializeTipTapToOOXML(json, { changedBlockIndices, imageCollector, numberingMap, pageDimensions });\n\n  // Embed any images collected during serialization: media bytes +\n  // relationship + content-type registration. Must happen before we\n  // generate the zip, and before/regardless of which body-patch strategy\n  // below is used, since both reference the same `r:embed` ids.\n  await applyImageCollectorToZip(zip, imageCollector);\n\n  if (changedBlockIndices && changedBlockIndices.size > 0) {\n    // Selective save: patch only the changed <w:p>/<w:tbl> elements,\n    // preserving everything else in document.xml byte-for-byte.\n    const originalDocXml = await zip.file('word/document.xml')?.async('string');\n    if (originalDocXml) {\n      const patchedXml = patchDocumentXml(originalDocXml, serializeResult.changedParagraphs);\n      zip.file('word/document.xml', patchedXml);\n    }\n  } else {\n    // Full save: replace the entire document.xml body. The root element\n    // declares every namespace prefix used anywhere in the body — including\n    // `wp`/`a`/`pic` for embedded images — since this string is written\n    // directly into the zip (not re-parsed with ambient namespace context).\n    const docXml =\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<w:document' +\n      ' xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"' +\n      ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n      ' xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"' +\n      ' xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"' +\n      ' xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">' +\n      serializeResult.bodyXml +\n      '</w:document>';\n    zip.file('word/document.xml', docXml);\n  }\n\n  return zip.generateAsync({\n    type: 'arraybuffer',\n    compression: 'DEFLATE',\n    compressionOptions: { level: 6 },\n  });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers                                                                     */\n/* -------------------------------------------------------------------------- */\n\nfunction escapeXml(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, '&apos;');\n}\n\n// Highlight color mapping lives in `./ooxml-marks` (see `hexToHighlightName`)\n// — shared with the parser so both directions of the round-trip use the\n// exact same table, instead of this file keeping its own partial copy.\n","/**\n * Theme tokens for the editor. All tokens are CSS custom properties, so users\n * can override them at runtime by setting them on a parent element.\n *\n * The default values match a Word/Google-Docs style page (A4, 1\" margins,\n * 11pt body text). See `page-setup.ts` for the higher-level `PageSetup` API\n * (size presets, custom dimensions, orientation) that resolves into these\n * `pageWidth`/`pageHeight`/`pageMarginX`/`pageMarginY` fields.\n */\nexport interface DocxEditorTheme {\n  /** Page background (the gray area around the page). */\n  background?: string;\n  /** Default text color on the page. */\n  text?: string;\n  /** Accent color for selection, active toolbar button, link underline. */\n  accent?: string;\n  /** Border color for tables, blockquote borders, hr, etc. */\n  border?: string;\n  /** Font family for body text. */\n  fontFamily?: string;\n  /** Font size for body text (any CSS length, e.g. \"11pt\" or \"14px\"). */\n  fontSize?: string;\n  /** Page width (in any CSS length, e.g. \"816px\" or \"21cm\"). */\n  pageWidth?: string;\n  /** Page height (any CSS length). */\n  pageHeight?: string;\n  /** Page horizontal margin (any CSS length, e.g. \"96px\" = 1in). */\n  pageMarginX?: string;\n  /** Page vertical margin. */\n  pageMarginY?: string;\n  /** Gap between pages when multi-page. */\n  pageGap?: string;\n  /** Line height. */\n  lineHeight?: number | string;\n}\n\n/**\n * Font stacks for non-Latin script rendering (Phase 6 multi-language\n * scaffold — see `@shashimadushan/docx-editor-legal-templates`'s\n * `titleSi`/`titleTa`/`labelSi`/`labelTa` fields). Pass one of these as\n * `theme.fontFamily` when displaying/editing a Sinhala or Tamil document —\n * `fontFamily` is a plain CSS custom property, so no editor code change is\n * needed to switch scripts, only a font stack + (if the host page doesn't\n * already load the web font) a `@font-face`/Google Fonts `<link>` for\n * \"Noto Sans Sinhala\" / \"Noto Sans Tamil\".\n */\nexport const SINHALA_FONT_STACK =\n  '\"Noto Sans Sinhala\", \"Iskoola Pota\", \"Nirmala UI\", sans-serif';\nexport const TAMIL_FONT_STACK =\n  '\"Noto Sans Tamil\", \"Latha\", \"Nirmala UI\", sans-serif';\n\nexport const defaultTheme: Required<DocxEditorTheme> = {\n  background: '#f1f5f9',\n  text: '#1f2328',\n  accent: '#2563eb',\n  border: '#d0d7de',\n  fontFamily:\n    '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n  fontSize: '11pt',\n  pageWidth: '794px',\n  pageHeight: '1123px',\n  pageMarginX: '96px',\n  pageMarginY: '96px',\n  pageGap: '24px',\n  lineHeight: 1.5,\n};\n\n/**\n * Convert a theme object into a `style` string of CSS custom properties\n * applied to the editor host element.\n */\nexport function themeToCSSVars(theme: DocxEditorTheme): string {\n  const t = { ...defaultTheme, ...theme };\n  const vars: string[] = [];\n  vars.push(`--de-surface: ${t.background === '#f1f5f9' ? '#fff' : t.background}`);\n  vars.push(`--de-text: ${t.text}`);\n  vars.push(`--de-accent: ${t.accent}`);\n  vars.push(`--de-border-raw: ${t.border}`);\n  vars.push(`--de-font-family: ${t.fontFamily}`);\n  vars.push(`--de-font-size: ${t.fontSize}`);\n  vars.push(`--de-line-height: ${t.lineHeight}`);\n  vars.push(`--de-page-width: ${t.pageWidth}`);\n  vars.push(`--de-page-height: ${t.pageHeight}`);\n  vars.push(`--de-page-margin-x: ${t.pageMarginX}`);\n  vars.push(`--de-page-margin-y: ${t.pageMarginY}`);\n  vars.push(`--de-page-gap: ${t.pageGap}`);\n  return vars.join('; ');\n}\n\n/**\n * Convert a CSS length (as accepted by `DocxEditorTheme.pageWidth`/\n * `pageHeight` — px, in, cm, mm, pt, pc, or a bare number treated as px)\n * into inches, for contexts that need a plain number: `@page { size: ... }`\n * can't reliably read CSS custom properties, so `DocxEditor.printToPdf()`\n * needs the page size as a literal `Nin` value instead of `var(...)`.\n */\nexport function cssLengthToInches(value: string | number): number {\n  if (typeof value === 'number') return value / 96;\n  const match = /^\\s*([\\d.]+)\\s*(px|in|cm|mm|q|pt|pc)?\\s*$/i.exec(value);\n  if (!match) return 8.5; // fallback: US Letter width\n  const num = parseFloat(match[1]);\n  const unit = (match[2] ?? 'px').toLowerCase();\n  switch (unit) {\n    case 'in':\n      return num;\n    case 'cm':\n      return num / 2.54;\n    case 'mm':\n      return num / 25.4;\n    case 'q':\n      return num / 101.6;\n    case 'pt':\n      return num / 72;\n    case 'pc':\n      return num / 6;\n    case 'px':\n    default:\n      return num / 96;\n  }\n}\n","/**\n * Builds a complete, minimal .docx package around body XML produced by\n * `serializeTipTapToOOXML`.\n *\n * Why this exists: saving a document that was *opened* from a .docx patches\n * the original package, so it keeps that file's `styles.xml`, `numbering.xml`\n * and theme. A document created in the editor has no original package, and\n * the old fallback rebuilt it with the `docx` library — which writes its own\n * defaults (Calibri 11pt body, Word's blue Calibri Light headings, no\n * numbering definitions, no notion of the editor's theme). The exported file\n * therefore looked nothing like what was on screen.\n *\n * The fix is the approach every OOXML-first editor takes (ONLYOFFICE,\n * SuperDoc, docx4js and friends): emit the document part *and* the style\n * parts yourself, generating `styles.xml` from the same typography the editor\n * renders with, so \"what you see\" and \"what Word opens\" are driven by one\n * source of truth. Word resolves formatting through `docDefaults` → named\n * style → direct formatting; the serializer already emits direct formatting\n * for anything the user explicitly set, so this file only has to make the\n * *defaults* match the editor's stylesheet.\n */\n\nimport { ImageCollector } from './ooxml-serializer';\nimport { defaultTheme, type DocxEditorTheme } from '../theme';\nimport type { CommentThread } from '../comments-types';\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\nconst W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';\nconst R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\n\nexport interface FreshDocxPackageOptions {\n  /** `<w:body>…</w:body>` from `serializeTipTapToOOXML`. */\n  bodyXml: string;\n  /** Images/hyperlinks collected while serializing that body. */\n  collector?: ImageCollector;\n  /** The live editor theme — drives `styles.xml`'s document defaults. */\n  theme?: DocxEditorTheme;\n  title?: string;\n  creator?: string;\n  /** Comment threads to write to word/comments.xml. Only the ids referenced\n   *  by `bodyXml`'s w:commentReference runs matter; extras are harmless. */\n  commentThreads?: CommentThread[];\n  /** Header/footer HTML (plain paragraphs, v1 — see `bodyXml`'s own\n   *  `hasHeader`/`hasFooter` reference in `serializeTipTapToOOXML`). */\n  headerHTML?: string;\n  footerHTML?: string;\n}\n\n/** Build a `.docx` (as an ArrayBuffer) from serialized body XML. */\nexport async function buildFreshDocxPackage(options: FreshDocxPackageOptions): Promise<ArrayBuffer> {\n  const { bodyXml, collector, theme, title, creator, commentThreads, headerHTML, footerHTML } = options;\n  const JSZip = (await import('jszip')).default;\n  const zip = new JSZip();\n  const images = collector?.images ?? [];\n  const links = collector?.links ?? [];\n  const hasComments = !!commentThreads?.length;\n  const hasHeader = !!headerHTML;\n  const hasFooter = !!footerHTML;\n\n  zip.file(\n    '[Content_Types].xml',\n    contentTypesXml(images.map((i) => ({ ext: extOf(i.fileName), type: i.contentType })), hasComments, hasHeader, hasFooter),\n  );\n  zip.file('_rels/.rels', rootRelsXml());\n  zip.file('docProps/core.xml', coreXml(title, creator));\n  zip.file('docProps/app.xml', appXml());\n  zip.file('word/document.xml', documentXml(bodyXml));\n  zip.file('word/_rels/document.xml.rels', documentRelsXml(images, links, hasComments, hasHeader, hasFooter));\n  zip.file('word/styles.xml', stylesXml(theme));\n  zip.file('word/numbering.xml', numberingXml());\n  if (hasComments) zip.file('word/comments.xml', commentsXml(commentThreads!));\n  if (hasHeader) zip.file('word/header1.xml', headerFooterXml('hdr', headerHTML!));\n  if (hasFooter) zip.file('word/footer1.xml', headerFooterXml('ftr', footerHTML!));\n  for (const img of images) zip.file(`word/media/${img.fileName}`, img.bytes);\n\n  return zip.generateAsync({ type: 'arraybuffer', compression: 'DEFLATE', compressionOptions: { level: 6 } });\n}\n\nfunction extOf(fileName: string): string {\n  return fileName.split('.').pop() ?? 'png';\n}\n\nfunction documentXml(bodyXml: string): string {\n  // Every namespace prefix the serializer can emit is declared here, since\n  // this string is written straight into the zip with no ambient context.\n  return (\n    XML_DECL +\n    `<w:document xmlns:w=\"${W_NS}\" xmlns:r=\"${R_NS}\"` +\n    ' xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"' +\n    ' xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"' +\n    ' xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">' +\n    bodyXml +\n    '</w:document>'\n  );\n}\n\nfunction contentTypesXml(\n  imageTypes: { ext: string; type: string }[],\n  hasComments = false,\n  hasHeader = false,\n  hasFooter = false,\n): string {\n  const seen = new Set<string>();\n  const defaults = imageTypes\n    .filter((t) => (seen.has(t.ext) ? false : (seen.add(t.ext), true)))\n    .map((t) => `<Default Extension=\"${t.ext}\" ContentType=\"${t.type}\"/>`)\n    .join('');\n  const commentsOverride = hasComments\n    ? '<Override PartName=\"/word/comments.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\"/>'\n    : '';\n  const headerOverride = hasHeader\n    ? '<Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>'\n    : '';\n  const footerOverride = hasFooter\n    ? '<Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>'\n    : '';\n  return (\n    XML_DECL +\n    '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n    '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n    '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n    defaults +\n    '<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>' +\n    '<Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>' +\n    '<Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>' +\n    commentsOverride +\n    headerOverride +\n    footerOverride +\n    '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n    '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>' +\n    '</Types>'\n  );\n}\n\nfunction rootRelsXml(): string {\n  return (\n    XML_DECL +\n    '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n    `<Relationship Id=\"rIdDoc\" Type=\"${R_NS}/officeDocument\" Target=\"word/document.xml\"/>` +\n    '<Relationship Id=\"rIdCore\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n    `<Relationship Id=\"rIdApp\" Type=\"${R_NS}/extended-properties\" Target=\"docProps/app.xml\"/>` +\n    '</Relationships>'\n  );\n}\n\nfunction documentRelsXml(\n  images: { relId: string; fileName: string }[],\n  links: { relId: string; href: string }[],\n  hasComments = false,\n  hasHeader = false,\n  hasFooter = false,\n): string {\n  // Style/numbering rel ids are prefixed so they can never collide with the\n  // numeric `rIdN` ids the collector hands out for images and hyperlinks.\n  const commentsRel = hasComments ? `<Relationship Id=\"rIdComments\" Type=\"${R_NS}/comments\" Target=\"comments.xml\"/>` : '';\n  // Fixed ids — must match the `rIdHeader`/`rIdFooter` sectPr references\n  // `serializeTipTapToOOXML` emits when `hasHeader`/`hasFooter` is set.\n  const headerRel = hasHeader ? `<Relationship Id=\"rIdHeader\" Type=\"${R_NS}/header\" Target=\"header1.xml\"/>` : '';\n  const footerRel = hasFooter ? `<Relationship Id=\"rIdFooter\" Type=\"${R_NS}/footer\" Target=\"footer1.xml\"/>` : '';\n  return (\n    XML_DECL +\n    '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n    `<Relationship Id=\"rIdStyles\" Type=\"${R_NS}/styles\" Target=\"styles.xml\"/>` +\n    `<Relationship Id=\"rIdNumbering\" Type=\"${R_NS}/numbering\" Target=\"numbering.xml\"/>` +\n    commentsRel +\n    headerRel +\n    footerRel +\n    images.map((i) => `<Relationship Id=\"${i.relId}\" Type=\"${R_NS}/image\" Target=\"media/${i.fileName}\"/>`).join('') +\n    links\n      .map(\n        (l) =>\n          `<Relationship Id=\"${l.relId}\" Type=\"${R_NS}/hyperlink\" Target=\"${escapeXml(l.href)}\" TargetMode=\"External\"/>`,\n      )\n      .join('') +\n    '</Relationships>'\n  );\n}\n\nfunction coreXml(title?: string, creator?: string): string {\n  const now = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');\n  return (\n    XML_DECL +\n    '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"' +\n    ' xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\"' +\n    ' xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n    `<dc:title>${escapeXml(title ?? 'Untitled')}</dc:title>` +\n    `<dc:creator>${escapeXml(creator ?? 'docx-editor')}</dc:creator>` +\n    `<cp:lastModifiedBy>${escapeXml(creator ?? 'docx-editor')}</cp:lastModifiedBy>` +\n    `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>` +\n    `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>` +\n    '</cp:coreProperties>'\n  );\n}\n\nfunction appXml(): string {\n  return (\n    XML_DECL +\n    '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\"' +\n    ' xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n    '<Application>docx-editor</Application>' +\n    '</Properties>'\n  );\n}\n\n/* -------------------------------------------------------------------------- */\n/* styles.xml — generated from the editor's own typography                     */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Heading sizes/treatment, transcribed from\n * `src/styles/editor-surface/paged-paper.css`. Keep the two in sync: these\n * are what makes an exported heading look like the heading on screen instead\n * of Word's built-in blue Calibri Light.\n */\nconst HEADINGS: { level: number; pt: number; italic?: boolean; color?: string }[] = [\n  { level: 1, pt: 24 },\n  { level: 2, pt: 18 },\n  { level: 3, pt: 14 },\n  { level: 4, pt: 12 },\n  { level: 5, pt: 11, italic: true },\n  { level: 6, pt: 11, color: '57606A' },\n];\n\nconst HEADING_TEXT_COLOR = '1F2328'; // .docx-editor-content h1..h6 { color: #1f2328 }\nconst HEADING_LINE_HEIGHT = 1.25; // …and { line-height: 1.25 }\n\nfunction stylesXml(theme?: DocxEditorTheme): string {\n  const t = { ...defaultTheme, ...theme };\n  const font = escapeXml(resolveDocxFontFamily(String(t.fontFamily)));\n  const bodyPt = cssLengthToPoints(String(t.fontSize), 11);\n  const bodyHalfPt = Math.round(bodyPt * 2);\n  const lineHeight = typeof t.lineHeight === 'number' ? t.lineHeight : parseFloat(String(t.lineHeight)) || 1.5;\n  const line = Math.round(lineHeight * 240);\n  // `p { margin: 0 0 0.6em }` in the editor's stylesheet → space after each\n  // paragraph, in twips (1pt = 20 twips).\n  const afterTwips = Math.round(bodyPt * 0.6 * 20);\n\n  const headingStyles = HEADINGS.map(({ level, pt, italic, color }) => {\n    const beforeTwips = Math.round(pt * 20); // h* { margin-top: 1em }\n    const headingAfter = Math.round(pt * 0.4 * 20); // …{ margin-bottom: 0.4em }\n    return (\n      `<w:style w:type=\"paragraph\" w:styleId=\"Heading${level}\">` +\n      `<w:name w:val=\"heading ${level}\"/><w:basedOn w:val=\"Normal\"/><w:next w:val=\"Normal\"/><w:qFormat/>` +\n      '<w:pPr>' +\n      `<w:keepNext/><w:outlineLvl w:val=\"${level - 1}\"/>` +\n      `<w:spacing w:before=\"${beforeTwips}\" w:after=\"${headingAfter}\" w:line=\"${Math.round(HEADING_LINE_HEIGHT * 240)}\" w:lineRule=\"auto\"/>` +\n      '</w:pPr>' +\n      '<w:rPr>' +\n      `<w:rFonts w:ascii=\"${font}\" w:hAnsi=\"${font}\" w:cs=\"${font}\"/>` +\n      '<w:b/><w:bCs/>' +\n      (italic ? '<w:i/><w:iCs/>' : '') +\n      `<w:color w:val=\"${color ?? HEADING_TEXT_COLOR}\"/>` +\n      `<w:sz w:val=\"${pt * 2}\"/><w:szCs w:val=\"${pt * 2}\"/>` +\n      '</w:rPr>' +\n      '</w:style>'\n    );\n  }).join('');\n\n  return (\n    XML_DECL +\n    `<w:styles xmlns:w=\"${W_NS}\">` +\n    // docDefaults is the root of Word's formatting cascade — setting the\n    // editor's font/size/line-height here is what makes an untouched\n    // paragraph open in Word looking the way it did on screen.\n    '<w:docDefaults>' +\n    '<w:rPrDefault><w:rPr>' +\n    `<w:rFonts w:ascii=\"${font}\" w:hAnsi=\"${font}\" w:eastAsia=\"${font}\" w:cs=\"${font}\"/>` +\n    `<w:sz w:val=\"${bodyHalfPt}\"/><w:szCs w:val=\"${bodyHalfPt}\"/>` +\n    `<w:color w:val=\"${String(t.text).replace('#', '').toUpperCase()}\"/>` +\n    '</w:rPr></w:rPrDefault>' +\n    '<w:pPrDefault><w:pPr>' +\n    `<w:spacing w:after=\"${afterTwips}\" w:line=\"${line}\" w:lineRule=\"auto\"/>` +\n    '</w:pPr></w:pPrDefault>' +\n    '</w:docDefaults>' +\n    '<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>' +\n    '<w:style w:type=\"character\" w:default=\"1\" w:styleId=\"DefaultParagraphFont\"><w:name w:val=\"Default Paragraph Font\"/></w:style>' +\n    headingStyles +\n    // Quote: the editor draws blockquotes indented + italic.\n    '<w:style w:type=\"paragraph\" w:styleId=\"Quote\">' +\n    '<w:name w:val=\"Quote\"/><w:basedOn w:val=\"Normal\"/><w:qFormat/>' +\n    '<w:pPr><w:ind w:left=\"720\"/></w:pPr><w:rPr><w:i/><w:iCs/></w:rPr>' +\n    '</w:style>' +\n    // Code: monospace, one step down, matching the editor's code block.\n    '<w:style w:type=\"paragraph\" w:styleId=\"Code\">' +\n    '<w:name w:val=\"Code\"/><w:basedOn w:val=\"Normal\"/>' +\n    '<w:pPr><w:spacing w:after=\"100\" w:line=\"240\" w:lineRule=\"auto\"/></w:pPr>' +\n    '<w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\"/><w:sz w:val=\"20\"/><w:szCs w:val=\"20\"/></w:rPr>' +\n    '</w:style>' +\n    // ListParagraph: what Word tags list items with. `contextualSpacing`\n    // suppresses the paragraph gap *between* items, like the editor's `li`.\n    '<w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\">' +\n    '<w:name w:val=\"List Paragraph\"/><w:basedOn w:val=\"Normal\"/><w:qFormat/>' +\n    '<w:pPr><w:ind w:left=\"720\"/><w:contextualSpacing/></w:pPr>' +\n    '</w:style>' +\n    '<w:style w:type=\"character\" w:styleId=\"Hyperlink\">' +\n    '<w:name w:val=\"Hyperlink\"/><w:rPr><w:color w:val=\"0563C1\"/><w:u w:val=\"single\"/></w:rPr>' +\n    '</w:style>' +\n    '</w:styles>'\n  );\n}\n\n/* -------------------------------------------------------------------------- */\n/* numbering.xml                                                               */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Bullet (`numId` 1) and decimal (`numId` 2) definitions, 9 levels each —\n * matching the ids `resolveNumId()` falls back to when there's no original\n * document to read numbering from.\n *\n * Without this part, list paragraphs reference a `w:numId` that doesn't\n * resolve and Word renders them as plain indented text with no bullets or\n * numbers at all. (The `docx`-library path sidestepped that by baking a\n * literal \"• \" / \"1. \" into the run text — which looks approximately right\n * but isn't a list: it never renumbers, and the marker is selectable text.)\n */\n/** word/comments.xml — one <w:comment> per thread, first message only (v1). */\nfunction commentsXml(threads: CommentThread[]): string {\n  const items = threads\n    .map((t) => {\n      const first = t.messages[0];\n      const author = escapeXml(first?.author ?? 'Unknown');\n      const date = first?.createdAt ?? t.createdAt;\n      const text = escapeXml(first?.body ?? '');\n      return (\n        `<w:comment w:id=\"${escapeXml(t.id)}\" w:author=\"${author}\" w:date=\"${date}\">` +\n        `<w:p><w:r><w:t xml:space=\"preserve\">${text}</w:t></w:r></w:p></w:comment>`\n      );\n    })\n    .join('');\n  return `${XML_DECL}<w:comments xmlns:w=\"${W_NS}\">${items}</w:comments>`;\n}\n\n/** word/header1.xml or word/footer1.xml — plain-text paragraphs (v1). */\nfunction headerFooterXml(tag: 'hdr' | 'ftr', html: string): string {\n  const root = tag === 'hdr' ? 'hdr' : 'ftr';\n  const paras = Array.from(html.matchAll(/<p[^>]*>([\\s\\S]*?)<\\/p>/g)).map(\n    (m) => `<w:p><w:r><w:t xml:space=\"preserve\">${escapeXml(stripTags(m[1]))}</w:t></w:r></w:p>`,\n  );\n  return `${XML_DECL}<w:${root} xmlns:w=\"${W_NS}\">${paras.join('') || '<w:p/>'}</w:${root}>`;\n}\n\nfunction stripTags(html: string): string {\n  return html.replace(/<[^>]+>/g, '');\n}\n\nfunction numberingXml(): string {\n  // Symbol/Wingdings bullet glyphs live in the PUA — the same code points\n  // Word itself writes for its default bullet list.\n  const bulletChars = ['\\uF0B7', 'o', '\\uF0A7'];\n  const bulletFonts = ['Symbol', 'Courier New', 'Wingdings'];\n\n  const bulletLevels = Array.from({ length: 9 }, (_, i) => {\n    const indent = 720 * (i + 1);\n    return (\n      `<w:lvl w:ilvl=\"${i}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/>` +\n      `<w:lvlText w:val=\"${escapeXml(bulletChars[i % 3])}\"/><w:lvlJc w:val=\"left\"/>` +\n      `<w:pPr><w:ind w:left=\"${indent}\" w:hanging=\"360\"/></w:pPr>` +\n      `<w:rPr><w:rFonts w:ascii=\"${bulletFonts[i % 3]}\" w:hAnsi=\"${bulletFonts[i % 3]}\" w:hint=\"default\"/></w:rPr></w:lvl>`\n    );\n  }).join('');\n\n  // Word's own default cycle for ordered lists: 1. / a. / i. repeating.\n  const decimalFormats = ['decimal', 'lowerLetter', 'lowerRoman'];\n  const decimalLevels = Array.from({ length: 9 }, (_, i) => {\n    const indent = 720 * (i + 1);\n    return (\n      `<w:lvl w:ilvl=\"${i}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"${decimalFormats[i % 3]}\"/>` +\n      `<w:lvlText w:val=\"%${i + 1}.\"/><w:lvlJc w:val=\"left\"/>` +\n      `<w:pPr><w:ind w:left=\"${indent}\" w:hanging=\"360\"/></w:pPr></w:lvl>`\n    );\n  }).join('');\n\n  return (\n    XML_DECL +\n    `<w:numbering xmlns:w=\"${W_NS}\">` +\n    `<w:abstractNum w:abstractNumId=\"0\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${bulletLevels}</w:abstractNum>` +\n    `<w:abstractNum w:abstractNumId=\"1\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${decimalLevels}</w:abstractNum>` +\n    '<w:num w:numId=\"1\"><w:abstractNumId w:val=\"0\"/></w:num>' +\n    '<w:num w:numId=\"2\"><w:abstractNumId w:val=\"1\"/></w:num>' +\n    '</w:numbering>'\n  );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers                                                                     */\n/* -------------------------------------------------------------------------- */\n\n/** CSS keywords that name \"whatever the OS uses\" rather than a real font\n *  file — meaningless as an OOXML `w:ascii` value, so they're skipped. */\nconst SYSTEM_FONT_KEYWORDS = new Set(['system-ui', 'ui-sans-serif', 'ui-serif', 'ui-monospace', 'blinkmacsystemfont']);\nconst GENERIC_FONT_FALLBACKS: Record<string, string> = {\n  'sans-serif': 'Arial',\n  serif: 'Times New Roman',\n  monospace: 'Courier New',\n  cursive: 'Comic Sans MS',\n  fantasy: 'Impact',\n};\n\n/**\n * Pick a real font name out of a CSS font stack for OOXML.\n *\n * The default theme stack starts with `-apple-system, BlinkMacSystemFont` —\n * naming either of those in `w:rFonts` gives Word a font it can't resolve, so\n * it silently substitutes something arbitrary. Walk the stack for the first\n * entry that names an actual typeface, and map a trailing generic family to\n * its usual Word equivalent if that's all there is.\n */\nexport function resolveDocxFontFamily(stack: string): string {\n  const entries = stack.split(',').map((e) => e.trim().replace(/^['\"]|['\"]$/g, ''));\n  for (const entry of entries) {\n    if (!entry) continue;\n    const lower = entry.toLowerCase();\n    if (entry.startsWith('-') || SYSTEM_FONT_KEYWORDS.has(lower)) continue;\n    if (GENERIC_FONT_FALLBACKS[lower]) continue;\n    return entry;\n  }\n  for (const entry of entries) {\n    const mapped = GENERIC_FONT_FALLBACKS[entry.trim().toLowerCase()];\n    if (mapped) return mapped;\n  }\n  return 'Calibri';\n}\n\n/** CSS length → points (OOXML's typographic unit). */\nexport function cssLengthToPoints(value: string, fallbackPt: number): number {\n  const match = /^\\s*([\\d.]+)\\s*(px|pt|in|cm|mm|pc|em|rem)?\\s*$/i.exec(value);\n  if (!match) return fallbackPt;\n  const num = parseFloat(match[1]);\n  if (isNaN(num) || num <= 0) return fallbackPt;\n  switch ((match[2] ?? 'px').toLowerCase()) {\n    case 'pt':\n      return num;\n    case 'in':\n      return num * 72;\n    case 'cm':\n      return num * 28.3465;\n    case 'mm':\n      return num * 2.83465;\n    case 'pc':\n      return num * 12;\n    case 'em':\n    case 'rem':\n      return num * fallbackPt;\n    default:\n      return num * 0.75; // px → pt at 96 DPI\n  }\n}\n\nfunction escapeXml(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, '&apos;');\n}\n","import { serializeTipTapToOOXML, ImageCollector } from './ooxml-serializer';\nimport { buildFreshDocxPackage } from './docx-package';\nimport type { PageDimensionsTwips } from '../page-setup';\nimport type { DocxEditorTheme } from '../theme';\nimport type { CommentThread } from '../comments-types';\n\n/**\n * Convert a TipTap JSON document (the format produced by `editor.getJSON()`)\n * into a .docx Blob, ready to download or save.\n *\n * This is the \"no original file to patch\" path — a document created in the\n * editor rather than opened from disk. It runs the *same* OOXML serializer\n * the selective-save path uses (`serializeTipTapToOOXML`) and wraps the result\n * in a generated package (`./docx-package`) whose `styles.xml` is derived from\n * the editor's own theme/stylesheet.\n *\n * It used to rebuild the document with the `docx` library instead, which is\n * why an exported file never matched the screen: that path had no access to\n * the editor's typography (so Word applied its own Calibri/Heading defaults),\n * dropped `fontFamily`, letter spacing, indentation and per-paragraph line\n * height, wrote lists as literal \"• \"/\"1. \" text rather than real numbering,\n * and emitted headings as Word's built-in blue heading styles. Routing both\n * save paths through one serializer means a given document exports the same\n * way whether or not it happens to have an original .docx behind it.\n *\n * Supported node types: doc, paragraph, heading, bulletList/orderedList\n * (incl. nesting), listItem, codeBlock, blockquote, horizontalRule,\n * pageBreak, table (widths/merges/shading/borders), image.\n *\n * Supported marks: bold, italic, underline, strike, superscript, subscript,\n * link (as a real external relationship), textStyle (color, fontSize,\n * fontFamily, letterSpacing, backgroundColor), textTransform (uppercase),\n * highlight.\n */\nexport interface SaveDocxOptions {\n  /** Document title (used in core properties). */\n  title?: string;\n  /** Author name (used in core properties). */\n  creator?: string;\n  /**\n   * Page size/margins in twips, from `resolvePageDimensionsTwips()`\n   * (`../page-setup`). Falls back to US Letter with 1in margins when omitted.\n   */\n  pageDimensions?: PageDimensionsTwips;\n  /**\n   * The editor's resolved theme. Drives the generated `styles.xml` document\n   * defaults (font family/size, text color, line height) so the exported file\n   * opens with the typography the document was edited in. Falls back to\n   * `defaultTheme` when omitted.\n   */\n  theme?: DocxEditorTheme;\n  /** Comment threads to write to word/comments.xml, matched to `comment`\n   *  marks in `json` by id. From a `CommentsStorageAdapter.list()` call. */\n  commentThreads?: CommentThread[];\n  /** Header/footer content as HTML paragraphs (plain text, v1) — from\n   *  `DocxEditor.getHeaderHTML()`/`getFooterHTML()`. */\n  headerHTML?: string;\n  footerHTML?: string;\n}\n\nexport async function saveDocxFromJSON(json: any, options: SaveDocxOptions = {}): Promise<Blob> {\n  // A fresh package starts with no relationships of its own, so image and\n  // hyperlink ids can safely begin at 1.\n  const collector = new ImageCollector();\n  const { bodyXml } = serializeTipTapToOOXML(json, {\n    imageCollector: collector,\n    pageDimensions: options.pageDimensions,\n    hasHeader: !!options.headerHTML,\n    hasFooter: !!options.footerHTML,\n  });\n\n  const buffer = await buildFreshDocxPackage({\n    bodyXml,\n    collector,\n    theme: options.theme,\n    title: options.title,\n    creator: options.creator,\n    commentThreads: options.commentThreads,\n    headerHTML: options.headerHTML,\n    footerHTML: options.footerHTML,\n  });\n\n  return new Blob([buffer], {\n    type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  });\n}\n","import type { DocxEditorExtension } from './types';\n\n/**\n * ExtensionRegistry holds all registered DocxEditorExtensions.\n *\n * - Order of registration is preserved (insertion order).\n * - Duplicate ids are rejected (throws).\n * - Extensions are immutable once registered (cannot be removed in v0.1;\n *   we may add removal in a future version).\n */\nexport class ExtensionRegistry {\n  private readonly _extensions = new Map<string, DocxEditorExtension>();\n  private readonly _order: string[] = [];\n\n  register(ext: DocxEditorExtension): void {\n    if (this._extensions.has(ext.id)) {\n      throw new Error(\n        `[docx-editor] Extension with id \"${ext.id}\" is already registered. ` +\n          `Each extension must have a unique id.`,\n      );\n    }\n    this._extensions.set(ext.id, ext);\n    this._order.push(ext.id);\n  }\n\n  has(id: string): boolean {\n    return this._extensions.has(id);\n  }\n\n  get(id: string): DocxEditorExtension | undefined {\n    return this._extensions.get(id);\n  }\n\n  /** Returns all registered extensions in registration order. */\n  list(): DocxEditorExtension[] {\n    return this._order.map((id) => this._extensions.get(id)!);\n  }\n\n  /** Returns the total number of registered extensions. */\n  get size(): number {\n    return this._extensions.size;\n  }\n}\n","/**\n * Table enhancements — extra attributes layered on top of TipTap's stock\n * `Table` / `TableRow` / `TableCell` / `TableHeader` nodes so the table\n * context menu (see `react/context-menu/TableContextMenu.tsx`) can offer Word/Google\n * Docs-style features that aren't built into `@tiptap/extension-table`:\n *\n *  - Table-level: a named style preset (`tableStyleId`), a border preset\n *    (`borderStyle`), alignment (`tableAlign`), and an explicit width\n *    (`tableWidth`).\n *  - Row-level: an explicit height (`rowHeight`), set by dragging the\n *    row-resize handles added in `table-interactions.ts`.\n *  - Cell-level: a background fill color (`backgroundColor`).\n *\n * What's already built into TipTap/prosemirror-tables and NOT reimplemented\n * here: column resizing (`resizable: true`, already configured in\n * tiptap-defaults.ts — prosemirror-tables' `columnResizing` plugin), cell\n * drag-selection (`tableEditing()` plugin, bundled inside the `Table`\n * extension), and merge/split of previously-merged cells (`mergeCells` /\n * `splitCell` commands). Row resizing and insert-row/column hover buttons\n * are NOT available in prosemirror-tables, so those are added as a small\n * imperative DOM layer in `table-interactions.ts`, the same pattern already\n * used for image resize handles.\n */\nimport Table from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport type { Editor } from '@tiptap/core';\n\n/** Curated table style presets (Word/Google-Docs \"table style gallery\"\n * equivalent). Each preset is a CSS hook (`data-table-style=\"<id>\"`) — see\n * the `[data-table-style]` rules in `editor.css`. Cell/table attributes set\n * afterward (custom colors, borders) always win because inline styles beat\n * class/attribute-selector CSS. */\nexport const TABLE_STYLE_PRESETS: Array<{ id: string; label: string }> = [\n  { id: 'default', label: 'Default' },\n  { id: 'plain', label: 'Plain' },\n  { id: 'light-shading', label: 'Light shading' },\n  { id: 'light-shading-accent', label: 'Light shading (green)' },\n  { id: 'medium-grid', label: 'Medium grid' },\n  { id: 'grid-light', label: 'Grid, light' },\n  { id: 'list-table', label: 'List table' },\n  { id: 'colorful-grid', label: 'Colorful grid' },\n];\n\n/** Border presets — mirrors Word's \"Borders\" gallery (All / Outside /\n * Inside / one edge / None). Rendered via `data-border-style=\"<id>\"`. */\nexport const TABLE_BORDER_PRESETS: Array<{ id: string; label: string }> = [\n  { id: 'all', label: 'All borders' },\n  { id: 'outside', label: 'Outside borders' },\n  { id: 'inside', label: 'Inside borders' },\n  { id: 'top', label: 'Top border' },\n  { id: 'bottom', label: 'Bottom border' },\n  { id: 'left', label: 'Left border' },\n  { id: 'right', label: 'Right border' },\n  { id: 'none', label: 'No borders' },\n];\n\nexport const EnhancedTable = Table.extend({\n  addAttributes() {\n    return {\n      ...this.parent?.(),\n      tableStyleId: {\n        default: null,\n        parseHTML: (element) => element.getAttribute('data-table-style'),\n        renderHTML: (attributes) =>\n          attributes.tableStyleId ? { 'data-table-style': attributes.tableStyleId } : {},\n      },\n      borderStyle: {\n        default: null,\n        parseHTML: (element) => element.getAttribute('data-border-style'),\n        renderHTML: (attributes) =>\n          attributes.borderStyle ? { 'data-border-style': attributes.borderStyle } : {},\n      },\n      tableAlign: {\n        default: null,\n        parseHTML: (element) => element.getAttribute('data-table-align'),\n        renderHTML: (attributes) =>\n          attributes.tableAlign ? { 'data-table-align': attributes.tableAlign } : {},\n      },\n      tableWidth: {\n        default: null,\n        parseHTML: (element) => element.style.width || null,\n        renderHTML: (attributes) =>\n          attributes.tableWidth ? { style: `width: ${attributes.tableWidth}` } : {},\n      },\n    };\n  },\n});\n\nexport const EnhancedTableRow = TableRow.extend({\n  addAttributes() {\n    return {\n      ...this.parent?.(),\n      rowHeight: {\n        default: null,\n        parseHTML: (element) => element.style.height || null,\n        renderHTML: (attributes) =>\n          attributes.rowHeight ? { style: `height: ${attributes.rowHeight}` } : {},\n      },\n    };\n  },\n});\n\nexport const EnhancedTableCell = TableCell.extend({\n  addAttributes() {\n    return {\n      ...this.parent?.(),\n      backgroundColor: {\n        default: null,\n        parseHTML: (element) => element.style.backgroundColor || null,\n        renderHTML: (attributes) =>\n          attributes.backgroundColor ? { style: `background-color: ${attributes.backgroundColor}` } : {},\n      },\n    };\n  },\n});\n\nexport const EnhancedTableHeader = TableHeader.extend({\n  addAttributes() {\n    return {\n      ...this.parent?.(),\n      backgroundColor: {\n        default: null,\n        parseHTML: (element) => element.style.backgroundColor || null,\n        renderHTML: (attributes) =>\n          attributes.backgroundColor ? { style: `background-color: ${attributes.backgroundColor}` } : {},\n      },\n    };\n  },\n});\n\n/* ====================================================================== */\n/* insertTableFitted — insert a table sized to the page, not to           */\n/* prosemirror-tables' cramped 25px-per-column default                    */\n/* ====================================================================== */\n\n/** Minimum column width (px) — a safety floor so very wide tables don't\n * collapse columns to nothing, not an attempt to keep every table narrow. */\nconst MIN_COLUMN_WIDTH = 40;\n/** Fallback content width (px) used only if the page DOM can't be measured\n * (e.g. server-side/headless use) — matches the default theme's 8.5in page\n * with 1in margins. */\nconst FALLBACK_CONTENT_WIDTH = 624;\n\n/**\n * Measure the actual usable width of the page's content area (page width\n * minus its left/right margins), reading real computed styles so it's\n * correct for any theme (custom page size, custom margins, non-px units).\n */\nexport function getAvailableContentWidth(ed: Editor): number {\n  try {\n    const dom = ed.view.dom as HTMLElement;\n    const contentEl = dom.closest('.docx-editor-content') as HTMLElement | null;\n    if (!contentEl || typeof getComputedStyle !== 'function') return FALLBACK_CONTENT_WIDTH;\n    const styles = getComputedStyle(contentEl);\n    const paddingLeft = parseFloat(styles.paddingLeft) || 0;\n    const paddingRight = parseFloat(styles.paddingRight) || 0;\n    const width = contentEl.clientWidth - paddingLeft - paddingRight;\n    return width > 0 ? width : FALLBACK_CONTENT_WIDTH;\n  } catch {\n    return FALLBACK_CONTENT_WIDTH;\n  }\n}\n\n/**\n * Column width (px) that divides the page's actual content width evenly\n * across `cols` columns, floored at `MIN_COLUMN_WIDTH`. Exported so any code\n * path that builds table JSON directly (bypassing the `insertTable` command\n * — e.g. `@shashimadushan/docx-editor-agent`'s `insert_table` tool, which needs to insert\n * at an arbitrary block index rather than at the cursor) can set the same\n * `colwidth` up front instead of rendering at prosemirror-tables' cramped\n * ~25px-per-column default and looking inconsistent with tables inserted\n * from the toolbar.\n */\nexport function computeEvenColumnWidth(ed: Editor, cols: number): number {\n  const availableWidth = getAvailableContentWidth(ed);\n  return Math.max(MIN_COLUMN_WIDTH, Math.floor(availableWidth / Math.max(1, cols)));\n}\n\n/**\n * Set every column in the table at the current selection to an equal,\n * explicit width (via the `colwidth` attribute prosemirror-tables already\n * understands — it only reads this from the FIRST row's cells).\n */\nfunction applyEvenColumnWidths(ed: Editor, colWidth: number): void {\n  const { $from } = ed.state.selection;\n  let tableDepth = -1;\n  for (let d = $from.depth; d >= 0; d--) {\n    if ($from.node(d).type.name === 'table') {\n      tableDepth = d;\n      break;\n    }\n  }\n  if (tableDepth < 0) return;\n\n  const tableNode = $from.node(tableDepth);\n  const firstRow = tableNode.firstChild;\n  if (!firstRow) return;\n\n  const tablePos = $from.before(tableDepth);\n  const rowContentStart = tablePos + 2; // +1 enters the table, +1 enters the first row\n  const tr = ed.state.tr;\n  firstRow.forEach((cellNode, offsetInRow) => {\n    const cellPos = rowContentStart + offsetInRow;\n    const colspan = (cellNode.attrs.colspan as number) || 1;\n    tr.setNodeMarkup(cellPos, undefined, {\n      ...cellNode.attrs,\n      colwidth: new Array(colspan).fill(colWidth),\n    });\n  });\n  ed.view.dispatch(tr);\n}\n\n/**\n * Insert a table sized like Word/Google Docs would: its columns are set to\n * divide the page's actual content width evenly, so a freshly-inserted\n * table fills the page edge-to-edge (matching the surrounding text margins)\n * instead of rendering at prosemirror-tables' default ~25px-per-column\n * (cramped/squished look). Replaces plain `editor.chain().insertTable(...)`\n * at every call site that offers \"insert table\" in the UI.\n */\nexport function insertTableFitted(\n  ed: Editor,\n  options: { rows?: number; cols?: number; withHeaderRow?: boolean } = {},\n): boolean {\n  const cols = Math.max(1, options.cols ?? 3);\n  const ok = ed\n    .chain()\n    .focus()\n    .insertTable({ rows: options.rows ?? 3, cols, withHeaderRow: options.withHeaderRow ?? true })\n    .run();\n  if (!ok) return false;\n\n  applyEvenColumnWidths(ed, computeEvenColumnWidth(ed, cols));\n  return true;\n}\n","/**\n * Minimal FontSize TipTap extension.\n *\n * TipTap v2 doesn't ship @tiptap/extension-font-size (it was added in v3).\n * We implement it ourselves as a TextStyle-based mark that stores the\n * font size as an attribute and applies it via inline `style=\"font-size: ...\"`.\n *\n * This pairs with @tiptap/extension-text-style (already installed) — when\n * TextStyle is present, our FontSize mark piggybacks on the same <span>.\n */\nimport { Extension } from '@tiptap/core';\n\nexport interface FontSizeOptions {\n  types: string[];\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n  name: 'fontSize',\n\n  addOptions() {\n    return {\n      types: ['textStyle'],\n    };\n  },\n\n  addGlobalAttributes() {\n    return [\n      {\n        types: this.options.types,\n        attributes: {\n          fontSize: {\n            default: null,\n            parseHTML: (element) => element.style.fontSize || null,\n            renderHTML: (attributes) => {\n              if (!attributes.fontSize) return {};\n              return { style: `font-size: ${attributes.fontSize}` };\n            },\n          },\n        },\n      },\n    ];\n  },\n\n  addCommands() {\n    return {\n      setFontSize:\n        (size: string) =>\n        ({ chain }: any) => {\n          return chain().setMark('textStyle', { fontSize: size }).run();\n        },\n      unsetFontSize:\n        () =>\n        ({ chain }: any) => {\n          return chain()\n            .setMark('textStyle', { fontSize: null })\n            .removeEmptyTextStyle()\n            .run();\n        },\n    } as any;\n  },\n});\n","/**\n * PageBreak — a TipTap node that renders a real page-separation gap,\n * without labelling itself as an editing artifact (no \"Page Break\" text).\n *\n * Features:\n *   - Renders as a clean gap between two simulated pages, sized dynamically\n *     by `DocxEditor._layoutPagination()` (see editor.ts + editor.css).\n *   - Insert via toolbar button, Ctrl+Enter, or \"Add new page\" button.\n *   - Backspace/Delete right next to it move the cursor across the\n *     boundary onto the adjacent page instead of deleting it — the break\n *     (and the page it creates) is only removed by an explicit click on\n *     the gap band (with a confirm dialog) or via `deletePageBreak()` on\n *     an explicit node selection.\n *   - Atom node (not editable inline, but selectable + deletable as a unit).\n *\n * On save, the .docx serializer converts this node into a paragraph with\n * `pageBreakBefore: true`.\n */\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport { Plugin, PluginKey, Selection } from '@tiptap/pm/state';\n\nexport interface PageBreakOptions {\n  HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    pageBreak: {\n      /** Insert a page break at the current cursor position. */\n      insertPageBreak: () => ReturnType;\n      /** Delete the page break node that is currently selected. */\n      deletePageBreak: () => ReturnType;\n    };\n  }\n}\n\nexport const PageBreak = Node.create<PageBreakOptions>({\n  name: 'pageBreak',\n  group: 'block',\n  atom: true,\n  draggable: false,\n  selectable: true,\n  defining: true,\n\n  addOptions() {\n    return {\n      HTMLAttributes: {\n        class: 'docx-page-break',\n        'data-page-break': 'true',\n        contenteditable: 'false',\n      },\n    };\n  },\n\n  parseHTML() {\n    return [\n      { tag: 'div[data-page-break]' },\n      { tag: 'div.docx-page-break' },\n      { tag: 'hr.docx-page-break' },\n    ];\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    // Rendered as a plain page-separation gap (see editor.css) — no\n    // \"Page Break\" label, so it reads as a real page boundary rather than\n    // an editing artifact. Click-to-delete still works on the gap itself.\n    return ['div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n  },\n\n  addCommands() {\n    return {\n      insertPageBreak:\n        () =>\n        ({ chain }: any) => {\n          // Insert just the page break — if the cursor is in the middle of\n          // a paragraph, `insertContent` already splits it into \"before\"\n          // and \"after\" paragraphs around the break, so there's always\n          // somewhere for the cursor to land. Only when the break ends up\n          // as the very last node in the document (e.g. cursor was at the\n          // end of the last paragraph) do we need to add an empty\n          // paragraph after it — otherwise the new page has no landing\n          // spot to type into. Without this check, a break inserted\n          // mid-paragraph used to leave a stray blank paragraph behind.\n          return chain()\n            .insertContent({ type: 'pageBreak' })\n            .command(({ tr, dispatch }: any) => {\n              const pos = tr.selection.to;\n              if (pos >= tr.doc.content.size) {\n                const paragraphType = tr.doc.type.schema.nodes.paragraph;\n                if (dispatch) {\n                  tr.insert(pos, paragraphType.create());\n                  tr.setSelection(Selection.near(tr.doc.resolve(pos + 1), 1));\n                }\n              }\n              return true;\n            })\n            .run();\n        },\n      deletePageBreak:\n        () =>\n        ({ state, dispatch }: any) => {\n          // Delete the currently-selected page break node\n          const { selection } = state;\n          if (selection.empty) return false;\n          const node = selection.node;\n          if (node && node.type.name === 'pageBreak') {\n            if (dispatch) {\n              const tr = state.tr.deleteSelection();\n              dispatch(tr);\n            }\n            return true;\n          }\n          return false;\n        },\n    } as any;\n  },\n\n  addKeyboardShortcuts() {\n    return {\n      'Mod-Enter': () => this.editor.commands.insertPageBreak(),\n      'Ctrl-Enter': () => this.editor.commands.insertPageBreak(),\n    };\n  },\n\n  addProseMirrorPlugins() {\n    return [\n      new Plugin({\n        key: new PluginKey('pageBreakNavigate'),\n        props: {\n          // handleKeyDown runs BEFORE keymap plugins, so we can intercept\n          // Backspace/Delete before StarterKit's joinBackward runs.\n          //\n          // A page break is a structural page boundary, not a character —\n          // Backspace/Delete right next to one should move the cursor\n          // across it (onto the adjacent page) WITHOUT deleting the break\n          // or the page it creates. The break can only be removed\n          // explicitly, by clicking its gap band (see editor.ts) or via\n          // `deletePageBreak()` on an explicit node selection.\n          handleKeyDown(view: any, event: KeyboardEvent) {\n            if (event.key !== 'Backspace' && event.key !== 'Delete') return false;\n\n            const { state } = view;\n            const { selection } = state;\n            const { empty, $from } = selection;\n            if (!empty) return false;\n\n            const depth = $from.depth;\n            if (depth < 1) return false; // cursor directly in the doc node — nothing to check\n\n            // Backspace: cursor at the very start of a block. Use the\n            // standard ProseMirror idiom for \"what's the sibling block\n            // immediately before this one\" — resolve the position right\n            // before the current block (at its own depth) and read\n            // `.nodeBefore` off of THAT resolved position. (Using\n            // `$from.index($from.depth)` here is a classic mistake: at the\n            // cursor's own depth that index walks the block's *inline*\n            // content, not its block-level siblings — which is why the\n            // page break kept getting swallowed instead of skipped.)\n            if (event.key === 'Backspace' && $from.parentOffset === 0) {\n              const beforePos = $from.before(depth);\n              const prev = state.doc.resolve(beforePos).nodeBefore;\n              if (!prev || prev.type.name !== 'pageBreak') return false;\n\n              event.preventDefault();\n              const landingPos = beforePos - prev.nodeSize; // position right before the page break\n\n              // If the current (now-abandoned) block is empty, it's almost\n              // certainly the placeholder paragraph auto-inserted right\n              // after the break — drop it so Backspace doesn't just sit\n              // there doing nothing forever. The page break itself is\n              // never touched.\n              let tr = state.tr;\n              if ($from.parent.content.size === 0) {\n                tr = tr.delete($from.before(depth), $from.after(depth));\n              }\n              const target = Selection.near(tr.doc.resolve(Math.min(landingPos, tr.doc.content.size)), -1);\n              view.dispatch(tr.setSelection(target));\n              return true;\n            }\n\n            // Delete: cursor at the very end of a block. Symmetric to the\n            // above, using `.nodeAfter` off the position right after the\n            // current block.\n            if (event.key === 'Delete' && $from.parentOffset === $from.parent.content.size) {\n              const afterPos = $from.after(depth);\n              const next = state.doc.resolve(afterPos).nodeAfter;\n              if (!next || next.type.name !== 'pageBreak') return false;\n\n              event.preventDefault();\n              const landingPos = afterPos + next.nodeSize; // position right after the page break\n              const target = Selection.near(state.doc.resolve(Math.min(landingPos, state.doc.content.size)), 1);\n              view.dispatch(state.tr.setSelection(target));\n              return true;\n            }\n\n            return false;\n          },\n        },\n      }),\n    ];\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n","/**\n * Image extension with alignment + floating-wrap support.\n *\n * Extends TipTap's default Image with extra attributes:\n *   - alignment: 'inline' | 'left' | 'center' | 'right' | 'float-left' | 'float-right'\n *   - width: CSS width (e.g. \"300px\" or \"50%\")\n *   - height: CSS height (optional)\n *   - wrap: 'none' | 'left' | 'right' (CSS float)\n *\n * Rendering:\n *   - inline (default): <img> inside <p>\n *   - left/center/right: <div class=\"docx-image-block docx-image-{align}\"><img></div>\n *   - float-left/float-right: <img class=\"docx-image-float-{dir}\" style=\"float:...\">\n *\n * Commands added:\n *   - setImageAlignment(align)\n *   - setImageSize(width, height?)\n *   - setImageWrap(wrap)\n */\nimport Image from '@tiptap/extension-image';\nimport { mergeAttributes } from '@tiptap/core';\n\nexport type ImageAlignment = 'inline' | 'left' | 'center' | 'right';\nexport type ImageWrap = 'none' | 'left' | 'right';\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    docxImage: {\n      setImageAlignment: (alignment: ImageAlignment) => ReturnType;\n      setImageSize: (width: string, height?: string) => ReturnType;\n      setImageWrap: (wrap: ImageWrap) => ReturnType;\n    };\n  }\n}\n\nexport const DocxImage = Image.extend({\n  name: 'image',\n\n  addAttributes() {\n    return {\n      ...this.parent?.(),\n      alignment: {\n        default: 'inline',\n        parseHTML: (el) => el.getAttribute('data-alignment') || 'inline',\n        renderHTML: (attrs) => (attrs.alignment ? { 'data-alignment': attrs.alignment } : {}),\n      },\n      wrap: {\n        default: 'none',\n        parseHTML: (el) => el.getAttribute('data-wrap') || 'none',\n        renderHTML: (attrs) => (attrs.wrap && attrs.wrap !== 'none' ? { 'data-wrap': attrs.wrap } : {}),\n      },\n      width: {\n        default: null,\n        parseHTML: (el) => (el as HTMLElement).getAttribute('width') || (el as HTMLElement).style.width || null,\n        renderHTML: (attrs) => {\n          if (!attrs.width) return {};\n          return { style: `width: ${attrs.width}`, width: attrs.width };\n        },\n      },\n      height: {\n        default: null,\n        parseHTML: (el) => (el as HTMLElement).getAttribute('height') || (el as HTMLElement).style.height || null,\n        renderHTML: (attrs) => {\n          if (!attrs.height) return {};\n          return { style: `height: ${attrs.height}`, height: attrs.height };\n        },\n      },\n    };\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    const align = HTMLAttributes['data-alignment'] || 'inline';\n    const wrap = HTMLAttributes['data-wrap'];\n\n    // Floating (wrap) images: just apply float + margin via class\n    if (wrap === 'left' || wrap === 'right') {\n      return [\n        'img',\n        mergeAttributes(HTMLAttributes, {\n          class: `docx-image docx-image-float docx-image-float-${wrap}`,\n          style: `float: ${wrap}; margin-${wrap === 'left' ? 'right' : 'left'}: 16px; margin-bottom: 8px;`,\n        }),\n      ];\n    }\n\n    // Block-aligned images\n    if (align === 'left' || align === 'center' || align === 'right') {\n      return [\n        'div',\n        {\n          class: `docx-image-block docx-image-block-${align}`,\n          'data-alignment': align,\n          contenteditable: 'false',\n        },\n        ['img', mergeAttributes(HTMLAttributes, { class: 'docx-image' })],\n      ];\n    }\n\n    // Inline image (default)\n    return ['img', mergeAttributes(HTMLAttributes, { class: 'docx-image' })];\n  },\n\n  parseHTML() {\n    return [\n      { tag: 'img[src]:not([src^=\"data:\"]):not(.docx-image-float)' },\n      { tag: 'img.docx-image' },\n      { tag: 'div.docx-image-block img' },\n      { tag: 'img[style*=\"float\"]' },\n    ];\n  },\n\n  addCommands() {\n    return {\n      ...this.parent?.(),\n      setImageAlignment:\n        (alignment: ImageAlignment) =>\n        ({ commands }: any) => {\n          return commands.updateAttributes('image', { alignment });\n        },\n      setImageSize:\n        (width: string, height?: string) =>\n        ({ commands }: any) => {\n          return commands.updateAttributes('image', { width, height: height || null });\n        },\n      setImageWrap:\n        (wrap: ImageWrap) =>\n        ({ commands }: any) => {\n          // Setting wrap to left/right also sets alignment to inline (the float handles positioning)\n          const alignment: ImageAlignment = 'inline';\n          return commands.updateAttributes('image', { wrap, alignment });\n        },\n    } as any;\n  },\n});\n","/**\n * Text layout extensions:\n *   - TextTransform: uppercase / lowercase / capitalize / none (mark)\n *   - LetterSpacing: CSS letter-spacing on text (mark, via TextStyle)\n *   - LineHeight: paragraph attribute for line-height\n *\n * These cover the \"font supports\" the user asked for — beyond just\n * family + size, Word also exposes text-transform, letter spacing,\n * and line spacing.\n */\nimport { Extension, Mark, mergeAttributes } from '@tiptap/core';\n\n/* -------------------------------------------------------------------------- */\n/* TextTransform — mark with `transform` attribute                            */\n/* -------------------------------------------------------------------------- */\n\nexport type TextTransformValue = 'none' | 'uppercase' | 'lowercase' | 'capitalize';\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    textTransform: {\n      setTextTransform: (transform: TextTransformValue) => ReturnType;\n      unsetTextTransform: () => ReturnType;\n    };\n    letterSpacing: {\n      setLetterSpacing: (spacing: string) => ReturnType;\n      unsetLetterSpacing: () => ReturnType;\n    };\n    lineHeight: {\n      setLineHeight: (lineHeight: string) => ReturnType;\n      unsetLineHeight: () => ReturnType;\n    };\n  }\n}\n\nexport const TextTransform = Mark.create({\n  name: 'textTransform',\n\n  addAttributes() {\n    return {\n      transform: {\n        default: 'none',\n        parseHTML: (el) => (el as HTMLElement).style.textTransform || 'none',\n        renderHTML: (attrs) => {\n          if (!attrs.transform || attrs.transform === 'none') return {};\n          return { style: `text-transform: ${attrs.transform}` };\n        },\n      },\n    };\n  },\n\n  parseHTML() {\n    return [\n      { tag: 'span[style*=\"text-transform\"]' },\n    ];\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    return ['span', mergeAttributes(HTMLAttributes), 0];\n  },\n\n  addCommands() {\n    return {\n      setTextTransform:\n        (transform: TextTransformValue) =>\n        ({ commands }: any) => {\n          if (transform === 'none') return commands.unsetMark('textTransform');\n          return commands.setMark('textTransform', { transform });\n        },\n      unsetTextTransform:\n        () =>\n        ({ commands }: any) => commands.unsetMark('textTransform'),\n    } as any;\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n/* LetterSpacing — mark piggybacking on TextStyle                             */\n/* -------------------------------------------------------------------------- */\n\nexport const LetterSpacing = Extension.create({\n  name: 'letterSpacing',\n\n  addGlobalAttributes() {\n    return [\n      {\n        types: ['textStyle'],\n        attributes: {\n          letterSpacing: {\n            default: null,\n            parseHTML: (el) => (el as HTMLElement).style.letterSpacing || null,\n            renderHTML: (attrs) => {\n              if (!attrs.letterSpacing) return {};\n              return { style: `letter-spacing: ${attrs.letterSpacing}` };\n            },\n          },\n        },\n      },\n    ];\n  },\n\n  addCommands() {\n    return {\n      setLetterSpacing:\n        (spacing: string) =>\n        ({ chain }: any) =>\n          chain().setMark('textStyle', { letterSpacing: spacing }).run(),\n      unsetLetterSpacing:\n        () =>\n        ({ chain }: any) =>\n          chain().setMark('textStyle', { letterSpacing: null }).removeEmptyTextStyle().run(),\n    } as any;\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n/* LineHeight — paragraph-level attribute                                     */\n/* -------------------------------------------------------------------------- */\n\nexport const LineHeight = Extension.create({\n  name: 'lineHeight',\n\n  addGlobalAttributes() {\n    return [\n      {\n        types: ['paragraph', 'heading'],\n        attributes: {\n          lineHeight: {\n            default: null,\n            parseHTML: (el) => (el as HTMLElement).style.lineHeight || null,\n            renderHTML: (attrs) => {\n              if (!attrs.lineHeight) return {};\n              return { style: `line-height: ${attrs.lineHeight}` };\n            },\n          },\n        },\n      },\n    ];\n  },\n\n  addCommands() {\n    return {\n      setLineHeight:\n        (lineHeight: string) =>\n        ({ commands }: any) =>\n          commands.updateAttributes('paragraph', { lineHeight }),\n      unsetLineHeight:\n        () =>\n        ({ commands }: any) =>\n          commands.resetAttributes('paragraph', 'lineHeight'),\n    } as any;\n  },\n});\n","/**\n * Image interactions extension — adds:\n *   1. Clipboard paste (Ctrl+V with image in clipboard → insert as base64)\n *   2. Drag-and-drop (drag image files onto editor → insert at drop position)\n *   3. Image resize handles (click image → 8 drag handles appear)\n *\n * This extension uses TipTap's ProseMirror plugin API to intercept\n * paste and drop events, and a DOM overlay for resize handles.\n */\nimport { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\n/* -------------------------------------------------------------------------- */\n/* Image paste + drag-and-drop extension                                      */\n/* -------------------------------------------------------------------------- */\n\nexport const ImageInteractions = Extension.create({\n  name: 'imageInteractions',\n\n  addProseMirrorPlugins() {\n    return [\n      new Plugin({\n        key: new PluginKey('imageInteractions'),\n        props: {\n          handlePaste(view: any, event: ClipboardEvent) {\n            const items = event.clipboardData?.items;\n            if (!items) return false;\n\n            for (const item of items) {\n              if (item.type.startsWith('image/')) {\n                const file = item.getAsFile();\n                if (!file) continue;\n\n                const reader = new FileReader();\n                reader.onload = () => {\n                  const src = reader.result as string;\n                  const transaction = view.state.tr;\n                  const node = view.state.schema.nodes.image.create({ src });\n                  transaction.replaceSelectionWith(node);\n                  view.dispatch(transaction);\n                };\n                reader.readAsDataURL(file);\n\n                event.preventDefault();\n                return true;\n              }\n            }\n            return false;\n          },\n          handleDrop(view: any, event: DragEvent) {\n            const files = event.dataTransfer?.files;\n            if (!files || files.length === 0) return false;\n\n            let hasImage = false;\n            for (const file of Array.from(files)) {\n              if (file.type.startsWith('image/')) {\n                hasImage = true;\n                const reader = new FileReader();\n                reader.onload = () => {\n                  const src = reader.result as string;\n                  const dropPos = view.posAtCoords({\n                    left: event.clientX,\n                    top: event.clientY,\n                  });\n                  const pos = dropPos?.pos ?? view.state.selection.to;\n                  const transaction = view.state.tr;\n                  const node = view.state.schema.nodes.image.create({ src });\n                  transaction.insert(pos, node);\n                  view.dispatch(transaction);\n                };\n                reader.readAsDataURL(file);\n              }\n            }\n\n            if (hasImage) {\n              event.preventDefault();\n              return true;\n            }\n            return false;\n          },\n        },\n      }),\n    ];\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n/* Image resize handles (DOM overlay)                                         */\n/* -------------------------------------------------------------------------- */\n\n/**\n * ImageResizeHandles — a React component that shows 8 drag handles around\n * a selected image node, allowing the user to resize it by dragging.\n *\n * Usage: render this component inside the editor's React wrapper.\n * It listens to selection changes and shows handles when an image is selected.\n */\n\nexport interface ImageResizeState {\n  active: boolean;\n  src: string;\n  width: number;\n  height: number;\n  aspectRatio: number;\n  // Position relative to the editor surface\n  left: number;\n  top: number;\n}\n\n/**\n * Attach resize handle logic to the editor.\n * Call this from a React useEffect with the editor's DOM element.\n *\n * @param editorEl The .ProseMirror element\n * @param onResize Callback when an image is resized (receives new width/height)\n * @returns Cleanup function\n */\nexport function attachImageResizeHandles(\n  editorEl: HTMLElement,\n  onResize: (width: string, height?: string) => void,\n): () => void {\n  let overlay: HTMLElement | null = null;\n  let currentImg: HTMLImageElement | null = null;\n\n  function updateOverlay() {\n    // Find selected image\n    const selected = editorEl.querySelector('.ProseMirror-selectednode');\n    const img = selected?.tagName === 'IMG'\n      ? (selected as HTMLImageElement)\n      : selected?.querySelector('img') as HTMLImageElement | null;\n\n    if (!img) {\n      removeOverlay();\n      return;\n    }\n\n    currentImg = img;\n    if (!overlay) {\n      overlay = createOverlay(img, onResize);\n      editorEl.parentElement?.appendChild(overlay);\n    } else {\n      positionOverlay(overlay, img);\n    }\n  }\n\n  function removeOverlay() {\n    if (overlay) {\n      overlay.remove();\n      overlay = null;\n    }\n    currentImg = null;\n  }\n\n  // Listen for selection changes\n  const observer = new MutationObserver(() => updateOverlay());\n  observer.observe(editorEl, {\n    subtree: true,\n    attributes: true,\n    attributeFilter: ['class'],\n  });\n\n  // Also update on selection events (via interval check — PM doesn't expose easy hooks)\n  const interval = setInterval(updateOverlay, 200);\n\n  // Initial check\n  setTimeout(updateOverlay, 100);\n\n  return () => {\n    observer.disconnect();\n    clearInterval(interval);\n    removeOverlay();\n  };\n}\n\nfunction createOverlay(img: HTMLImageElement, onResize: (w: string, h?: string) => void): HTMLElement {\n  const overlay = document.createElement('div');\n  overlay.className = 'docx-image-resize-overlay';\n  overlay.style.cssText = `\n    position: absolute;\n    pointer-events: none;\n    z-index: 10;\n    border: 2px solid #2563eb;\n    box-sizing: border-box;\n  `;\n\n  positionOverlay(overlay, img);\n\n  // Create 8 resize handles\n  const positions = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n  const handles: HTMLElement[] = [];\n  for (const pos of positions) {\n    const handle = document.createElement('div');\n    handle.className = `docx-image-resize-handle docx-image-resize-handle-${pos}`;\n    handle.style.cssText = `\n      position: absolute;\n      width: 10px;\n      height: 10px;\n      background: #fff;\n      border: 2px solid #2563eb;\n      border-radius: 50%;\n      pointer-events: auto;\n      cursor: ${getCursor(pos)};\n    `;\n    positionHandle(handle, pos);\n    handle.addEventListener('mousedown', (e) => startResize(e, pos, img, onResize));\n    overlay.appendChild(handle);\n    handles.push(handle);\n  }\n\n  return overlay;\n}\n\nfunction positionOverlay(overlay: HTMLElement, img: HTMLImageElement) {\n  const rect = img.getBoundingClientRect();\n  const parentRect = overlay.parentElement?.getBoundingClientRect();\n  if (!parentRect) return;\n\n  overlay.style.left = `${rect.left - parentRect.left}px`;\n  overlay.style.top = `${rect.top - parentRect.top}px`;\n  overlay.style.width = `${rect.width}px`;\n  overlay.style.height = `${rect.height}px`;\n}\n\nfunction positionHandle(handle: HTMLElement, pos: string) {\n  const offset = -5; // half of handle size\n  const positions: Record<string, string> = {\n    nw: `left: ${offset}px; top: ${offset}px;`,\n    n: `left: 50%; top: ${offset}px; transform: translateX(-50%);`,\n    ne: `right: ${offset}px; top: ${offset}px;`,\n    e: `right: ${offset}px; top: 50%; transform: translateY(-50%);`,\n    se: `right: ${offset}px; bottom: ${offset}px;`,\n    s: `left: 50%; bottom: ${offset}px; transform: translateX(-50%);`,\n    sw: `left: ${offset}px; bottom: ${offset}px;`,\n    w: `left: ${offset}px; top: 50%; transform: translateY(-50%);`,\n  };\n  handle.style.cssText += positions[pos];\n}\n\nfunction getCursor(pos: string): string {\n  const cursors: Record<string, string> = {\n    nw: 'nwse-resize',\n    n: 'ns-resize',\n    ne: 'nesw-resize',\n    e: 'ew-resize',\n    se: 'nwse-resize',\n    s: 'ns-resize',\n    sw: 'nesw-resize',\n    w: 'ew-resize',\n  };\n  return cursors[pos] || 'default';\n}\n\nfunction startResize(\n  e: MouseEvent,\n  handlePos: string,\n  img: HTMLImageElement,\n  onResize: (w: string, h?: string) => void,\n) {\n  e.preventDefault();\n  e.stopPropagation();\n\n  const startX = e.clientX;\n  const startY = e.clientY;\n  const startWidth = img.offsetWidth;\n  const startHeight = img.offsetHeight;\n  const aspectRatio = startWidth / startHeight;\n\n  const isCorner = handlePos.length === 2;\n  const affectsWidth = handlePos.includes('e') || handlePos.includes('w') || isCorner;\n  const affectsHeight = handlePos.includes('n') || handlePos.includes('s') || isCorner;\n\n  function onMove(ev: MouseEvent) {\n    const dx = ev.clientX - startX;\n    const dy = ev.clientY - startY;\n\n    let newWidth = startWidth;\n    let newHeight = startHeight;\n\n    if (affectsWidth) {\n      if (handlePos.includes('w')) {\n        newWidth = startWidth - dx;\n      } else {\n        newWidth = startWidth + dx;\n      }\n    }\n\n    if (affectsHeight) {\n      if (handlePos.includes('n')) {\n        newHeight = startHeight - dy;\n      } else {\n        newHeight = startHeight + dy;\n      }\n    }\n\n    // Maintain aspect ratio for corner handles (unless Shift is held)\n    if (isCorner && !ev.shiftKey) {\n      // Lock to aspect ratio: use the larger delta\n      if (Math.abs(dx) > Math.abs(dy)) {\n        newHeight = newWidth / aspectRatio;\n      } else {\n        newWidth = newHeight * aspectRatio;\n      }\n    }\n\n    // Apply minimum size\n    newWidth = Math.max(20, newWidth);\n    newHeight = Math.max(20, newHeight);\n\n    // Apply visual feedback\n    img.style.width = `${newWidth}px`;\n    img.style.height = 'auto';\n\n    // Update overlay position\n    const overlay = img.closest('.docx-editor-content')?.parentElement?.querySelector('.docx-image-resize-overlay') as HTMLElement;\n    if (overlay) {\n      const rect = img.getBoundingClientRect();\n      const parentRect = overlay.parentElement?.getBoundingClientRect();\n      if (parentRect) {\n        overlay.style.left = `${rect.left - parentRect.left}px`;\n        overlay.style.top = `${rect.top - parentRect.top}px`;\n        overlay.style.width = `${rect.width}px`;\n        overlay.style.height = `${rect.height}px`;\n      }\n    }\n  }\n\n  function onUp() {\n    document.removeEventListener('mousemove', onMove);\n    document.removeEventListener('mouseup', onUp);\n\n    // Commit the final size\n    const finalWidth = img.style.width;\n    if (finalWidth) {\n      onResize(finalWidth);\n    }\n  }\n\n  document.addEventListener('mousemove', onMove);\n  document.addEventListener('mouseup', onUp);\n}\n","/**\n * LegalBlock — a paragraph-level attribute (not a new node type) that tags a\n * paragraph as a structural element of a Sri Lankan legal document: a\n * witness signature line, a notarial attestation clause, a District Court\n * case caption line, a signature line, or a numbered pleading paragraph.\n *\n * Deliberately implemented as an attribute on the existing `paragraph` node\n * (same pattern as `LineHeight` in `text-layout.ts`) rather than a brand-new\n * atom node type:\n *   - It inherits paragraph's existing OOXML save/load round-trip for free —\n *     `ooxml-serializer.ts` dispatches purely on `node.type` ('paragraph'),\n *     so an extra `data-legal-block` attribute is simply carried along\n *     unrecognized by anything that doesn't care about it (no crash risk),\n *     while text formatting (bold/underline/alignment) on the paragraph\n *     still exports normally.\n *   - It stays fully editable text (unlike an atom node), which is what a\n *     lawyer actually wants: they need to type over the witness/notary\n *     placeholder lines, not treat them as an uneditable block.\n *   - The templates in `@shashimadushan/docx-editor-legal-templates` render as plain\n *     paragraphs today; `applyLegalBlockStyles()` below can be run over a\n *     freshly-inserted template's paragraphs to tag the witness/attestation/\n *     signature lines so they get the distinct visual treatment defined in\n *     `editor.css` (`.docx-editor [data-legal-block]`).\n */\nimport { Extension } from '@tiptap/core';\n\nexport type LegalBlockType =\n  | 'case-caption'\n  | 'witness-line'\n  | 'attestation'\n  | 'signature-line'\n  | 'numbered-clause';\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    legalBlock: {\n      /** Tag the current paragraph as a legal structural block. */\n      setLegalBlock: (type: LegalBlockType) => ReturnType;\n      /** Remove the legal-block tag from the current paragraph. */\n      unsetLegalBlock: () => ReturnType;\n    };\n  }\n}\n\nexport const LegalBlock = Extension.create({\n  name: 'legalBlock',\n\n  addGlobalAttributes() {\n    return [\n      {\n        types: ['paragraph'],\n        attributes: {\n          legalBlock: {\n            default: null,\n            parseHTML: (el) => (el as HTMLElement).getAttribute('data-legal-block') || null,\n            renderHTML: (attrs) => {\n              if (!attrs.legalBlock) return {};\n              return { 'data-legal-block': attrs.legalBlock };\n            },\n          },\n        },\n      },\n    ];\n  },\n\n  addCommands() {\n    return {\n      setLegalBlock:\n        (type: LegalBlockType) =>\n        ({ commands }: any) =>\n          commands.updateAttributes('paragraph', { legalBlock: type }),\n      unsetLegalBlock:\n        () =>\n        ({ commands }: any) =>\n          commands.resetAttributes('paragraph', 'legalBlock'),\n    } as any;\n  },\n});\n\n/**\n * Heuristically tag the witness/attestation/signature lines produced by\n * `@shashimadushan/docx-editor-legal-templates`' `witnessBlock()` / `caseCaption()`\n * builders, so they pick up the CSS treatment in `editor.css` right after a\n * template is inserted. Matches on the literal boilerplate text those\n * builders emit — safe to run on any document (paragraphs that don't match\n * are left untouched) and idempotent (re-running just re-applies the same\n * tags).\n *\n * @param doc - A TipTap JSON document (`{ type: 'doc', content: [...] }`) or\n *   a bare array of top-level block nodes.\n * @returns A new document/array with `legalBlock` attrs applied — does not\n *   mutate the input.\n */\nexport function applyLegalBlockStyles<T extends { type: string; content?: any[] } | any[]>(doc: T): T {\n  const blocks: any[] = Array.isArray(doc) ? doc : (doc as any).content ?? [];\n\n  const tagged = blocks.map((block) => {\n    if (!block || block.type !== 'paragraph') return block;\n    const text = plainText(block).trim();\n    const legalBlock = classify(text);\n    if (!legalBlock) return block;\n    return { ...block, attrs: { ...(block.attrs ?? {}), legalBlock } };\n  });\n\n  return (Array.isArray(doc) ? tagged : { ...(doc as any), content: tagged }) as T;\n}\n\nfunction classify(text: string): LegalBlockType | null {\n  if (/^IN THE DISTRICT COURT OF/i.test(text) || /^Case No:/i.test(text) || text === 'Plaintiff' || text === 'Defendant' || text === '-Vs-') {\n    return 'case-caption';\n  }\n  if (/^\\d\\.\\s*Witness:/i.test(text) || /^Signed by the above-named/i.test(text)) {\n    return 'witness-line';\n  }\n  if (/^Before me,$/i.test(text) || /Notary Public$/i.test(text) || /^Sworn\\/Affirmed to at/i.test(text)) {\n    return 'attestation';\n  }\n  if (/^_{3,}/.test(text) && /\\(\\{\\{|\\(.+\\)$/.test(text)) {\n    return 'signature-line';\n  }\n  return null;\n}\n\nfunction plainText(node: any): string {\n  if (typeof node.text === 'string') return node.text;\n  if (!Array.isArray(node.content)) return '';\n  return node.content.map(plainText).join('');\n}\n","/**\n * ParagraphLayout — paragraph-level indent/tab-stop attributes.\n *\n * Same pattern as `LegalBlock`/`LineHeight`: attrs on the existing\n * `paragraph`/`heading` nodes rather than new node types, so OOXML\n * save/load (`ooxml-serializer.ts`/`ooxml-parser.ts`, which already read\n * and write these exact attr names) keeps working unchanged. Without this\n * extension the schema silently drops `indent`/`textIndent`/`tabStops` on\n * `setContent`, which is why the ruler previously had nothing to show or\n * edit.\n */\nimport { Extension } from '@tiptap/core';\n\nexport interface TabStop {\n  pos: number; // px from the left margin\n  val: 'left' | 'center' | 'right' | 'decimal' | 'bar';\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    paragraphLayout: {\n      setIndent: (indent: number | null) => ReturnType;\n      setTextIndent: (textIndent: number | null) => ReturnType;\n      setTabStops: (tabStops: TabStop[] | null) => ReturnType;\n    };\n  }\n}\n\nfunction pxStyle(name: string, value: unknown): string {\n  const n = parseFloat(String(value));\n  return isNaN(n) || n === 0 ? '' : `${name}: ${n}px;`;\n}\n\nexport const ParagraphLayout = Extension.create({\n  name: 'paragraphLayout',\n\n  addGlobalAttributes() {\n    return [\n      {\n        types: ['paragraph', 'heading'],\n        attributes: {\n          indent: {\n            default: null,\n            parseHTML: (el: HTMLElement) => {\n              const v = parseFloat(el.style.paddingLeft || '');\n              return isNaN(v) ? null : v;\n            },\n            renderHTML: (attrs: any) => (attrs.indent ? { style: pxStyle('padding-left', attrs.indent) } : {}),\n          },\n          textIndent: {\n            default: null,\n            parseHTML: (el: HTMLElement) => {\n              const v = parseFloat(el.style.textIndent || '');\n              return isNaN(v) ? null : v;\n            },\n            renderHTML: (attrs: any) => (attrs.textIndent ? { style: pxStyle('text-indent', attrs.textIndent) } : {}),\n          },\n          indentRight: {\n            default: null,\n            parseHTML: (el: HTMLElement) => {\n              const v = parseFloat(el.style.paddingRight || '');\n              return isNaN(v) ? null : v;\n            },\n            renderHTML: (attrs: any) => (attrs.indentRight ? { style: pxStyle('padding-right', attrs.indentRight) } : {}),\n          },\n          tabStops: {\n            default: null,\n            // Not visually rendered as tab-stop rulers in HTML — carried as\n            // data only, for the ruler UI and OOXML round-trip.\n            parseHTML: (el: HTMLElement) => {\n              const raw = el.getAttribute('data-tab-stops');\n              if (!raw) return null;\n              try {\n                return JSON.parse(raw);\n              } catch {\n                return null;\n              }\n            },\n            renderHTML: (attrs: any) =>\n              attrs.tabStops?.length ? { 'data-tab-stops': JSON.stringify(attrs.tabStops) } : {},\n          },\n        },\n      },\n    ];\n  },\n\n  addCommands() {\n    return {\n      setIndent:\n        (indent: number | null) =>\n        ({ commands }: any) =>\n          commands.updateAttributes('paragraph', { indent }),\n      setTextIndent:\n        (textIndent: number | null) =>\n        ({ commands }: any) =>\n          commands.updateAttributes('paragraph', { textIndent }),\n      setTabStops:\n        (tabStops: TabStop[] | null) =>\n        ({ commands }: any) =>\n          commands.updateAttributes('paragraph', { tabStops }),\n    } as any;\n  },\n});\n","/**\n * Track changes — backs \"Suggesting\" mode.\n *\n * Two inline marks:\n *   - `insertion` — text the user typed while suggesting mode was on.\n *   - `deletion`  — text the user tried to delete while suggesting mode was\n *     on. It is NOT actually removed from the document; it's kept and\n *     struck through until the suggestion is accepted or rejected.\n *\n * Both marks carry `{ id, author, date }`. `id` groups the marks produced by\n * one edit operation (e.g. typing over a selection produces one `deletion`\n * span + one `insertion` span sharing an id) so Accept/Reject can act on the\n * whole operation from either half. Consecutive keystrokes also share an id:\n * a pure insertion that directly abuts the same author's insertion run (and\n * that run started within `INSERTION_GROUP_WINDOW_MS`) reuses its id/date\n * instead of minting a new one, so a typed word/sentence is one suggestion\n * with one Accept/Reject card — not one per letter. See\n * `findAdjacentInsertionRun`.\n *\n * How interception works (see `trackChangesPlugin`'s `appendTransaction`):\n * ProseMirror has already applied the user's transaction by the time\n * `appendTransaction` runs, so rather than trying to rewrite steps in\n * flight, we let the edit happen and then patch it up:\n *   - pure insert (from === to): mark the just-inserted range as `insertion`.\n *   - pure delete (nothing inserted):\n *       - if the removed text was ALREADY an unresolved `insertion` of ours\n *         (i.e. the user is deleting a suggestion they haven't committed\n *         yet, typically by backspacing right after typing it), it is\n *         genuinely removed — the whole contiguous pending-insertion run is\n *         deleted in one go (see `expandInsertionSpan`), not just the one\n *         character the raw backspace touched. Otherwise it would take one\n *         backspace per letter to clear a suggestion, and even then the text\n *         would never actually disappear (each press would just layer\n *         another `deletion` mark on top of the `insertion` mark instead of\n *         removing anything) — this is the behavior Google Docs avoids by\n *         only turning a delete into a struck-through suggestion when it\n *         touches real, already-committed document content.\n *       - otherwise (removed text is original document content) re-insert\n *         the removed slice (read from the OLD doc) at the same spot,\n *         marked as `deletion` — visually \"undoing\" the delete except for\n *         the strikethrough.\n *   - replace (selection typed over): the new text is marked `insertion`;\n *     the replaced text is re-inserted right before it marked `deletion` —\n *     unless that replaced text was itself an unresolved pending insertion,\n *     in which case it's just gone (same reasoning as the pure-delete case).\n *\n * Scope: only single-step, doc-changing transactions built from\n * `ReplaceStep` are tracked (covers typing, backspace/delete, cut, paste,\n * and typing over a selection — the overwhelming majority of real editing).\n * Multi-step transactions and structural edits (e.g. splitting a paragraph,\n * table operations) pass through untouched/untracked rather than risk\n * producing an invalid document — a deliberate v1 limitation.\n */\nimport { Mark, Extension, mergeAttributes } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { ReplaceStep } from '@tiptap/pm/transform';\nimport type { Node as PMNode } from '@tiptap/pm/model';\n\nexport const trackChangesPluginKey = new PluginKey('docxTrackChanges');\n\nlet _changeCounter = 0;\nfunction nextChangeId(): string {\n  _changeCounter += 1;\n  return `tc-${Date.now().toString(36)}-${_changeCounter}`;\n}\n\n/**\n * How long after an insertion run's start a further keystroke that abuts it\n * still counts as \"the same edit\" and reuses its id/date instead of minting a\n * new one. Long enough to type a sentence at a normal pace with think-pauses,\n * short enough that coming back hours later to append to an old un-reviewed\n * suggestion starts a fresh, separately-resolvable one.\n */\nconst INSERTION_GROUP_WINDOW_MS = 5 * 60_000;\n\ninterface ReuseAttrs {\n  id: string;\n  author: string | null;\n  date: string | null;\n}\n\n/**\n * If a pure insertion at `from` directly abuts an existing unresolved\n * `insertion` run by the same author whose run started within\n * `INSERTION_GROUP_WINDOW_MS`, return that run's `{ id, author, date }` so the\n * new text joins it as one contiguous `<ins>` (one Accept/Reject card for the\n * whole typed word/sentence) instead of one change per keystroke. Checks the\n * text node ending exactly at `from` (typing forwards) and, failing that, the\n * one starting exactly at `from` (typing at the very start of a run).\n */\nfunction findAdjacentInsertionRun(doc: PMNode, from: number, author: string): ReuseAttrs | null {\n  const pick = (node: PMNode | null | undefined): ReuseAttrs | null => {\n    if (!node || !node.isText) return null;\n    const mark = node.marks.find((m) => m.type.name === 'insertion');\n    if (!mark) return null;\n    if ((mark.attrs.author ?? null) !== author) return null;\n    const started = mark.attrs.date ? new Date(mark.attrs.date).getTime() : NaN;\n    if (Number.isFinite(started) && Date.now() - started > INSERTION_GROUP_WINDOW_MS) return null;\n    return { id: mark.attrs.id, author: mark.attrs.author ?? null, date: mark.attrs.date ?? null };\n  };\n  let $pos;\n  try {\n    $pos = doc.resolve(from);\n  } catch {\n    return null;\n  }\n  return pick($pos.nodeBefore) ?? pick($pos.nodeAfter);\n}\n\nexport interface TrackChangesStorage {\n  enabled: boolean;\n  author: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Marks                                                                      */\n/* -------------------------------------------------------------------------- */\n\nexport const InsertionMark = Mark.create({\n  name: 'insertion',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      id: { default: null },\n      author: { default: null },\n      date: { default: null },\n    };\n  },\n  parseHTML() {\n    return [{ tag: 'ins[data-track=\"insertion\"]' }];\n  },\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'ins',\n      mergeAttributes(HTMLAttributes, {\n        'data-track': 'insertion',\n        'data-change-id': HTMLAttributes.id,\n        'data-author': HTMLAttributes.author,\n        'data-date': HTMLAttributes.date,\n        class: 'docx-editor-suggestion docx-editor-suggestion--insert',\n      }),\n      0,\n    ];\n  },\n});\n\nexport const DeletionMark = Mark.create({\n  name: 'deletion',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      id: { default: null },\n      author: { default: null },\n      date: { default: null },\n    };\n  },\n  parseHTML() {\n    return [{ tag: 'del[data-track=\"deletion\"]' }];\n  },\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'del',\n      mergeAttributes(HTMLAttributes, {\n        'data-track': 'deletion',\n        'data-change-id': HTMLAttributes.id,\n        'data-author': HTMLAttributes.author,\n        'data-date': HTMLAttributes.date,\n        class: 'docx-editor-suggestion docx-editor-suggestion--delete',\n      }),\n      0,\n    ];\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n/* Helpers shared by accept/reject                                           */\n/* -------------------------------------------------------------------------- */\n\ninterface MarkRange {\n  from: number;\n  to: number;\n  id: string | null;\n}\n\nfunction collectMarkRanges(doc: PMNode, markName: string, filterId?: string): MarkRange[] {\n  const ranges: MarkRange[] = [];\n  doc.descendants((node, pos) => {\n    if (!node.isText) return;\n    const mark = node.marks.find((m) => m.type.name === markName && (!filterId || m.attrs.id === filterId));\n    if (mark) ranges.push({ from: pos, to: pos + node.nodeSize, id: mark.attrs.id ?? null });\n  });\n  return ranges;\n}\n\n/* -------------------------------------------------------------------------- */\n/* ProseMirror plugin — intercepts edits while suggesting mode is on         */\n/* -------------------------------------------------------------------------- */\n\nfunction containsBlockContent(slice: { content: { childCount: number; child(i: number): PMNode } }): boolean {\n  for (let i = 0; i < slice.content.childCount; i++) {\n    if (!slice.content.child(i).isInline && !slice.content.child(i).isText) return true;\n  }\n  return false;\n}\n\n/** True if every text node in the slice already carries an `insertion` mark — i.e. it's entirely unresolved suggested text, not real document content. */\nfunction isFullyPendingInsertion(slice: { content: { forEach(cb: (node: PMNode) => void): void } }): boolean {\n  let sawText = false;\n  let allInsertion = true;\n  slice.content.forEach((node) => {\n    if (!node.isText) {\n      allInsertion = false;\n      return;\n    }\n    sawText = true;\n    if (!node.marks.some((m) => m.type.name === 'insertion')) allInsertion = false;\n  });\n  return sawText && allInsertion;\n}\n\n/**\n * Given a range in `doc` that is fully covered by `insertion` marks, expand\n * it outward (within the same parent block) to cover the FULL contiguous run\n * of insertion-marked text touching that range — e.g. if the user backspaces\n * one character out of the middle of a just-typed word, this returns the\n * whole word, so it can be removed in one shot instead of one letter at a\n * time. Groups by mark *type* (contiguous insertion-marked text), not by\n * matching `id` — adjacent runs from different edit bursts still clear together.\n */\nfunction expandInsertionSpan(doc: PMNode, from: number, to: number): [number, number] {\n  const $from = doc.resolve(from);\n  const parent = $from.parent;\n  const parentStart = $from.start();\n\n  interface Seg {\n    start: number;\n    end: number;\n    hasInsertion: boolean;\n  }\n  const segs: Seg[] = [];\n  let offset = parentStart;\n  parent.content.forEach((node) => {\n    const start = offset;\n    const end = offset + node.nodeSize;\n    segs.push({ start, end, hasInsertion: node.isText && node.marks.some((m) => m.type.name === 'insertion') });\n    offset = end;\n  });\n\n  let loIdx = segs.findIndex((s) => s.end > from);\n  if (loIdx === -1) return [from, to];\n  let hiIdx = loIdx;\n  for (let i = segs.length - 1; i >= 0; i--) {\n    if (segs[i].start < to) {\n      hiIdx = i;\n      break;\n    }\n  }\n\n  while (loIdx > 0 && segs[loIdx - 1].hasInsertion) loIdx--;\n  while (hiIdx < segs.length - 1 && segs[hiIdx + 1].hasInsertion) hiIdx++;\n\n  return [Math.min(segs[loIdx].start, from), Math.max(segs[hiIdx].end, to)];\n}\n\nfunction trackChangesPlugin(storage: TrackChangesStorage) {\n  return new Plugin({\n    key: trackChangesPluginKey,\n    appendTransaction(transactions, oldState, newState) {\n      if (!storage.enabled) return null;\n\n      const relevant = transactions.filter((tr) => tr.docChanged && !tr.getMeta('docxTrackChangesSkip'));\n      if (!relevant.length) return null;\n      // Position bookkeeping below assumes exactly one tracked transaction\n      // (true for ordinary single-keystroke/paste edits). A batch of several\n      // transactions applied in one dispatch cycle is rare enough in a\n      // single-user editor that we just let it through untracked rather than\n      // risk mis-mapped positions.\n      if (relevant.length !== 1) return null;\n      const origTr = relevant[0];\n      // Only handle simple, single-step replaces — see file header.\n      if (origTr.steps.length !== 1) return null;\n      const step = origTr.steps[0];\n      if (!(step instanceof ReplaceStep)) return null;\n      if (containsBlockContent(step.slice)) return null;\n\n      const from = step.from;\n      const to = step.to;\n      const insertedSize = step.slice.size;\n      const removedSize = to - from;\n      if (insertedSize === 0 && removedSize === 0) return null;\n\n      // Consecutive keystrokes that abut the same author's just-started\n      // insertion run reuse its id/date, so a typed word/sentence is ONE\n      // suggestion (one Accept/Reject card) rather than one per letter.\n      // Only for a pure insert — a delete or replace is always its own edit.\n      const reuse =\n        insertedSize > 0 && removedSize === 0\n          ? findAdjacentInsertionRun(oldState.doc, from, storage.author)\n          : null;\n\n      const id = reuse ? reuse.id : nextChangeId();\n      const author = reuse ? reuse.author ?? storage.author : storage.author;\n      const date = reuse ? reuse.date ?? new Date().toISOString() : new Date().toISOString();\n      const insertionMark = newState.schema.marks.insertion.create({ id, author, date });\n      const deletionMark = newState.schema.marks.deletion.create({ id, author, date });\n\n      const out = newState.tr;\n      out.setMeta('docxTrackChangesSkip', true);\n      out.setMeta('addToHistory', true);\n\n      if (insertedSize > 0) {\n        // The new content is already in newState (unmarked) — mark it.\n        out.addMark(from, from + insertedSize, insertionMark);\n      }\n\n      if (removedSize > 0) {\n        const removedSlice = oldState.doc.slice(from, to);\n        if (isFullyPendingInsertion(removedSlice)) {\n          if (insertedSize === 0) {\n            // Pure delete of (part of) an unresolved insertion of ours —\n            // remove the whole contiguous pending run in one go rather than\n            // just the character(s) this one step touched, so a single\n            // backspace clears a just-typed suggestion instead of taking\n            // one press per letter.\n            const [spanFrom, spanTo] = expandInsertionSpan(oldState.doc, from, to);\n            const mappedFrom = origTr.mapping.map(spanFrom, -1);\n            const mappedTo = origTr.mapping.map(spanTo, 1);\n            if (mappedTo > mappedFrom) out.delete(mappedFrom, mappedTo);\n          }\n          // else: typing over a selection that was entirely pending\n          // insertion — origTr already removed it from newState and the new\n          // text was just marked as `insertion` above, so there's nothing\n          // left to turn into a struck-through deletion.\n        } else {\n          // Genuine document content — re-insert the removed slice (read\n          // from the doc BEFORE this step) right before the (possibly\n          // just-marked) inserted content, marked as a deletion instead of\n          // actually being gone.\n          out.insert(from, removedSlice.content);\n          out.addMark(from, from + removedSize, deletionMark);\n        }\n      }\n\n      return out;\n    },\n  });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Extension: registers marks + plugin + commands                            */\n/* -------------------------------------------------------------------------- */\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    trackChanges: {\n      setTrackChangesEnabled: (enabled: boolean) => ReturnType;\n      setTrackChangesAuthor: (author: string) => ReturnType;\n      acceptAllSuggestions: () => ReturnType;\n      rejectAllSuggestions: () => ReturnType;\n      acceptSuggestion: (id: string) => ReturnType;\n      rejectSuggestion: (id: string) => ReturnType;\n    };\n  }\n}\n\nexport const TrackChanges = Extension.create<{ author: string }, TrackChangesStorage>({\n  name: 'trackChanges',\n\n  addOptions() {\n    return { author: 'You' };\n  },\n\n  addStorage() {\n    return { enabled: false, author: this.options.author };\n  },\n\n  addProseMirrorPlugins() {\n    return [trackChangesPlugin(this.storage)];\n  },\n\n  addCommands() {\n    return {\n      setTrackChangesEnabled:\n        (enabled: boolean) =>\n        ({ editor }) => {\n          this.storage.enabled = enabled;\n          void editor;\n          return true;\n        },\n      setTrackChangesAuthor:\n        (author: string) =>\n        () => {\n          this.storage.author = author;\n          return true;\n        },\n      acceptAllSuggestions:\n        () =>\n        ({ state, dispatch }) => {\n          applyResolution(state, dispatch, 'accept');\n          return true;\n        },\n      rejectAllSuggestions:\n        () =>\n        ({ state, dispatch }) => {\n          applyResolution(state, dispatch, 'reject');\n          return true;\n        },\n      acceptSuggestion:\n        (id: string) =>\n        ({ state, dispatch }) => {\n          applyResolution(state, dispatch, 'accept', id);\n          return true;\n        },\n      rejectSuggestion:\n        (id: string) =>\n        ({ state, dispatch }) => {\n          applyResolution(state, dispatch, 'reject', id);\n          return true;\n        },\n    };\n  },\n});\n\nfunction applyResolution(\n  state: import('@tiptap/pm/state').EditorState,\n  dispatch: ((tr: import('@tiptap/pm/state').Transaction) => void) | undefined,\n  mode: 'accept' | 'reject',\n  id?: string,\n) {\n  const removeMarkName = mode === 'accept' ? 'deletion' : 'insertion';\n  const stripMarkName = mode === 'accept' ? 'insertion' : 'deletion';\n  const removeRanges = collectMarkRanges(state.doc, removeMarkName, id);\n  const stripRanges = collectMarkRanges(state.doc, stripMarkName, id);\n  if (!removeRanges.length && !stripRanges.length) return;\n\n  const tr = state.tr;\n  tr.setMeta('docxTrackChangesSkip', true);\n  for (const r of removeRanges) {\n    const from = tr.mapping.map(r.from, -1);\n    const to = tr.mapping.map(r.to, 1);\n    if (to > from) tr.delete(from, to);\n  }\n  for (const r of stripRanges) {\n    const from = tr.mapping.map(r.from, -1);\n    const to = tr.mapping.map(r.to, 1);\n    if (to > from) tr.removeMark(from, to, state.schema.marks[stripMarkName]);\n  }\n  dispatch?.(tr);\n}\n\n/** Read-only helper: does the doc currently have any pending suggestions? */\nexport function hasPendingSuggestions(doc: PMNode): boolean {\n  let found = false;\n  doc.descendants((node) => {\n    if (found || !node.isText) return !found;\n    if (node.marks.some((m) => m.type.name === 'insertion' || m.type.name === 'deletion')) found = true;\n    return !found;\n  });\n  return found;\n}\n\n/** Read-only helper: list of distinct pending suggestion ids, in doc order. */\nexport function listPendingSuggestionIds(doc: PMNode): string[] {\n  const seen = new Set<string>();\n  const order: string[] = [];\n  doc.descendants((node) => {\n    if (!node.isText) return;\n    for (const m of node.marks) {\n      if ((m.type.name === 'insertion' || m.type.name === 'deletion') && m.attrs.id && !seen.has(m.attrs.id)) {\n        seen.add(m.attrs.id);\n        order.push(m.attrs.id);\n      }\n    }\n  });\n  return order;\n}\n","/**\n * History diff overlay — decoration-only preview of what changed between the\n * live document and a history snapshot, shown while hovering an entry in the\n * History sidebar (`react/history/HistoryEntryRow.tsx`).\n *\n * Deliberately decoration-only, never a document edit: the diff (computed by\n * `react/history/historyDiff.ts`) is pushed into the plugin via transaction\n * meta (`setHistoryDiffPreview`/`clearHistoryDiffPreview` commands, wrapped\n * as `DocxEditor.previewHistoryDiff()`/`clearHistoryDiffPreview()` in\n * `../../editor.ts`), and every dispatched transaction is marked\n * `addToHistory: false` so it never becomes an undo step. Mirrors\n * `track-changes.ts`'s `Extension.create` + `addProseMirrorPlugins` +\n * `addCommands` shape.\n *\n * None of these ever tint a whole block edge-to-edge — that reads as a big\n * flat rectangle spanning the full page width regardless of how little\n * text actually changed. `added` blocks with text get an inline highlight\n * over just that text (an inline decoration only ever extends as wide as\n * the glyphs it wraps); a genuinely empty added block (e.g. a blank line)\n * has no text to wrap, so it gets a small fixed-size marker box anchored at\n * the start of the line instead. `removed` blocks render as a small inline\n * pill widget (no node exists in the current doc to decorate). `modified`\n * blocks walk `BlockDiffEntry.wordDiff` and decorate only the words that\n * actually changed — added words get an inline highlight, removed words\n * render as inline strikethrough widgets spliced into the paragraph's flow.\n */\nimport { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport type { BlockDiffResult } from '../../react/history/historyDiff';\n\nexport const historyDiffOverlayPluginKey = new PluginKey('docxHistoryDiffOverlay');\n\nconst SET_DIFF_META = 'docxSetHistoryDiffPreview';\n\ninterface BlockRange {\n  from: number;\n  to: number;\n  node: PMNode;\n}\n\ninterface TextOffsetSegment {\n  start: number;\n  end: number;\n  pos: number;\n}\n\n/**\n * Maps every text node inside `blockNode` to its [charOffset, charOffset+len)\n * range within the block's full text (same concatenation order\n * `extractNodeText` in historyDiff.ts uses, since both walk depth-first) and\n * its real ProseMirror position — lets word-level diff offsets (computed\n * over plain strings) be translated back into real document positions.\n */\nfunction buildTextOffsetIndex(blockNode: PMNode, blockFrom: number): TextOffsetSegment[] {\n  const segments: TextOffsetSegment[] = [];\n  let offset = 0;\n  blockNode.descendants((child, relPos) => {\n    if (child.isText && child.text) {\n      segments.push({ start: offset, end: offset + child.text.length, pos: blockFrom + 1 + relPos });\n      offset += child.text.length;\n    }\n    return true;\n  });\n  return segments;\n}\n\n/** Resolves a char offset (into the block's full text) to a real ProseMirror position. */\nfunction posAtOffset(segments: TextOffsetSegment[], offset: number, blockFrom: number): number {\n  for (const seg of segments) {\n    if (offset >= seg.start && offset <= seg.end) return seg.pos + (offset - seg.start);\n  }\n  const last = segments[segments.length - 1];\n  return last ? last.pos + (last.end - last.start) : blockFrom + 1;\n}\n\nfunction buildBlockRanges(doc: PMNode): BlockRange[] {\n  const ranges: BlockRange[] = [];\n  let pos = 0;\n  doc.forEach((node) => {\n    ranges.push({ from: pos, to: pos + node.nodeSize, node });\n    pos += node.nodeSize;\n  });\n  return ranges;\n}\n\nfunction removedWordWidget(text: string): HTMLElement {\n  const span = document.createElement('span');\n  span.className = 'docx-editor-history-diff-removed-word';\n  span.textContent = text;\n  return span;\n}\n\nfunction removedBlockWidget(text: string | undefined): HTMLElement {\n  const row = document.createElement('div');\n  row.className = 'docx-editor-history-diff-removed-pill';\n  const marker = document.createElement('span');\n  marker.className = 'docx-editor-history-diff-removed-pill__marker';\n  marker.textContent = '−';\n  const body = document.createElement('span');\n  body.className = 'docx-editor-history-diff-removed-pill__text';\n  body.textContent = text ?? 'Removed block';\n  row.append(marker, body);\n  return row;\n}\n\nfunction addedEmptyLineMarker(): HTMLElement {\n  const box = document.createElement('span');\n  box.className = 'docx-editor-history-diff-added-empty-marker';\n  return box;\n}\n\n/**\n * Decorations for one `added` block — see file header. A block with no\n * content at all (e.g. an inserted blank paragraph) has nothing for an\n * inline decoration to wrap, so it gets a small marker widget instead;\n * anything else (an atomic node like an image counts as \"no content\" too,\n * same fallback — an acceptable simplification since it still flags the\n * line as changed).\n */\nfunction decorateAddedBlock(range: BlockRange): Decoration[] {\n  if (range.node.content.size === 0) {\n    return [Decoration.widget(range.from + 1, addedEmptyLineMarker, { side: -1 })];\n  }\n  const from = range.from + 1;\n  const to = range.to - 1;\n  if (to <= from) return [];\n  return [Decoration.inline(from, to, { class: 'docx-editor-history-diff--word-added' })];\n}\n\n/** Word-level decorations for one `modified` block — see file header. */\nfunction decorateModifiedBlock(range: BlockRange, wordDiff: BlockDiffResult['entries'][number]['wordDiff']): Decoration[] {\n  if (!wordDiff || wordDiff.length === 0) return [];\n  const segments = buildTextOffsetIndex(range.node, range.from);\n  const decorations: Decoration[] = [];\n  let offset = 0;\n\n  for (const token of wordDiff) {\n    if (token.kind === 'same') {\n      offset += token.text.length;\n      continue;\n    }\n    if (token.kind === 'added') {\n      // Whitespace-only additions (\"an extra space\") aren't worth\n      // highlighting — nothing visible to show — but they still consumed\n      // real characters in the current text, so the offset must advance.\n      if (token.text.trim().length > 0) {\n        const from = posAtOffset(segments, offset, range.from);\n        const to = posAtOffset(segments, offset + token.text.length, range.from);\n        if (to > from) decorations.push(Decoration.inline(from, to, { class: 'docx-editor-history-diff--word-added' }));\n      }\n      offset += token.text.length;\n      continue;\n    }\n    // 'removed' — doesn't exist in the current text, so offset does NOT\n    // advance; splice a widget in at the current position instead.\n    if (token.text.trim().length > 0) {\n      const pos = posAtOffset(segments, offset, range.from);\n      decorations.push(Decoration.widget(pos, () => removedWordWidget(token.text), { side: -1 }));\n    }\n  }\n  return decorations;\n}\n\nfunction buildDecorations(doc: PMNode, diff: BlockDiffResult | null): DecorationSet {\n  if (!diff || diff.entries.length === 0) return DecorationSet.empty;\n\n  const blockRanges = buildBlockRanges(doc);\n  const decorations: Decoration[] = [];\n\n  for (const entry of diff.entries) {\n    if (entry.kind === 'added') {\n      const range = entry.currentIndex != null ? blockRanges[entry.currentIndex] : undefined;\n      if (!range) continue;\n      decorations.push(...decorateAddedBlock(range));\n    } else if (entry.kind === 'modified') {\n      const range = entry.currentIndex != null ? blockRanges[entry.currentIndex] : undefined;\n      if (!range) continue;\n      decorations.push(...decorateModifiedBlock(range, entry.wordDiff));\n    } else {\n      // 'removed' — the block doesn't exist in the current doc, so there's no\n      // node to decorate. `entry.anchorIndex` (computed in historyDiff.ts) is\n      // the CURRENT-doc block index this content used to sit before —\n      // unlike `snapshotIndex`, it's already in the right index space to\n      // look up `blockRanges` (which is built from the current doc).\n      const anchorIndex = entry.anchorIndex ?? blockRanges.length;\n      const anchorPos = blockRanges[anchorIndex]?.from ?? doc.content.size;\n      decorations.push(\n        Decoration.widget(anchorPos, () => removedBlockWidget(entry.removedText ?? entry.preview), { side: -1 }),\n      );\n    }\n  }\n  return DecorationSet.create(doc, decorations);\n}\n\nfunction historyDiffOverlayPlugin() {\n  return new Plugin<BlockDiffResult | null>({\n    key: historyDiffOverlayPluginKey,\n    state: {\n      init: () => null,\n      apply(tr, value) {\n        if (tr.getMeta(SET_DIFF_META) !== undefined) return tr.getMeta(SET_DIFF_META);\n        return value;\n      },\n    },\n    props: {\n      decorations(state) {\n        const diff = this.getState(state) ?? null;\n        return buildDecorations(state.doc, diff);\n      },\n    },\n  });\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    historyDiffOverlay: {\n      setHistoryDiffPreview: (diff: BlockDiffResult) => ReturnType;\n      clearHistoryDiffPreview: () => ReturnType;\n    };\n  }\n}\n\nexport const HistoryDiffOverlay = Extension.create({\n  name: 'historyDiffOverlay',\n\n  addProseMirrorPlugins() {\n    return [historyDiffOverlayPlugin()];\n  },\n\n  addCommands() {\n    return {\n      setHistoryDiffPreview:\n        (diff: BlockDiffResult) =>\n        ({ tr, dispatch }) => {\n          tr.setMeta(SET_DIFF_META, diff);\n          tr.setMeta('addToHistory', false);\n          dispatch?.(tr);\n          return true;\n        },\n      clearHistoryDiffPreview:\n        () =>\n        ({ tr, dispatch }) => {\n          tr.setMeta(SET_DIFF_META, null);\n          tr.setMeta('addToHistory', false);\n          dispatch?.(tr);\n          return true;\n        },\n    };\n  },\n});\n","/**\n * Comments — text-anchored comment threads, independent of \"Suggesting\"\n * mode track changes (`track-changes.ts`). This file only owns the\n * in-document *anchor*: a `comment` mark wrapping the commented text plus\n * two ProseMirror commands to add/remove that anchor.\n *\n * Thread content (author, messages, @mentions, resolved state) deliberately\n * does NOT live in the mark's attrs — only the `id` does, matching\n * `insertion`/`deletion`'s `{ id, author, date }` pattern but trimmed down\n * further, since here the thread data is owned by the React `CommentsLayer`\n * + a pluggable `CommentsStorageAdapter` (see `comments-types.ts`), not by\n * the document itself. This keeps the mark cheap to keep around even after\n * a thread is resolved (resolution only changes app-level state, so the\n * highlight never needs to flicker on/off from an `appendTransaction`).\n */\nimport { Mark, Extension, mergeAttributes } from '@tiptap/core';\nimport type { Node as PMNode } from '@tiptap/pm/model';\n\nexport const CommentMark = Mark.create({\n  name: 'comment',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      id: { default: null },\n    };\n  },\n  parseHTML() {\n    return [{ tag: 'span[data-comment-id]' }];\n  },\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'span',\n      mergeAttributes(HTMLAttributes, {\n        'data-comment-id': HTMLAttributes.id,\n        class: 'docx-editor-comment-highlight',\n      }),\n      0,\n    ];\n  },\n});\n\n/* -------------------------------------------------------------------------- */\n/* Helpers                                                                    */\n/* -------------------------------------------------------------------------- */\n\ninterface MarkRange {\n  from: number;\n  to: number;\n  id: string | null;\n}\n\nfunction collectCommentRanges(doc: PMNode, filterId?: string): MarkRange[] {\n  const ranges: MarkRange[] = [];\n  doc.descendants((node, pos) => {\n    if (!node.isText) return;\n    const mark = node.marks.find((m) => m.type.name === 'comment' && (!filterId || m.attrs.id === filterId));\n    if (mark) ranges.push({ from: pos, to: pos + node.nodeSize, id: mark.attrs.id ?? null });\n  });\n  return ranges;\n}\n\nexport interface CommentAnchor {\n  id: string;\n  from: number;\n  to: number;\n  text: string;\n}\n\n/**\n * Current position + text of every comment anchor in the doc, in doc order.\n * A mark can be split across several text nodes (e.g. part of the commented\n * range was later made bold), so fragments sharing an id are merged into one\n * span covering their full min..max range.\n */\nexport function listCommentAnchors(doc: PMNode): CommentAnchor[] {\n  const spans = new Map<string, { from: number; to: number }>();\n  const order: string[] = [];\n  for (const { from, to, id } of collectCommentRanges(doc)) {\n    if (!id) continue;\n    const existing = spans.get(id);\n    if (existing) {\n      existing.from = Math.min(existing.from, from);\n      existing.to = Math.max(existing.to, to);\n    } else {\n      spans.set(id, { from, to });\n      order.push(id);\n    }\n  }\n  return order.map((id) => {\n    const { from, to } = spans.get(id)!;\n    return { id, from, to, text: doc.textBetween(from, to, '\\n', '\\n') };\n  });\n}\n\n/** Read-only helper: does the doc currently anchor any comments? */\nexport function hasComments(doc: PMNode): boolean {\n  let found = false;\n  doc.descendants((node) => {\n    if (found || !node.isText) return !found;\n    if (node.marks.some((m) => m.type.name === 'comment')) found = true;\n    return !found;\n  });\n  return found;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Extension: registers the mark's add/remove commands                       */\n/* -------------------------------------------------------------------------- */\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    commentsCore: {\n      addCommentMark: (id: string, from: number, to: number) => ReturnType;\n      removeCommentMark: (id: string) => ReturnType;\n    };\n  }\n}\n\nexport const CommentsCore = Extension.create({\n  name: 'commentsCore',\n\n  addCommands() {\n    return {\n      addCommentMark:\n        (id: string, from: number, to: number) =>\n        ({ state, dispatch }) => {\n          if (to <= from) return false;\n          const mark = state.schema.marks.comment.create({ id });\n          dispatch?.(state.tr.addMark(from, to, mark));\n          return true;\n        },\n      removeCommentMark:\n        (id: string) =>\n        ({ state, dispatch }) => {\n          const ranges = collectCommentRanges(state.doc, id);\n          if (!ranges.length) return false;\n          const tr = state.tr;\n          for (const r of ranges) {\n            const from = tr.mapping.map(r.from, -1);\n            const to = tr.mapping.map(r.to, 1);\n            if (to > from) tr.removeMark(from, to, state.schema.marks.comment);\n          }\n          dispatch?.(tr);\n          return true;\n        },\n    };\n  },\n});\n","/**\n * Content controls (`w:sdt`) — Word's structured placeholders/merge fields.\n * Modeled as a mark (like `comment`), not a node: the control just wraps\n * existing inline content and tags it with tag/alias metadata so it\n * round-trips through OOXML and renders with a visible border in the editor.\n *\n * v1 scope: inline (run-level) content controls only — a `w:sdt` wrapping\n * whole paragraphs/tables (block-level) is not handled.\n */\nimport { Mark, mergeAttributes } from '@tiptap/core';\n\nexport const ContentControlMark = Mark.create({\n  name: 'contentControl',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      id: { default: null },\n      tag: { default: null },\n      alias: { default: null },\n    };\n  },\n  parseHTML() {\n    return [{ tag: 'span[data-content-control-id]' }];\n  },\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'span',\n      mergeAttributes(HTMLAttributes, {\n        'data-content-control-id': HTMLAttributes.id,\n        title: HTMLAttributes.alias || HTMLAttributes.tag || undefined,\n        class: 'docx-editor-content-control',\n      }),\n      0,\n    ];\n  },\n});\n","/**\n * Bookmarks (`w:bookmarkStart`/`w:bookmarkEnd`) — named anchors internal\n * links point at. Modeled as an invisible mark (no rendering) so an\n * internal `<a href=\"#anchor\">` resolves to something real on export\n * instead of a dangling anchor.\n */\nimport { Mark } from '@tiptap/core';\n\nexport const BookmarkMark = Mark.create({\n  name: 'bookmark',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      name: { default: null },\n    };\n  },\n  renderHTML() {\n    return ['span', 0];\n  },\n});\n","/**\n * Simple fields (`w:fldSimple`) — PAGE, DATE, and similar. Modeled as a\n * mark carrying the field instruction, wrapping the field's last-cached\n * display text. Not live: the cached text is shown as-is, never\n * recalculated (no pagination/date engine here) — same limitation as\n * every other DOCX-in-the-browser editor without one.\n *\n * v1 scope: `w:fldSimple` only. Complex fields (`w:fldChar` begin/separate/\n * end run sequences) are not handled.\n */\nimport { Mark, mergeAttributes } from '@tiptap/core';\n\nexport const FieldMark = Mark.create({\n  name: 'field',\n  excludes: '',\n  inclusive: false,\n  addAttributes() {\n    return {\n      instr: { default: null },\n    };\n  },\n  parseHTML() {\n    return [{ tag: 'span[data-field-instr]' }];\n  },\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'span',\n      mergeAttributes(HTMLAttributes, {\n        'data-field-instr': HTMLAttributes.instr,\n        title: HTMLAttributes.instr || undefined,\n        class: 'docx-editor-field',\n      }),\n      0,\n    ];\n  },\n});\n","import StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Color from '@tiptap/extension-color';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Highlight from '@tiptap/extension-highlight';\nimport Link from '@tiptap/extension-link';\nimport {\n  EnhancedTable as Table,\n  EnhancedTableRow as TableRow,\n  EnhancedTableCell as TableCell,\n  EnhancedTableHeader as TableHeader,\n} from './table-enhancements';\nimport FontFamily from '@tiptap/extension-font-family';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { FontSize } from './font-size';\nimport { PageBreak } from './page-break';\nimport { DocxImage } from './docx-image';\nimport { TextTransform, LetterSpacing, LineHeight } from './text-layout';\nimport { ImageInteractions } from './image-interactions';\nimport { LegalBlock } from './legal-block';\nimport { ParagraphLayout } from './paragraph-layout';\nimport { InsertionMark, DeletionMark, TrackChanges } from './track-changes';\nimport { HistoryDiffOverlay } from './history-diff-overlay';\nimport { CommentMark, CommentsCore } from './comments';\nimport { ContentControlMark } from './content-controls';\nimport { BookmarkMark } from './bookmarks';\nimport { FieldMark } from './fields';\n\n/**\n * The default set of TipTap extensions used by DocxEditor.\n *\n * NOTE: We intentionally use a permissive `any[]` return type here because\n * TipTap's Extension/Node/Mark are structurally distinct in TypeScript, even\n * though they're all valid `extensions` array entries at runtime.\n */\nexport function defaultTipTapExtensions(): any[] {\n  return [\n    StarterKit.configure({\n      heading: { levels: [1, 2, 3, 4, 5, 6] },\n      bulletList: { keepMarks: true, keepAttributes: false },\n      orderedList: { keepMarks: true, keepAttributes: false },\n      listItem: { HTMLAttributes: { class: 'docx-editor-list-item' } },\n      codeBlock: { HTMLAttributes: { class: 'docx-editor-code-block' } },\n    }),\n    Underline,\n    TextAlign.configure({ types: ['heading', 'paragraph'] }),\n    TextStyle,\n    Color,\n    FontFamily,\n    FontSize,\n    Highlight.configure({ multicolor: true }),\n    Subscript,\n    Superscript,\n    TextTransform,\n    LetterSpacing,\n    LineHeight,\n    LegalBlock,\n    ParagraphLayout,\n    Link.configure({\n      openOnClick: false,\n      autolink: true,\n      HTMLAttributes: { class: 'docx-editor-link', rel: 'noopener noreferrer nofollow' },\n    }),\n    // Use our custom Image (with alignment + wrap) instead of TipTap's default\n    DocxImage.configure({ inline: false, allowBase64: true }),\n    PageBreak,\n    Table.configure({ resizable: true, HTMLAttributes: { class: 'docx-editor-table' } }),\n    TableRow,\n    TableHeader,\n    TableCell,\n    Placeholder.configure({\n      placeholder: 'Start writing, or type \"/\" for commands…',\n      emptyEditorClass: 'is-editor-empty',\n    }),\n    // Image interactions: clipboard paste, drag-and-drop\n    ImageInteractions,\n    // Suggesting-mode track changes (insertion/deletion marks + plugin)\n    InsertionMark,\n    DeletionMark,\n    TrackChanges,\n    // Edit-history hover-diff preview (decoration-only, never mutates content)\n    HistoryDiffOverlay,\n    // Comments: text-anchored highlight mark + add/remove-anchor commands\n    CommentMark,\n    CommentsCore,\n    // Content controls (w:sdt) — bordered placeholder mark, inline-scope v1\n    ContentControlMark,\n    // Bookmarks (w:bookmarkStart/End) — invisible anchor mark for internal links\n    BookmarkMark,\n    // Simple fields (w:fldSimple) — cached display text, not live\n    FieldMark,\n  ];\n}\n\n/**\n * Common font families offered in the toolbar font picker. This drives\n * `@tiptap/extension-font-family` (registered below), which applies a\n * `font-family` inline style to the current selection via the `TextStyle`\n * mark — independent of `DocxEditorTheme.fontFamily` (the whole-document\n * default; see `theme.ts`'s `SINHALA_FONT_STACK`/`TAMIL_FONT_STACK`). Use\n * the theme for an all-Sinhala/all-Tamil document; use this picker to mix\n * scripts within one document (e.g. an English deed with a Sinhala clause).\n */\nexport const COMMON_FONT_FAMILIES: Array<{ label: string; value: string }> = [\n  { label: 'Default', value: '' },\n  { label: 'Arial', value: 'Arial, Helvetica, sans-serif' },\n  { label: 'Helvetica', value: 'Helvetica, Arial, sans-serif' },\n  { label: 'Times New Roman', value: '\"Times New Roman\", Times, serif' },\n  { label: 'Georgia', value: 'Georgia, serif' },\n  { label: 'Garamond', value: 'Garamond, serif' },\n  { label: 'Courier New', value: '\"Courier New\", Courier, monospace' },\n  { label: 'Verdana', value: 'Verdana, Geneva, sans-serif' },\n  { label: 'Tahoma', value: 'Tahoma, Geneva, sans-serif' },\n  { label: 'Trebuchet MS', value: '\"Trebuchet MS\", Helvetica, sans-serif' },\n  { label: 'Inter', value: 'Inter, system-ui, sans-serif' },\n  { label: 'Calibri', value: 'Calibri, Candara, sans-serif' },\n  { label: 'Cambria', value: 'Cambria, Georgia, serif' },\n  { label: 'Sinhala (Noto Sans Sinhala)', value: '\"Noto Sans Sinhala\", \"Iskoola Pota\", \"Nirmala UI\", sans-serif' },\n  { label: 'Tamil (Noto Sans Tamil)', value: '\"Noto Sans Tamil\", \"Latha\", \"Nirmala UI\", sans-serif' },\n];\n\n/** Common font sizes (in pt) offered in the toolbar font size picker. */\nexport const COMMON_FONT_SIZES: number[] = [\n  8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 72,\n];\n","import type { DocxEditorExtension } from '../types';\nimport { insertTableFitted } from './table-enhancements';\n\n// Re-export the default TipTap extension list\nexport { defaultTipTapExtensions } from './tiptap-defaults';\n\n/**\n * Builtin extensions contributed by the editor itself.\n * Each one is a small, focused DocxEditorExtension that:\n *  - registers the TipTap node/mark (already in defaultTipTapExtensions), AND\n *  - contributes toolbar buttons + slash commands for that feature.\n *\n * Users can replace any of these by registering their own extension with the\n * same id AFTER the builtins (the registry throws on duplicates, so they\n * should instead create the editor with `disableBuiltins: ['bold', ...]`).\n */\n\nexport const boldExtension: DocxEditorExtension = {\n  id: 'bold',\n  name: 'Bold',\n  toolbar: [\n    {\n      id: 'bold',\n      label: 'Bold',\n      icon: 'B',\n      tooltip: 'Bold (Ctrl+B)',\n      isActive: (ctx) => ctx.editor.isActive('bold'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleBold().run(),\n    },\n  ],\n};\n\nexport const italicExtension: DocxEditorExtension = {\n  id: 'italic',\n  name: 'Italic',\n  toolbar: [\n    {\n      id: 'italic',\n      label: 'Italic',\n      icon: 'I',\n      tooltip: 'Italic (Ctrl+I)',\n      isActive: (ctx) => ctx.editor.isActive('italic'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleItalic().run(),\n    },\n  ],\n};\n\nexport const underlineExtension: DocxEditorExtension = {\n  id: 'underline',\n  name: 'Underline',\n  toolbar: [\n    {\n      id: 'underline',\n      label: 'Underline',\n      icon: 'U',\n      tooltip: 'Underline (Ctrl+U)',\n      isActive: (ctx) => ctx.editor.isActive('underline'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleUnderline().run(),\n    },\n  ],\n};\n\nexport const strikeExtension: DocxEditorExtension = {\n  id: 'strike',\n  name: 'Strikethrough',\n  toolbar: [\n    {\n      id: 'strike',\n      label: 'Strikethrough',\n      icon: 'S',\n      tooltip: 'Strikethrough',\n      isActive: (ctx) => ctx.editor.isActive('strike'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleStrike().run(),\n    },\n  ],\n};\n\nexport const highlightExtension: DocxEditorExtension = {\n  id: 'highlight',\n  name: 'Highlight',\n  toolbar: [\n    {\n      id: 'highlight',\n      label: 'Highlight',\n      icon: 'H',\n      tooltip: 'Highlight',\n      isActive: (ctx) => ctx.editor.isActive('highlight'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleHighlight().run(),\n    },\n  ],\n};\n\nexport const headingExtension: DocxEditorExtension = {\n  id: 'heading',\n  name: 'Headings',\n  toolbar: [\n    {\n      id: 'h1',\n      label: 'H1',\n      tooltip: 'Heading 1',\n      isActive: (ctx) => ctx.editor.isActive('heading', { level: 1 }),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleHeading({ level: 1 }).run(),\n    },\n    {\n      id: 'h2',\n      label: 'H2',\n      tooltip: 'Heading 2',\n      isActive: (ctx) => ctx.editor.isActive('heading', { level: 2 }),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleHeading({ level: 2 }).run(),\n    },\n    {\n      id: 'h3',\n      label: 'H3',\n      tooltip: 'Heading 3',\n      isActive: (ctx) => ctx.editor.isActive('heading', { level: 3 }),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleHeading({ level: 3 }).run(),\n    },\n  ],\n  slashCommands: [\n    {\n      id: 'h1',\n      label: 'Heading 1',\n      description: 'Large section heading',\n      keywords: ['h1', 'heading', 'title'],\n      execute: (ctx) => ctx.editor.chain().focus().setHeading({ level: 1 }).run(),\n    },\n    {\n      id: 'h2',\n      label: 'Heading 2',\n      description: 'Medium section heading',\n      keywords: ['h2', 'subtitle'],\n      execute: (ctx) => ctx.editor.chain().focus().setHeading({ level: 2 }).run(),\n    },\n    {\n      id: 'h3',\n      label: 'Heading 3',\n      description: 'Small section heading',\n      keywords: ['h3'],\n      execute: (ctx) => ctx.editor.chain().focus().setHeading({ level: 3 }).run(),\n    },\n  ],\n};\n\nexport const listExtension: DocxEditorExtension = {\n  id: 'list',\n  name: 'Lists',\n  toolbar: [\n    {\n      id: 'bulletList',\n      label: '•',\n      tooltip: 'Bullet list',\n      isActive: (ctx) => ctx.editor.isActive('bulletList'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleBulletList().run(),\n    },\n    {\n      id: 'orderedList',\n      label: '1.',\n      tooltip: 'Numbered list',\n      isActive: (ctx) => ctx.editor.isActive('orderedList'),\n      onClick: (ctx) => ctx.editor.chain().focus().toggleOrderedList().run(),\n    },\n  ],\n  slashCommands: [\n    {\n      id: 'bulletList',\n      label: 'Bullet list',\n      description: 'Create a bulleted list',\n      keywords: ['ul', 'list', 'bullet'],\n      execute: (ctx) => ctx.editor.chain().focus().toggleBulletList().run(),\n    },\n    {\n      id: 'orderedList',\n      label: 'Numbered list',\n      description: 'Create a numbered list',\n      keywords: ['ol', 'list', 'numbered'],\n      execute: (ctx) => ctx.editor.chain().focus().toggleOrderedList().run(),\n    },\n  ],\n};\n\nexport const alignmentExtension: DocxEditorExtension = {\n  id: 'alignment',\n  name: 'Alignment',\n  toolbar: [\n    {\n      id: 'alignLeft',\n      label: '⬅',\n      tooltip: 'Align left',\n      isActive: (ctx) => ctx.editor.isActive({ textAlign: 'left' }),\n      onClick: (ctx) => ctx.editor.chain().focus().setTextAlign('left').run(),\n    },\n    {\n      id: 'alignCenter',\n      label: '⬌',\n      tooltip: 'Align center',\n      isActive: (ctx) => ctx.editor.isActive({ textAlign: 'center' }),\n      onClick: (ctx) => ctx.editor.chain().focus().setTextAlign('center').run(),\n    },\n    {\n      id: 'alignRight',\n      label: '➡',\n      tooltip: 'Align right',\n      isActive: (ctx) => ctx.editor.isActive({ textAlign: 'right' }),\n      onClick: (ctx) => ctx.editor.chain().focus().setTextAlign('right').run(),\n    },\n    {\n      id: 'alignJustify',\n      label: '☰',\n      tooltip: 'Justify',\n      isActive: (ctx) => ctx.editor.isActive({ textAlign: 'justify' }),\n      onClick: (ctx) => ctx.editor.chain().focus().setTextAlign('justify').run(),\n    },\n  ],\n};\n\nexport const codeBlockExtension: DocxEditorExtension = {\n  id: 'codeBlock',\n  name: 'Code block',\n  slashCommands: [\n    {\n      id: 'codeBlock',\n      label: 'Code block',\n      description: 'Insert a code block',\n      keywords: ['code', 'pre'],\n      execute: (ctx) => ctx.editor.chain().focus().toggleCodeBlock().run(),\n    },\n  ],\n};\n\nexport const blockquoteExtension: DocxEditorExtension = {\n  id: 'blockquote',\n  name: 'Blockquote',\n  slashCommands: [\n    {\n      id: 'blockquote',\n      label: 'Blockquote',\n      description: 'Insert a quote block',\n      keywords: ['quote', 'cite'],\n      execute: (ctx) => ctx.editor.chain().focus().toggleBlockquote().run(),\n    },\n  ],\n};\n\nexport const horizontalRuleExtension: DocxEditorExtension = {\n  id: 'horizontalRule',\n  name: 'Horizontal rule',\n  slashCommands: [\n    {\n      id: 'horizontalRule',\n      label: 'Horizontal rule',\n      description: 'Insert a divider line',\n      keywords: ['hr', 'divider', 'line'],\n      execute: (ctx) => ctx.editor.chain().focus().setHorizontalRule().run(),\n    },\n  ],\n};\n\nexport const tableExtension: DocxEditorExtension = {\n  id: 'table',\n  name: 'Table',\n  slashCommands: [\n    {\n      id: 'table3x3',\n      label: 'Table 3×3',\n      description: 'Insert a 3-row × 3-column table',\n      keywords: ['table', 'grid'],\n      execute: (ctx) => insertTableFitted(ctx.editor, { rows: 3, cols: 3, withHeaderRow: true }),\n    },\n  ],\n};\n\nexport const imageExtension: DocxEditorExtension = {\n  id: 'image',\n  name: 'Image',\n  slashCommands: [\n    {\n      id: 'image',\n      label: 'Image',\n      description: 'Insert an image from URL',\n      keywords: ['img', 'picture', 'photo'],\n      execute: (ctx) => {\n        const url = typeof window !== 'undefined' ? window.prompt('Image URL') : null;\n        if (url) ctx.editor.chain().focus().setImage({ src: url }).run();\n      },\n    },\n  ],\n};\n\nexport const linkExtension: DocxEditorExtension = {\n  id: 'link',\n  name: 'Link',\n  toolbar: [\n    {\n      id: 'link',\n      label: '🔗',\n      tooltip: 'Add link',\n      isActive: (ctx) => ctx.editor.isActive('link'),\n      onClick: (ctx) => {\n        const prev = ctx.editor.getAttributes('link').href;\n        const url = typeof window !== 'undefined' ? window.prompt('URL', prev) : null;\n        if (url === null) return;\n        if (url === '') {\n          ctx.editor.chain().focus().extendMarkRange('link').unsetLink().run();\n        } else {\n          ctx.editor\n            .chain()\n            .focus()\n            .extendMarkRange('link')\n            .setLink({ href: url })\n            .run();\n        }\n      },\n    },\n  ],\n};\n\n/**\n * The full list of builtin DocxEditorExtensions.\n * Used by default; users can disable any subset via `disableBuiltins`.\n */\nexport const builtinExtensions: DocxEditorExtension[] = [\n  boldExtension,\n  italicExtension,\n  underlineExtension,\n  strikeExtension,\n  highlightExtension,\n  headingExtension,\n  listExtension,\n  alignmentExtension,\n  codeBlockExtension,\n  blockquoteExtension,\n  horizontalRuleExtension,\n  tableExtension,\n  imageExtension,\n  linkExtension,\n];\n\nexport const builtinExtensionIds = builtinExtensions.map((e) => e.id);\n","/**\n * Watermark — a repeating, tiled diagonal text overlay on the page.\n *\n * Implementation: we don't store the watermark in the document JSON (it's a\n * page-level property, not content). Instead, the DocxEditor class holds the\n * watermark state and renders it as a single absolutely-positioned overlay\n * (`inset: 0`) on the page element, whose `background-image` is a small SVG\n * tile containing one rotated instance of the watermark text, repeated via\n * `background-repeat: repeat`.\n *\n * Tiling (rather than one centered instance) is what makes this work for\n * BOTH view modes with the same code path:\n *   - 'paged': the page element's height already spans every simulated\n *     page, so the tile repeats down through all of them.\n *   - 'pageless': the page is one continuous flowing surface with no fixed\n *     height, so a single centered watermark would only ever be visible\n *     once, near the top. Tiling keeps it visible throughout.\n * The browser handles the repetition natively, so nothing needs to be\n * recomputed as the page grows (new pages added, more content typed, etc).\n *\n * This module exports:\n *   - WatermarkConfig type\n *   - Default presets (CONFIDENTIAL, DRAFT, DO NOT COPY, etc.)\n *   - createWatermarkElement — the (only) DOM builder\n */\n\nexport interface WatermarkConfig {\n  /** The text to show. */\n  text: string;\n  /** Font size in px. Default: 56. */\n  fontSize?: number;\n  /** Font family. Default: sans-serif. */\n  fontFamily?: string;\n  /** Text color (CSS). Default: 'rgba(208, 7, 7, 0.18)'. */\n  color?: string;\n  /** Rotation in degrees. Default: -30 (diagonal, bottom-left to top-right). */\n  rotation?: number;\n  /** Opacity 0-1. Default: 0.18. */\n  opacity?: number;\n}\n\nexport const DEFAULT_WATERMARK_PRESETS: Array<{ label: string; config: WatermarkConfig }> = [\n  {\n    label: 'CONFIDENTIAL',\n    config: { text: 'CONFIDENTIAL', color: 'rgba(208, 7, 7, 0.18)', fontSize: 64 },\n  },\n  {\n    label: 'DRAFT',\n    config: { text: 'DRAFT', color: 'rgba(180, 83, 9, 0.2)', fontSize: 64 },\n  },\n  {\n    label: 'DO NOT COPY',\n    config: { text: 'DO NOT COPY', color: 'rgba(208, 7, 7, 0.18)', fontSize: 56 },\n  },\n  {\n    label: 'SAMPLE',\n    config: { text: 'SAMPLE', color: 'rgba(37, 99, 235, 0.18)', fontSize: 64 },\n  },\n  {\n    label: 'URGENT',\n    config: { text: 'URGENT', color: 'rgba(180, 83, 9, 0.2)', fontSize: 64 },\n  },\n  {\n    label: 'FINAL',\n    config: { text: 'FINAL', color: 'rgba(22, 163, 74, 0.18)', fontSize: 64 },\n  },\n];\n\nexport const DEFAULT_WATERMARK: WatermarkConfig = {\n  text: '',\n  fontSize: 56,\n  fontFamily: 'sans-serif',\n  color: 'rgba(208, 7, 7, 0.18)',\n  rotation: -30,\n  opacity: 0.18,\n};\n\nfunction escapeXml(s: string): string {\n  return s\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nexport interface WatermarkTile {\n  /** A `data:image/svg+xml;base64,...` URI — one rotated instance of the watermark text. */\n  dataUri: string;\n  tileWidth: number;\n  tileHeight: number;\n}\n\n/**\n * Build the repeating SVG tile a watermark renders as. Returns null if\n * there's no watermark text.\n *\n * Pure and DOM-free (only string/base64 work), so it's shared by both\n * `createWatermarkElement` (browser, wraps this in a DOM element) and the\n * Node-side PDF renderer (`io/pdf.ts`, which has no `document` to build an\n * element with but still needs the exact same tile — the watermark should\n * look identical on-screen and in an exported PDF, not be reimplemented\n * twice with a chance of drifting apart).\n */\nexport function buildWatermarkTile(config: WatermarkConfig | null): WatermarkTile | null {\n  if (!config || !config.text) return null;\n  const c = { ...DEFAULT_WATERMARK, ...config };\n  const fontSize = c.fontSize || 56;\n  // Tile size scales with font size so bigger text still has breathing\n  // room between repeats instead of overlapping itself.\n  const scale = fontSize / 56;\n  const tileW = Math.round(560 * scale);\n  const tileH = Math.round(340 * scale);\n  const rotation = c.rotation ?? -30;\n  const fill = c.color || 'rgba(208, 7, 7, 0.18)';\n  const opacity = c.opacity ?? 0.18;\n  const text = escapeXml(c.text.toUpperCase());\n\n  const svg = [\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${tileW}\" height=\"${tileH}\">`,\n    `<text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"middle\"`,\n    ` transform=\"rotate(${rotation} ${tileW / 2} ${tileH / 2})\"`,\n    ` font-family=\"${c.fontFamily}\" font-size=\"${fontSize}\" font-weight=\"700\"`,\n    ` letter-spacing=\"${(fontSize * 0.08).toFixed(1)}\"`,\n    ` fill=\"${fill}\" fill-opacity=\"${opacity}\">${text}</text>`,\n    `</svg>`,\n  ].join('');\n\n  const base64 =\n    typeof btoa === 'function'\n      ? btoa(unescape(encodeURIComponent(svg)))\n      : Buffer.from(svg, 'utf-8').toString('base64');\n\n  return {\n    dataUri: `data:image/svg+xml;base64,${base64}`,\n    tileWidth: tileW,\n    tileHeight: tileH,\n  };\n}\n\n/**\n * Build the watermark DOM element. Returns null if no watermark text.\n *\n * The element is a single overlay covering the whole page (`inset: 0`),\n * with a repeating SVG-tile background — one rotated instance of the text\n * per tile — so the watermark reads consistently down the entire document,\n * across every page, in both paged and pageless view modes.\n */\nexport function createWatermarkElement(config: WatermarkConfig | null): HTMLElement | null {\n  const tile = buildWatermarkTile(config);\n  if (!tile) return null;\n\n  const el = document.createElement('div');\n  el.className = 'docx-watermark';\n  el.setAttribute('contenteditable', 'false');\n  el.setAttribute('aria-hidden', 'true');\n  el.style.cssText = [\n    'position: absolute',\n    'inset: 0',\n    `background-image: url(\"${tile.dataUri}\")`,\n    'background-repeat: repeat',\n    `background-size: ${tile.tileWidth}px ${tile.tileHeight}px`,\n    'pointer-events: none',\n    'user-select: none',\n    'z-index: 1',\n  ].join('; ');\n  return el;\n}\n","/**\n * Pure, DOM-free helpers for describing WHAT a TipTap/ProseMirror JSON block\n * is (title? bullet? quote?) and for rendering its text with inline marks\n * (bold/italic/underline/...) made visible as lightweight markdown-like\n * syntax.\n *\n * Why this exists\n * ----------------\n * The agent used to be fed the plain text before/after the cursor and a\n * block *index*, but nothing about the block's *type* or the *marks* on the\n * text around the caret — so it could not tell a heading from a bulleted\n * item from bold body text, and would guess (usually wrong) when the user\n * said things like \"make this a title\" or \"match the formatting here\".\n *\n * These are plain functions over TipTap JSON (the same shape every tool in\n * `packages/agent/src/tools` already reads via `ctx.doc`), not raw\n * ProseMirror `Node` instances — so they work identically whether called\n * from the live editor (`editor.getJSON()`) or from a hand-built JSON doc in\n * a test, and can be shared verbatim between `DocxEditor.getCursorContext()`\n * (this package) and the agent's inspection tools (`packages/agent`)\n * instead of each maintaining its own copy.\n */\n\n/** Inline mark -> markdown-ish wrapper, used by `annotateNode`. */\nconst MARK_WRAP: Record<string, [string, string]> = {\n  bold: ['**', '**'],\n  italic: ['*', '*'],\n  underline: ['__', '__'],\n  strike: ['~~', '~~'],\n  code: ['`', '`'],\n  highlight: ['==', '=='],\n  superscript: ['^', '^'],\n  subscript: ['~', '~'],\n};\n\n/** Mark names `annotateNode`/`getCursorContext` know how to surface. */\nexport const KNOWN_MARK_NAMES = [\n  'bold',\n  'italic',\n  'underline',\n  'strike',\n  'code',\n  'highlight',\n  'subscript',\n  'superscript',\n  'link',\n] as const;\n\n/**\n * Human-readable label for a block's type — what an agent should say when\n * asked \"what is this block?\" (\"heading level 2\", \"bulleted list item\",\n * ...) rather than a bare schema name like `\"heading\"`.\n */\nexport function describeBlockType(node: any): string {\n  if (!node) return 'unknown';\n  switch (node.type) {\n    case 'heading':\n      return `heading (title), level ${node.attrs?.level ?? 1}`;\n    case 'bulletList':\n      return 'bulleted list';\n    case 'orderedList':\n      return 'numbered list';\n    case 'listItem':\n      return 'list item';\n    case 'blockquote':\n      return 'blockquote';\n    case 'codeBlock':\n      return 'code block';\n    case 'table':\n      return 'table';\n    case 'horizontalRule':\n      return 'horizontal rule';\n    case 'paragraph':\n      return 'paragraph';\n    default:\n      return String(node.type ?? 'unknown');\n  }\n}\n\n/** The block's paragraph-level alignment attr, if any set. */\nexport function getBlockAlignment(node: any): string | undefined {\n  return node?.attrs?.textAlign;\n}\n\n/**\n * Render a JSON node's text with inline marks made visible as lightweight\n * markdown-like syntax, plus structural prefixes for headings/lists/quotes/\n * code — the same information a sighted user gets for free from the\n * rendered page, collapsed into a single annotated string an LLM can read.\n *\n * Examples:\n *   heading level 2 \"Summary\"        -> \"## Summary\"\n *   paragraph with a bold word       -> \"This is **important**.\"\n *   bulleted list of 2 items         -> \"- first\\n- second\"\n *   blockquote                       -> \"> quoted text\"\n */\nexport function annotateNode(node: any): string {\n  if (!node) return '';\n\n  if (node.type === 'text') {\n    let text = node.text ?? '';\n    for (const m of node.marks ?? []) {\n      const wrap = MARK_WRAP[m.type];\n      if (wrap) text = `${wrap[0]}${text}${wrap[1]}`;\n      if (m.type === 'link' && m.attrs?.href) text = `[${text}](${m.attrs.href})`;\n    }\n    return text;\n  }\n\n  switch (node.type) {\n    case 'heading':\n      return `${'#'.repeat(node.attrs?.level ?? 1)} ${inlineText(node)}`;\n    case 'blockquote':\n      return (node.content ?? []).map((c: any) => `> ${annotateNode(c)}`).join('\\n');\n    case 'codeBlock':\n      return '```\\n' + inlineText(node) + '\\n```';\n    case 'bulletList':\n      return (node.content ?? []).map((li: any) => `- ${inlineText(li)}`).join('\\n');\n    case 'orderedList':\n      return (node.content ?? [])\n        .map((li: any, i: number) => `${i + 1}. ${inlineText(li)}`)\n        .join('\\n');\n    case 'listItem':\n      return inlineText(node);\n    default: {\n      // Most container node types here (paragraph, tableCell's default\n      // paragraph run, etc.) hold purely inline text content and should read\n      // as one continuous line; only join with a newline when the children\n      // are themselves block-level nodes (e.g. multiple paragraphs inside a\n      // table cell) so a single paragraph's text doesn't get torn apart with\n      // a stray '\\n' after every marked run.\n      const children = node.content ?? [];\n      const allInline = children.every((c: any) => c.type === 'text');\n      return children.map(annotateNode).join(allInline ? '' : '\\n');\n    }\n  }\n}\n\n/** Flatten a node's descendant text (with marks rendered inline) onto one line — used for list items/headings/code blocks whose own container shouldn't recurse into `annotateNode`'s block-level cases. */\nfunction inlineText(node: any): string {\n  if (!node) return '';\n  if (node.type === 'text') return annotateNode(node);\n  return (node.content ?? []).map(inlineText).join('');\n}\n","import mammoth from 'mammoth';\n\n/**\n * Load a .docx file (as ArrayBuffer) and convert it to TipTap-compatible HTML.\n *\n * The style map below is intentionally thorough — it maps every common\n * Word paragraph + character style to a semantic HTML element so that\n * TipTap can ingest it without losing structure.\n *\n * LAYOUT PRESERVATION:\n *   - Table widths are preserved via inline `style=\"width: ...\"` on <table> and <td>\n *   - Font sizes are preserved via inline `style=\"font-size: ...\"` on <span>\n *   - Text alignment is preserved via inline `style=\"text-align: ...\"` on <p>/<h1>-<h6>\n *   - Page breaks (w:br w:type=\"page\") are converted to <div data-page-break=\"true\"></div>\n *   - Images retain their original dimensions\n *   - List indentation is preserved\n *\n * Supported style mappings:\n *   - Headings: Heading 1-9 → h1-h6\n *   - Title / Subtitle → h1 / h2 (with class)\n *   - Quote / Intense Quote → blockquote\n *   - Bold / Italic / Underline / Strikethrough preserved\n *   - Bullet/numbered lists → ul/ol/li\n *   - Tables → table/thead/tbody/tr/th/td (with width preservation)\n *   - Images → img (data URI, original size)\n *   - Hyperlinks → a\n *   - Code / Source Code → pre\n *   - Page breaks → <div data-page-break=\"true\"></div>\n *   - Footnote text → dropped (out of scope)\n */\nconst DOCX_STYLE_MAP = [\n  // Character formatting (mammoth defaults handle b/i/u; we add s + sub/sup)\n  \"strike => s\",\n  \"vertAlign[superscript] => sup\",\n  \"vertAlign[subscript] => sub\",\n\n  // Paragraph styles — preserve alignment via inline style\n  \"p[style-name='Title'] => h1.docx-title:fresh\",\n  \"p[style-name='Subtitle'] => h2.docx-subtitle:fresh\",\n  \"p[style-name='Quote'] => blockquote:fresh\",\n  \"p[style-name='Intense Quote'] => blockquote.intense:fresh\",\n  \"p[style-name='Code'] => pre.docx-code:fresh\",\n  \"p[style-name='Source Code'] => pre.docx-code:fresh\",\n  \"p[style-name='HTML Preformatted'] => pre:fresh\",\n  \"p[style-name='Macro Text'] => pre.docx-code:fresh\",\n  \"p[style-name='Heading 1'] => h1:fresh\",\n  \"p[style-name='Heading 2'] => h2:fresh\",\n  \"p[style-name='Heading 3'] => h3:fresh\",\n  \"p[style-name='Heading 4'] => h4:fresh\",\n  \"p[style-name='Heading 5'] => h5:fresh\",\n  \"p[style-name='Heading 6'] => h6:fresh\",\n  \"p[style-name='Heading 7'] => h6:fresh\",\n  \"p[style-name='Heading 8'] => h6:fresh\",\n  \"p[style-name='Heading 9'] => h6:fresh\",\n\n  // List styles (mammoth handles numbering automatically; we just tag)\n  \"p[style-name='List Paragraph'] => p.docx-list:fresh\",\n  \"p[style-name='List Bullet'] => ul.docx-bullet > li:fresh\",\n  \"p[style-name='List Number'] => ol.docx-number > li:fresh\",\n\n  // TOC styles — render as plain paragraphs (TipTap doesn't have a TOC node)\n  \"p[style-name='TOC 1'] => p.docx-toc1:fresh\",\n  \"p[style-name='TOC 2'] => p.docx-toc2:fresh\",\n  \"p[style-name='TOC 3'] => p.docx-toc3:fresh\",\n  \"p[style-name='Hyperlink'] => a:fresh\",\n\n  // Caption\n  \"p[style-name='Caption'] => p.docx-caption:fresh\",\n  \"p[style-name='Image Caption'] => p.docx-caption:fresh\",\n  \"p[style-name='Table Caption'] => p.docx-caption:fresh\",\n\n  // Default: paragraph. mammoth already does this, but being explicit helps.\n  \"p => p:fresh\",\n];\n\n/**\n * Post-process the HTML from mammoth to preserve layout:\n *   1. Convert `<br style=\"page-break-before: always\" />` and similar to\n *      `<div data-page-break=\"true\"></div>` (our PageBreak node format).\n *   2. Add `style=\"width: 100%\"` to tables that don't have a width.\n *   3. Preserve font-size spans from mammoth.\n *   4. Ensure paragraphs have proper spacing.\n */\nfunction postProcessHTML(html: string): string {\n  let result = html;\n\n  // 1. Convert page-break-before/after to our pageBreak div\n  // mammoth renders page breaks as <br> with inline style or as empty paragraphs\n  result = result.replace(\n    /<br\\s+style=\"[^\"]*page-break[^\"]*\"[^>]*>/gi,\n    '</p><div data-page-break=\"true\"></div><p>',\n  );\n  // Also handle page-break in paragraph styles\n  result = result.replace(\n    /<p\\s+style=\"[^\"]*page-break-before:\\s*always[^\"]*\"[^>]*>(.*?)<\\/p>/gis,\n    '</p><div data-page-break=\"true\"></div><p>$1</p>',\n  );\n\n  // 2. Ensure tables have width: 100% if no width specified\n  result = result.replace(\n    /<table(?![^>]*style=\"[^\"]*width)/gi,\n    '<table style=\"width: 100%; border-collapse: collapse;\"',\n  );\n\n  // 3. Wrap font-size styles in proper spans (mammoth sometimes outputs raw)\n  // Already handled by mammoth's default behavior\n\n  // 4. Clean up empty paragraphs that mammoth sometimes generates\n  result = result.replace(/<p>\\s*<\\/p>/gi, '');\n\n  // 5. Ensure list items have proper spacing\n  result = result.replace(/<li>/gi, '<li style=\"margin-bottom: 4px;\">');\n\n  return result;\n}\n\n/**\n * Convert a .docx ArrayBuffer to HTML.\n *\n * Returns well-formed HTML that TipTap can ingest via `editor.commands.setContent(html)`.\n * Layout is preserved via inline styles and the post-processing step.\n */\nexport async function loadDocxToHTML(buffer: ArrayBuffer): Promise<string> {\n  const result = await mammoth.convertToHtml(\n    { arrayBuffer: buffer },\n    { styleMap: DOCX_STYLE_MAP },\n  );\n\n  if (result.messages && result.messages.length > 0) {\n    if (typeof console !== 'undefined' && (console as any).debug) {\n      (console as any).debug('[docx-editor] mammoth messages:', result.messages);\n    }\n  }\n\n  const html = result.value || '<p></p>';\n  return postProcessHTML(html);\n}\n\n/**\n * Load .docx and return both HTML and conversion messages.\n * Useful for surfacing \"X features were not supported\" warnings to the UI.\n */\nexport async function loadDocx(\n  buffer: ArrayBuffer,\n): Promise<{ html: string; messages: Array<{ type: string; message: string }> }> {\n  const result = await mammoth.convertToHtml(\n    { arrayBuffer: buffer },\n    { styleMap: DOCX_STYLE_MAP },\n  );\n  const html = postProcessHTML(result.value || '<p></p>');\n  return { html, messages: result.messages ?? [] };\n}\n","import { Editor } from '@tiptap/core';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { ExtensionRegistry } from './extensions/registry';\nimport type { DocxEditorExtension, ExtensionContext } from './extensions/types';\nimport { builtinExtensions, defaultTipTapExtensions } from './extensions/builtins';\nimport {\n  type WatermarkConfig,\n  DEFAULT_WATERMARK,\n  DEFAULT_WATERMARK_PRESETS,\n  createWatermarkElement,\n} from './extensions/builtins/watermark';\nimport { hasPendingSuggestions, listPendingSuggestionIds } from './extensions/builtins/track-changes';\nimport { listCommentAnchors, hasComments, type CommentAnchor } from './extensions/builtins/comments';\nimport type { HistoryCheckpointMeta } from './history-types';\nimport type { BlockDiffResult } from './react/history/historyDiff';\nimport { describeBlockType, getBlockAlignment, annotateNode, KNOWN_MARK_NAMES } from './context/block-format';\nimport { loadDocx } from './io/load';\nimport { saveDocxFromJSON, type SaveDocxOptions } from './io/save';\nimport { getEditorHTML, setEditorHTML } from './io/html';\nimport { loadEmbeddedFontsFromDocx } from './io/embedded-fonts';\nimport { parseDocxOOXML, readPageSetupFromDocx } from './io/ooxml-parser';\nimport { saveDocxSelective } from './io/ooxml-serializer';\nimport {\n  defaultTheme,\n  type DocxEditorTheme,\n  themeToCSSVars,\n  cssLengthToInches,\n} from './theme';\nimport {\n  type PageSetup,\n  DEFAULT_PAGE_SETUP,\n  resolvePageDimensions,\n  resolvePageDimensionsTwips,\n} from './page-setup';\n\nexport interface HeaderFooterConfig {\n  /** HTML content for the header (top of every page). */\n  headerHTML?: string;\n  /** HTML content for the footer (bottom of every page). */\n  footerHTML?: string;\n  /** Show \"Page X\" in the footer. Default: false. */\n  showPageNumber?: boolean;\n}\n\n/** Everything `io/pdf.ts`'s `renderHtmlToPdf` needs — see `DocxEditor.getExportSnapshot()`. */\nexport interface DocxEditorExportSnapshot {\n  /** The document's real HTML, from TipTap's own schema-aware serializer. */\n  html: string;\n  /** CSS custom properties (page geometry, typography) — from `themeToCSSVars(theme)`. */\n  themeCSSVars: string;\n  /** Current watermark config, or null if none is set. */\n  watermark: WatermarkConfig | null;\n  /** Header HTML (top of every page), or '' if none. */\n  headerHTML: string;\n  /** Footer HTML (bottom of every page), or '' if none. */\n  footerHTML: string;\n}\n\n/**\n * ViewMode — how the document surface is rendered.\n *\n *   - `'pageless'` (default): one continuous flowing surface, like Google\n *     Docs' \"Pageless\" format. Page breaks are visually disabled — they no\n *     longer simulate a page gap/shadow — and instead collapse into a thin\n *     section divider. There is no fixed page height, so content never gets\n *     chopped into simulated pages.\n *   - `'paged'`: the classic Word/Google-Docs paginated layout. Page breaks\n *     render as real page-separation gaps and the surface is laid out into\n *     discrete pages (see `_layoutPagination()`).\n */\nexport type ViewMode = 'pageless' | 'paged';\n\n/**\n * EditorMode — the Editing / Suggesting / Viewing switcher (matches Google\n * Docs' mode dropdown):\n *   - `'editing'` (default): normal editing, changes apply directly.\n *   - `'suggesting'`: still editable, but edits are tracked as suggestions\n *     (insertions underlined, deletions struck through, kept in the\n *     document) instead of applied directly — see `track-changes.ts`.\n *   - `'viewing'`: read-only; the formatting toolbar is disabled too.\n */\nexport type EditorMode = 'editing' | 'suggesting' | 'viewing';\n\n/**\n * A snapshot of what's around the cursor — see `DocxEditor.getCursorContext()`.\n */\nexport interface CursorContext {\n  /** Plain text immediately before the cursor (up to `contextChars` chars). */\n  before: string;\n  /** Plain text immediately after the cursor (up to `contextChars` chars). */\n  after: string;\n  /** 1-based page number containing the cursor (pageBreak nodes before it, +1). */\n  page: number;\n  /** Total number of pages in the document. */\n  totalPages: number;\n  /** 1-based index of the top-level block (paragraph/heading/etc.) containing the cursor. */\n  line: number;\n  /** Total number of top-level blocks in the document. */\n  totalLines: number;\n  /**\n   * Human-readable type of the block the cursor is in — e.g. \"heading\n   * (title), level 2\", \"bulleted list item\", \"paragraph\". This is the piece\n   * that used to be missing entirely: the agent knew *where* the cursor was\n   * but not *what kind of content* it was sitting in.\n   */\n  blockType: string;\n  /** The block's alignment ('left'/'center'/'right'/'justify'), if set. */\n  alignment?: string;\n  /**\n   * Character-level marks active AT THE CARET (bold/italic/underline/\n   * strike/code/highlight/subscript/superscript/link) — i.e. what typing\n   * right now would inherit, or what \"make this bold\" needs to check before\n   * deciding whether to toggle on or off. Empty array means plain text.\n   */\n  activeMarks: string[];\n  /**\n   * The cursor's entire block rendered with marks made visible as\n   * lightweight markdown (**bold**, *italic*, __underline__, ~~strike~~,\n   * `code`, ==highlight==) and structural prefixes for headings/lists/\n   * quotes (# / - / 1. / >) — see `annotateNode`. This lets the model see\n   * \"this is a bold, centered H2\" at a glance instead of inferring it from\n   * plain, unmarked text.\n   */\n  blockAnnotated: string;\n}\n\n/**\n * Render a `CursorContext` into a compact block of text suitable for\n * injecting into an LLM prompt, so an AI agent knows what's around the\n * cursor (and where the user is in the document) without needing the\n * whole document.\n */\nexport function formatCursorContext(ctx: CursorContext): string {\n  // `line` is 1-based; tools address blocks by a 0-based `index`. Surfacing\n  // the 0-based number here (plus the before/after arithmetic) is what lets\n  // the model act on \"above this\" / \"after this\" without an off-by-one — the\n  // absence of this hint is why it used to fall back to insert_at_cursor.\n  const cursorBlock = Math.max(0, ctx.line - 1);\n  const lines = [\n    \"Document context (where the user's cursor currently is):\",\n    `- Position: page ${ctx.page} of ${ctx.totalPages}, line ${ctx.line} of ${ctx.totalLines}`,\n    `- The cursor is in block index ${cursorBlock} (0-based), which is a ${ctx.blockType}` +\n      `${ctx.alignment ? `, aligned ${ctx.alignment}` : ''}. This is the block the user means by \"this\"/\"here\".`,\n    ctx.activeMarks.length\n      ? `- Formatting active exactly at the caret: ${ctx.activeMarks.join(', ')}.`\n      : '- No character formatting (bold/italic/underline/etc.) is active exactly at the caret.',\n  ];\n  if (ctx.blockAnnotated) {\n    lines.push(\n      `- The cursor's block, formatting shown inline (**bold**, *italic*, __underline__, ~~strike~~, ` +\n        `\\`code\\`, ==highlight==; # = heading level, - = bullet, 1. = numbered item, > = quote): ` +\n        `\"${ctx.blockAnnotated}\"`,\n    );\n  }\n  lines.push(\n    `- To add content ABOVE this block, insert at index ${cursorBlock}; to add it AFTER this block, insert at index ${cursorBlock + 1}. (Or just use insert_relative with position \"before\"/\"after\".)`,\n    `- Text immediately before the cursor: \"${ctx.before || '(start of document)'}\"`,\n    '- <-- cursor is here',\n    `- Text immediately after the cursor: \"${ctx.after || '(end of document)'}\"`,\n  );\n  return lines.join('\\n');\n}\n\nexport interface DocxEditorOptions {\n  /** DOM element to mount into. If omitted, call `mount(el)` later. */\n  element?: HTMLElement;\n  /** Initial HTML content. */\n  content?: string;\n  /** Theme tokens. */\n  theme?: DocxEditorTheme;\n  /**\n   * Page size/orientation/margins. Default: A4 portrait, 1in margins\n   * (`DEFAULT_PAGE_SETUP`). Resolved into `theme.pageWidth`/`pageHeight`/\n   * `pageMarginX`/`pageMarginY` before the initial paint — an explicit\n   * `theme.pageWidth` etc. still wins over this if both are given.\n   */\n  pageSetup?: PageSetup;\n  /** Editable flag. Default: true. */\n  editable?: boolean;\n  /** Document filename (shown in title bar). */\n  filename?: string;\n  /** Header/footer configuration. */\n  headerFooter?: HeaderFooterConfig;\n  /** Initial watermark. */\n  watermark?: WatermarkConfig;\n  /**\n   * Initial view mode — `'pageless'` (default, one continuous flowing\n   * surface) or `'paged'` (classic Word/Google-Docs pagination).\n   */\n  viewMode?: ViewMode;\n  /**\n   * Builtin extension ids to disable. Use this to remove default toolbar\n   * buttons / slash commands without writing your own replacement.\n   * Example: `disableBuiltins: ['bold', 'italic']`\n   * Pass `'*'` to disable ALL builtins.\n   */\n  disableBuiltins?: string[] | '*';\n  /**\n   * Custom extensions to register (in addition to builtins).\n   * If you want to fully replace builtins, pass `disableBuiltins: '*'`.\n   */\n  extensions?: DocxEditorExtension[];\n  /**\n   * Pass your own TipTap Extension array to fully control the schema.\n   * Defaults to `defaultTipTapExtensions()`.\n   */\n  tiptapExtensions?: any[];\n  /** Placeholder text when the document is empty. */\n  placeholder?: string;\n  /** Called whenever the document content changes. */\n  onUpdate?: (ctx: { editor: DocxEditor; json: any; html: string }) => void;\n  /** Called when the editor is created. */\n  onCreate?: (ctx: { editor: DocxEditor }) => void;\n}\n\n/**\n * DocxEditor — the public class.\n *\n * Wraps a TipTap Editor and adds:\n *   - .docx load/save (via mammoth + docx lib)\n *   - extension registry with toolbar + slash commands\n *   - paged paper-like layout (Word / Google Docs style)\n *   - theme tokens\n *\n * The editor surface is rendered as a \"page\" — a white card with shadow,\n * centered in a gray scrolling container. The page width and margins come\n * from the theme (default: 8.5×11\" with 1\" margins, matching Word).\n */\nexport class DocxEditor {\n  readonly registry: ExtensionRegistry;\n  readonly editor: Editor;\n  readonly theme: Required<DocxEditorTheme>;\n  readonly filename: string;\n  private readonly _host: HTMLElement | null;\n  private readonly _surface: HTMLElement;\n  private readonly _page: HTMLElement;\n  private readonly _content: HTMLElement;\n  private readonly _headerEl: HTMLElement | null = null;\n  private readonly _footerEl: HTMLElement | null = null;\n  private readonly _addPageBtn: HTMLElement | null = null;\n  private readonly _ctx: ExtensionContext;\n  private _watermark: WatermarkConfig | null = null;\n  private _watermarkEl: HTMLElement | null = null;\n  private _headerFooter: HeaderFooterConfig = {};\n  private _viewMode: ViewMode = 'pageless';\n  private _mode: EditorMode = 'editing';\n  private _pageSetup: PageSetup;\n  private _destroyed = false;\n  private _isLoading = false;\n  private _originalDocxBuffer: ArrayBuffer | null = null;\n  private _useOOXMLParser = false;\n  private _layoutRaf: number | null = null;\n  private _checkpointListeners = new Set<(meta: HistoryCheckpointMeta) => void>();\n\n  constructor(opts: DocxEditorOptions = {}) {\n    // Resolve page size/orientation/margins into theme fields BEFORE the\n    // initial host style string is built (below), so the very first paint\n    // is already at the right size — no flash of default-then-resized.\n    // Explicit `opts.theme.pageWidth`/etc. (power-user override) still wins.\n    const pageSetup = opts.pageSetup ?? DEFAULT_PAGE_SETUP;\n    const { widthPx, heightPx } = resolvePageDimensions(pageSetup);\n    const pageSetupTheme: Partial<DocxEditorTheme> = {\n      pageWidth: `${widthPx}px`,\n      pageHeight: `${heightPx}px`,\n      pageMarginX: `${pageSetup.marginX * 96}px`,\n      pageMarginY: `${pageSetup.marginY * 96}px`,\n    };\n    this.theme = { ...defaultTheme, ...pageSetupTheme, ...opts.theme };\n    this._pageSetup = pageSetup;\n    this.registry = new ExtensionRegistry();\n    this.filename = opts.filename ?? 'Untitled.docx';\n\n    // 1. Register builtins (unless disabled)\n    const disableAll = opts.disableBuiltins === '*';\n    const disabledSet = new Set<string>(\n      disableAll ? builtinExtensions.map((e) => e.id) : (opts.disableBuiltins ?? []),\n    );\n    for (const ext of builtinExtensions) {\n      if (!disabledSet.has(ext.id)) {\n        this.registry.register(ext);\n      }\n    }\n    // 2. Register user extensions\n    for (const ext of opts.extensions ?? []) {\n      this.registry.register(ext);\n    }\n\n    // 3. Build TipTap extension list: start from the explicit override or\n    //    the built-in defaults, then fold in `tiptapExtensions` contributed\n    //    by registered DocxEditorExtensions (builtin or user). This used to\n    //    be dropped silently — `tiptapExtensions` is documented (see\n    //    extensions/types.ts) as how an extension adds custom node/mark\n    //    types, but nothing here ever read it, so registering one added a\n    //    toolbar button (if any) while its actual TipTap schema extension\n    //    never reached the editor. Copy into a new array first so we never\n    //    mutate a caller-owned `opts.tiptapExtensions`.\n    const tiptapExts = [...(opts.tiptapExtensions ?? defaultTipTapExtensions())];\n    for (const ext of this.registry.list()) {\n      if (!ext.tiptapExtensions) continue;\n      const exts = Array.isArray(ext.tiptapExtensions) ? ext.tiptapExtensions : [ext.tiptapExtensions];\n      tiptapExts.push(...exts);\n    }\n\n    // 4. Build DOM structure:\n    //    <div class=\"docx-editor-host\">\n    //      <div class=\"docx-editor-surface\">  (scroll container)\n    //        <div class=\"docx-editor-page\">   (white paper)\n    //          <div class=\"docx-editor-header\" contenteditable />  (optional)\n    //          <div class=\"docx-editor-content\">  (sizing / padding wrapper)\n    //            <div class=\"ProseMirror\" contenteditable />  ← TipTap creates this\n    //          </div>\n    //          <div class=\"docx-editor-footer\" contenteditable />  (optional)\n    //          <div class=\"docx-watermark\" />  (overlay, optional)\n    //        </div>\n    //      </div>\n    //    </div>\n    this._viewMode = opts.viewMode ?? 'pageless';\n\n    const host = document.createElement('div');\n    host.className = 'docx-editor-host';\n    host.setAttribute('style', themeToCSSVars(this.theme));\n    host.setAttribute('data-view-mode', this._viewMode);\n\n    const surface = document.createElement('div');\n    surface.className = 'docx-editor-surface';\n\n    const page = document.createElement('div');\n    page.className = 'docx-editor-page';\n    page.style.position = 'relative'; // for watermark absolute positioning\n\n    // Header region (optional, contenteditable so the user can type into it)\n    let headerEl: HTMLElement | null = null;\n    if (opts.headerFooter?.headerHTML !== undefined || opts.headerFooter?.showPageNumber) {\n      headerEl = document.createElement('div');\n      headerEl.className = 'docx-editor-header';\n      headerEl.setAttribute('contenteditable', 'true');\n      headerEl.setAttribute('data-docx-region', 'header');\n      if (opts.headerFooter?.headerHTML) headerEl.innerHTML = opts.headerFooter.headerHTML;\n      page.appendChild(headerEl);\n    }\n\n    const content = document.createElement('div');\n    content.className = 'docx-editor-content';\n    page.appendChild(content);\n\n    // Footer region (optional)\n    let footerEl: HTMLElement | null = null;\n    if (opts.headerFooter?.footerHTML !== undefined || opts.headerFooter?.showPageNumber) {\n      footerEl = document.createElement('div');\n      footerEl.className = 'docx-editor-footer';\n      footerEl.setAttribute('contenteditable', 'true');\n      footerEl.setAttribute('data-docx-region', 'footer');\n      if (opts.headerFooter?.footerHTML) {\n        footerEl.innerHTML = opts.headerFooter.footerHTML;\n      } else if (opts.headerFooter?.showPageNumber) {\n        footerEl.innerHTML = '<p style=\"text-align:center\">Page 1</p>';\n      }\n      page.appendChild(footerEl);\n    }\n\n    surface.appendChild(page);\n\n    // \"Add new page\" button at the bottom of the surface\n    const addPageBtn = document.createElement('button');\n    addPageBtn.className = 'docx-editor-add-page';\n    addPageBtn.type = 'button';\n    addPageBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg> Add new page';\n    addPageBtn.title = 'Insert a page break to start a new page (Ctrl+Enter)';\n    surface.appendChild(addPageBtn);\n\n    host.appendChild(surface);\n\n    this._surface = surface;\n    this._page = page;\n    this._content = content;\n    this._host = host;\n    this._addPageBtn = addPageBtn;\n    this._headerEl = headerEl;\n    this._footerEl = footerEl;\n    this._headerFooter = opts.headerFooter ?? {};\n\n    // 5. Create the underlying TipTap editor. TipTap will append a\n    //    `<div class=\"ProseMirror\" contenteditable=\"true\">` into `content`.\n    this.editor = new Editor({\n      element: content,\n      extensions: tiptapExts,\n      content: opts.content ?? '<p></p>',\n      editable: opts.editable ?? true,\n      editorProps: {\n        attributes: {\n          class: 'docx-editor-prosemirror',\n          'data-placeholder': opts.placeholder ?? 'Start writing, or type \"/\" for commands…',\n          role: 'textbox',\n          'aria-multiline': 'true',\n          spellcheck: 'true',\n        },\n      },\n      onUpdate: ({ editor: ed }) => {\n        if (this._isLoading) return; // skip updates while loading .docx\n        this._layoutPagination();\n        opts.onUpdate?.({ editor: this, json: ed.getJSON(), html: ed.getHTML() });\n      },\n      onCreate: () => {\n        opts.onCreate?.({ editor: this });\n        // Ensure the ProseMirror element inherits our content styling\n        const pm = content.querySelector('.ProseMirror');\n        if (pm) {\n          // Make sure clicks anywhere in the content area focus the editor\n          content.addEventListener('mousedown', (e) => {\n            if (e.target === content || e.target === page) {\n              this.editor.chain().focus().run();\n            }\n          });\n        }\n        // Lay out pages on creation\n        this._layoutPagination();\n        // Re-layout once embedded/web fonts finish loading — font metrics\n        // can shift text height enough to move page-break boundaries.\n        (document as any).fonts?.ready?.then(() => this._scheduleLayoutPagination());\n        // Re-layout whenever an image finishes loading (its final height\n        // isn't known until then, and it can push page breaks around).\n        content.addEventListener(\n          'load',\n          (e) => {\n            if ((e.target as HTMLElement)?.tagName === 'IMG') this._scheduleLayoutPagination();\n          },\n          true,\n        );\n        // Wire the \"Add new page\" button\n        if (this._addPageBtn) {\n          this._addPageBtn.addEventListener('click', () => {\n            const endPos = this.editor.state.doc.content.size;\n            this.editor.chain().focus().insertContentAt(endPos, [\n              { type: 'pageBreak' },\n              { type: 'paragraph' },\n            ]).run();\n            // Re-layout after adding the page break\n            this._layoutPagination();\n            // Scroll to the new page\n            setTimeout(() => {\n              this._addPageBtn?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n            }, 100);\n          });\n        }\n        // Wire page break click-to-delete — only when clicking within the\n        // visible page-gap band itself, not the (much larger) filler area\n        // that represents the tail margin of one page / top margin of the next.\n        content.addEventListener('click', (e) => {\n          const target = e.target as HTMLElement;\n          const pb = target.closest('.docx-page-break') as HTMLElement | null;\n          if (!pb) return;\n\n          const gapTop = parseFloat(pb.style.getPropertyValue('--pb-gap-top')) || 0;\n          const gapBottom = parseFloat(pb.style.getPropertyValue('--pb-gap-bottom')) || 0;\n          const clickY = e.clientY - pb.getBoundingClientRect().top;\n          if (clickY < gapTop || clickY > gapBottom) return; // clicked filler space, ignore\n\n          e.preventDefault();\n          e.stopPropagation();\n          // Ask user to confirm deletion\n          if (confirm('Delete this page break?')) {\n            const view = this.editor.view;\n            const pos = view.posAtDOM(pb, 0);\n            if (pos >= 0) {\n              const node = view.state.doc.nodeAt(pos);\n              if (node && node.type.name === 'pageBreak') {\n                const tr = view.state.tr.delete(pos, pos + node.nodeSize);\n                view.dispatch(tr);\n                this._layoutPagination();\n              }\n            }\n          }\n        });\n        // Apply initial watermark if provided\n        if (opts.watermark) {\n          this.setWatermark(opts.watermark);\n        }\n        for (const ext of this.registry.list()) {\n          ext.onInit?.(this._ctx);\n        }\n      },\n    });\n\n    // 6. Build extension context\n    this._ctx = {\n      editor: this.editor,\n      insertHTML: (html: string) => this.editor.chain().focus().insertContent(html).run(),\n      insertText: (text: string) => this.editor.chain().focus().insertContent(text).run(),\n      focus: () => this.editor.chain().focus().run(),\n      getJSON: () => this.editor.getJSON(),\n      getHTML: () => this.editor.getHTML(),\n      setJSON: (json: any) => this.editor.commands.setContent(json),\n      setHTML: (html: string) => this.editor.commands.setContent(html),\n    };\n\n    // 7. Mount if element was provided\n    if (opts.element) {\n      this.mount(opts.element);\n    }\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Lifecycle                                                          */\n  /* ------------------------------------------------------------------ */\n\n  /** Mount the editor into a DOM element. */\n  mount(el: HTMLElement): void {\n    if (this._destroyed) throw new Error('Cannot mount a destroyed DocxEditor.');\n    if (!this._host) throw new Error('Editor already mounted (host is null).');\n    el.appendChild(this._host);\n    el.classList.add('docx-editor-mounted');\n  }\n\n  /** Destroy the editor and free resources. */\n  destroy(): void {\n    if (this._destroyed) return;\n    if (this._layoutRaf !== null) {\n      cancelAnimationFrame(this._layoutRaf);\n      this._layoutRaf = null;\n    }\n    for (const ext of this.registry.list()) {\n      try {\n        ext.onDestroy?.(this._ctx);\n      } catch (e) {\n        console.error('[docx-editor] Extension onDestroy threw:', e);\n      }\n    }\n    this.editor.destroy();\n    this._host?.remove();\n    this._destroyed = true;\n  }\n\n  /** Returns true if `destroy()` has been called. */\n  get destroyed(): boolean {\n    return this._destroyed;\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* .docx I/O                                                          */\n  /* ------------------------------------------------------------------ */\n\n  /** Load a .docx file (ArrayBuffer) into the editor. */\n  async loadDocx(buffer: ArrayBuffer): Promise<void> {\n    this._isLoading = true;\n    this._originalDocxBuffer = buffer; // Store for selective save\n    try {\n      // Load embedded fonts FIRST (before rendering content)\n      await loadEmbeddedFontsFromDocx(buffer);\n\n      // Restore the file's own page size/orientation/margins so the editor\n      // matches what it actually used, instead of leaving whatever page\n      // setup was showing beforehand (e.g. the app default or a different\n      // previously-loaded/saved document's size). Independent of — and\n      // read regardless of which body-content parser (OOXML vs mammoth\n      // fallback) ends up succeeding below, since page geometry lives in\n      // <w:sectPr>, separate from body content. Best-effort: a file with no\n      // readable sectPr leaves the current page setup untouched rather than\n      // resetting it to a default.\n      try {\n        const pageSetup = await readPageSetupFromDocx(buffer);\n        if (pageSetup) this.setPageSetup(pageSetup);\n      } catch (e) {\n        console.warn('[docx-editor] Could not read page setup from .docx:', e);\n      }\n\n      // Try high-fidelity OOXML parser first\n      try {\n        const parsed = await parseDocxOOXML(buffer);\n        if (parsed.json?.content?.length > 0) {\n          this.setJSON(parsed.json);\n          this._useOOXMLParser = true;\n          if (parsed.headerHTML) this.setHeaderHTML(parsed.headerHTML);\n          if (parsed.footerHTML) this.setFooterHTML(parsed.footerHTML);\n          this.editor.commands.focus();\n          return;\n        }\n      } catch (e) {\n        console.warn('[docx-editor] OOXML parser failed, falling back to mammoth:', e);\n      }\n\n      // Fallback: mammoth (lossy but reliable)\n      const { html } = await loadDocx(buffer);\n      this.setHTML(html);\n      this._useOOXMLParser = false;\n      this.editor.commands.focus();\n    } finally {\n      this._isLoading = false;\n    }\n  }\n\n  /**\n   * Save the current document as a .docx Blob. The live page setup (size/\n   * orientation/margins — see `setPageSetup()`) is exported by default, so\n   * the saved file matches what's shown on screen; pass `options.pageDimensions`\n   * explicitly to override it.\n   */\n  async saveDocx(options?: SaveDocxOptions): Promise<Blob> {\n    return saveDocxFromJSON(this.getJSON(), {\n      pageDimensions: resolvePageDimensionsTwips(this._pageSetup),\n      // The generated package's `styles.xml` is built from this, so the file\n      // opens in Word with the same body font/size/line height it was edited\n      // in rather than Word's own defaults.\n      theme: this.theme,\n      headerHTML: this.getHeaderHTML() || undefined,\n      footerHTML: this.getFooterHTML() || undefined,\n      ...options,\n    });\n  }\n\n  /**\n   * Save the current document using selective XML patching.\n   * If the document was loaded from a .docx file, this patches only the\n   * changed paragraphs in the original XML — preserving unchanged content\n   * byte-for-byte for Word Compare compatibility.\n   *\n   * Falls back to saveDocx() if no original buffer is available.\n   */\n  async saveDocxWithSelectivePatch(): Promise<Blob> {\n    if (this._originalDocxBuffer) {\n      try {\n        const buffer = await saveDocxSelective(\n          this.getJSON(),\n          this._originalDocxBuffer,\n          undefined, // all blocks changed (full patch)\n          resolvePageDimensionsTwips(this._pageSetup),\n        );\n        return new Blob([buffer], {\n          type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n        });\n      } catch (e) {\n        console.warn('[docx-editor] Selective save failed, falling back to full save:', e);\n      }\n    }\n    return this.saveDocx();\n  }\n\n  /** Trigger a browser download of the current document as a .docx file. */\n  async downloadDocx(filename?: string, options?: SaveDocxOptions): Promise<void> {\n    const blob = await this.saveDocx(options);\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename ?? this.filename;\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    setTimeout(() => URL.revokeObjectURL(url), 1000);\n  }\n\n  /**\n   * Open the browser's native print dialog, scoped to just the document\n   * content — the surrounding chrome (title/menu/toolbar/status bars, the\n   * agent panel) is hidden via a `@media print` stylesheet, and explicit\n   * page breaks are honored via `break-after: page`. Choosing \"Save as\n   * PDF\" there is a zero-setup export: no server, no extra dependency.\n   *\n   * This is the lower-fidelity, no-network sibling of `renderHtmlToPdf()`\n   * (`@shashimadushan/docx-editor-editor/headless`), which needs a Node/Puppeteer (or\n   * Playwright) server round trip but produces a file with no user\n   * interaction and doesn't depend on the browser's own print\n   * implementation. `<ReactDocxEditor onExportPdf>` lets a host app swap in\n   * that server-rendered path later without changing the toolbar button.\n   */\n  printToPdf(): void {\n    // The browser's own print header/footer (page title, date, URL) is a\n    // print-dialog setting, not something CSS can remove — but the title\n    // it shows comes from `document.title`, so blank that out for the\n    // duration of the print so it doesn't leak the host page's title.\n    const originalTitle = document.title;\n    document.title = '';\n\n    // `@page { size: ... }` can't reliably read CSS custom properties (var()\n    // support inside @page is inconsistent across browsers), so the actual\n    // physical page size has to be injected as a plain-value <style> tag at\n    // print time instead. Without this, the print dialog falls back to\n    // whatever paper size the browser/OS defaults to (often A4), which\n    // doesn't match the editor's on-screen page — that mismatch is what\n    // makes printed line-wrap/table widths and pagination drift from what\n    // was shown on screen.\n    const pageStyle = document.createElement('style');\n    pageStyle.setAttribute('data-docx-editor-print-page-size', '');\n    pageStyle.textContent = `@page { size: ${cssLengthToInches(this.theme.pageWidth)}in ${cssLengthToInches(this.theme.pageHeight)}in; margin: 0; }`;\n    document.head.appendChild(pageStyle);\n\n    const restore = () => {\n      document.title = originalTitle;\n      pageStyle.remove();\n      window.removeEventListener('afterprint', restore);\n    };\n    window.addEventListener('afterprint', restore);\n    window.print();\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Content accessors                                                  */\n  /* ------------------------------------------------------------------ */\n\n  getJSON(): any {\n    return this.editor.getJSON();\n  }\n\n  getHTML(): string {\n    return getEditorHTML(this.editor);\n  }\n\n  /**\n   * Load JSON as the initial/loaded document: suppresses `onUpdate` and\n   * dirty-tracking, since this represents a fresh load rather than an edit\n   * (used by `loadDocx()` and draft-restore). For programmatic edits that\n   * should behave like something the user did — including everything the\n   * agent package does — use `replaceContent()` instead.\n   */\n  setJSON(json: any): void {\n    this._isLoading = true;\n    try {\n      this._replaceDoc(json);\n    } finally {\n      this._isLoading = false;\n    }\n    this._layoutPagination();\n  }\n\n  /**\n   * Replace the whole document with `json` as a normal edit: it fires\n   * `onUpdate` (so autosave/dirty-tracking sees it) and participates in\n   * undo/redo like anything the user could have typed — unlike `setJSON()`,\n   * which is reserved for the initial-load path and deliberately suppresses\n   * both.\n   *\n   * This is what the agent package's tools mutate through (via\n   * `AgentToolContext.setDoc`), since an agent edit should be undoable and\n   * visible to autosave exactly like a manual edit.\n   */\n  replaceContent(json: any): void {\n    this._replaceDoc(json);\n    this._layoutPagination();\n  }\n\n  /**\n   * Core document-replace primitive shared by `setJSON()` and\n   * `replaceContent()`: builds ONE ProseMirror transaction that swaps in\n   * `json` as the new document (the same `tr.replaceWith(0, size, node)`\n   * technique TipTap's own `setContent` command uses internally), then\n   * remaps the caret through that same transaction and clamps it into the\n   * new document.\n   *\n   * Plain `editor.commands.setContent()` does the replace but never\n   * restores the selection afterward, so every full-document replace (every\n   * agent tool call, since tools mutate a JSON copy and write it back\n   * wholesale) silently dropped the user's cursor. Doing the replace\n   * ourselves lets us carry the caret through in the same transaction.\n   */\n  private _replaceDoc(json: any): void {\n    const { state, view } = this.editor;\n    const newDoc = state.schema.nodeFromJSON(json);\n    const tr = state.tr;\n    const caretPos = state.selection.head;\n    tr.replaceWith(0, tr.doc.content.size, newDoc);\n    const clamped = Math.min(caretPos, tr.doc.content.size);\n    tr.setSelection(TextSelection.near(tr.doc.resolve(clamped)));\n    view.dispatch(tr);\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Edit history checkpoints                                           */\n  /* ------------------------------------------------------------------ */\n\n  /**\n   * Subscribe to checkpoint events (manual saves, agent turns, reverts).\n   * `DocxEditor` itself holds no history storage — this is a plain pub/sub\n   * bus; `HistoryManager` (`react/history.ts`) is what subscribes, snapshots\n   * `getJSON()`, and persists it via a `HistoryStorageAdapter`. Returns an\n   * unsubscribe function.\n   */\n  onCheckpoint(listener: (meta: HistoryCheckpointMeta) => void): () => void {\n    this._checkpointListeners.add(listener);\n    return () => this._checkpointListeners.delete(listener);\n  }\n\n  /**\n   * Announce that a checkpoint-worthy moment happened (a manual save, or —\n   * from `packages/agent`'s `DocxAgent.editor.recordCheckpoint(...)` — a\n   * completed agent turn that mutated the document). Fires `onCheckpoint`\n   * listeners; does not itself read or store document content.\n   */\n  recordCheckpoint(meta: HistoryCheckpointMeta): void {\n    this._checkpointListeners.forEach((l) => l(meta));\n  }\n\n  setHTML(html: string): void {\n    this._isLoading = true;\n    try {\n      setEditorHTML(this.editor, html);\n    } finally {\n      this._isLoading = false;\n    }\n    this._layoutPagination();\n  }\n\n  getText(): string {\n    return this.editor.getText();\n  }\n\n  setEditable(editable: boolean): void {\n    this.editor.setEditable(editable);\n  }\n\n  getEditable(): boolean {\n    return this.editor.isEditable;\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Editing / Suggesting / Viewing mode                                */\n  /* ------------------------------------------------------------------ */\n\n  /** Get the current mode. Default: 'editing'. */\n  getMode(): EditorMode {\n    return this._mode;\n  }\n\n  /**\n   * Switch between 'editing' (normal), 'suggesting' (edits are tracked as\n   * insertions/deletions instead of applied directly), and 'viewing'\n   * (read-only). See `EditorMode`.\n   */\n  setMode(mode: EditorMode): void {\n    this._mode = mode;\n    this.editor.setEditable(mode !== 'viewing');\n    this.editor.commands.setTrackChangesEnabled(mode === 'suggesting');\n  }\n\n  /** Set the display name attached to suggestions made from now on. Default: 'You'. */\n  setSuggestionAuthor(author: string): void {\n    this.editor.commands.setTrackChangesAuthor(author);\n  }\n\n  /** Does the document currently have any pending (unresolved) suggestions? */\n  hasPendingSuggestions(): boolean {\n    return hasPendingSuggestions(this.editor.state.doc);\n  }\n\n  /** Ids of all pending suggestions, in document order. */\n  listPendingSuggestionIds(): string[] {\n    return listPendingSuggestionIds(this.editor.state.doc);\n  }\n\n  /** Accept every pending suggestion (insertions kept, deletions applied). */\n  acceptAllSuggestions(): void {\n    this.editor.commands.acceptAllSuggestions();\n  }\n\n  /** Reject every pending suggestion (insertions discarded, deletions undone). */\n  rejectAllSuggestions(): void {\n    this.editor.commands.rejectAllSuggestions();\n  }\n\n  /** Accept a single suggestion (all marks sharing this change id). */\n  acceptSuggestion(id: string): void {\n    this.editor.commands.acceptSuggestion(id);\n  }\n\n  /** Reject a single suggestion (all marks sharing this change id). */\n  rejectSuggestion(id: string): void {\n    this.editor.commands.rejectSuggestion(id);\n  }\n\n  /**\n   * Highlight the blocks that changed between `diff` (from\n   * `diffHistoryBlocks()` in `react/history/historyDiff.ts`) and the current\n   * document — decoration-only, never edits content or participates in\n   * undo/redo. Called from the History drawer's `onMouseEnter`; pair with\n   * `clearHistoryDiffPreview()` on `onMouseLeave`.\n   */\n  previewHistoryDiff(diff: BlockDiffResult): void {\n    this.editor.commands.setHistoryDiffPreview(diff);\n  }\n\n  /** Clear the hover-diff highlight set by `previewHistoryDiff()`. */\n  clearHistoryDiffPreview(): void {\n    this.editor.commands.clearHistoryDiffPreview();\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Comments (text-anchored, independent of Suggesting-mode)           */\n  /* ------------------------------------------------------------------ */\n\n  /** Anchor a new comment thread's highlight over `[from, to)`, keyed by `id`. */\n  addCommentAnchor(id: string, from: number, to: number): void {\n    this.editor.commands.addCommentMark(id, from, to);\n  }\n\n  /** Remove a comment thread's highlight (all marks sharing this id). */\n  removeCommentAnchor(id: string): void {\n    this.editor.commands.removeCommentMark(id);\n  }\n\n  /** Current position + text of every comment anchor in the doc, in doc order. */\n  listCommentAnchors(): CommentAnchor[] {\n    return listCommentAnchors(this.editor.state.doc);\n  }\n\n  /** Does the document currently anchor any comments? */\n  hasComments(): boolean {\n    return hasComments(this.editor.state.doc);\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Extension API                                                      */\n  /* ------------------------------------------------------------------ */\n\n  registerExtension(ext: DocxEditorExtension): void {\n    this.registry.register(ext);\n    ext.onInit?.(this._ctx);\n  }\n\n  getToolbarButtons() {\n    const out: Array<{ extensionId: string; button: any }> = [];\n    for (const ext of this.registry.list()) {\n      for (const button of ext.toolbar ?? []) {\n        out.push({ extensionId: ext.id, button });\n      }\n    }\n    return out;\n  }\n\n  getSlashCommands() {\n    const out: Array<{ extensionId: string; command: any }> = [];\n    for (const ext of this.registry.list()) {\n      for (const cmd of ext.slashCommands ?? []) {\n        out.push({ extensionId: ext.id, command: cmd });\n      }\n    }\n    return out;\n  }\n\n  getExtensionContext(): ExtensionContext {\n    return this._ctx;\n  }\n\n  /** Returns the host element (root of the editor DOM). For advanced UIs. */\n  getHost(): HTMLElement | null {\n    return this._host;\n  }\n\n  /** Returns the page element (the white \"paper\"). */\n  getPage(): HTMLElement {\n    return this._page;\n  }\n\n  /** Returns the surface element (the scroll container around pages). */\n  getSurface(): HTMLElement {\n    return this._surface;\n  }\n\n  /** Set a loading indicator overlay on the editor surface. */\n  setLoading(loading: boolean, message?: string): void {\n    const existing = this._surface.querySelector('.docx-editor-loading');\n    if (loading) {\n      if (!existing) {\n        const overlay = document.createElement('div');\n        overlay.className = 'docx-editor-loading';\n        overlay.textContent = message ?? 'Loading…';\n        this._surface.appendChild(overlay);\n      } else if (message) {\n        existing.textContent = message;\n      }\n    } else if (existing) {\n      existing.remove();\n    }\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* View mode API (pageless / paged)                                   */\n  /* ------------------------------------------------------------------ */\n\n  /** Get the current view mode ('pageless' | 'paged'). Default: 'pageless'. */\n  getViewMode(): ViewMode {\n    return this._viewMode;\n  }\n\n  /**\n   * Switch between 'pageless' (one continuous flowing surface — the\n   * default) and 'paged' (classic Word/Google-Docs pagination).\n   *\n   * In 'pageless' mode, page breaks are visually disabled: they stop\n   * simulating a page gap/shadow and collapse into a thin section divider,\n   * and the page surface grows/shrinks with its content instead of being\n   * locked to fixed page-height increments.\n   */\n  setViewMode(mode: ViewMode): void {\n    if (this._viewMode === mode) return;\n    this._viewMode = mode;\n    this._host?.setAttribute('data-view-mode', mode);\n    if (mode === 'paged') {\n      this._layoutPagination();\n    } else {\n      this._resetPagination();\n    }\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Page setup API (size / orientation / margins)                      */\n  /* ------------------------------------------------------------------ */\n\n  /** Get the current page setup. Default: A4 portrait, 1in margins. */\n  getPageSetup(): PageSetup {\n    return this._pageSetup;\n  }\n\n  /**\n   * Apply a new page size/orientation/margins. Updates the page geometry\n   * live (both 'pageless' and 'paged' view modes) and re-runs pagination.\n   */\n  setPageSetup(setup: PageSetup): void {\n    this._pageSetup = setup;\n    const { widthPx, heightPx } = resolvePageDimensions(setup);\n    const marginXPx = setup.marginX * 96;\n    const marginYPx = setup.marginY * 96;\n    // `theme` itself is readonly, but its properties aren't — mutate in\n    // place so printToPdf() (which reads this.theme.pageWidth/pageHeight\n    // directly) stays in sync with the live page setup.\n    this.theme.pageWidth = `${widthPx}px`;\n    this.theme.pageHeight = `${heightPx}px`;\n    this.theme.pageMarginX = `${marginXPx}px`;\n    this.theme.pageMarginY = `${marginYPx}px`;\n    this._host?.style.setProperty('--de-page-width', `${widthPx}px`);\n    this._host?.style.setProperty('--de-page-height', `${heightPx}px`);\n    this._host?.style.setProperty('--de-page-margin-x', `${marginXPx}px`);\n    this._host?.style.setProperty('--de-page-margin-y', `${marginYPx}px`);\n    this._layoutPagination();\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Watermark API                                                      */\n  /* ------------------------------------------------------------------ */\n\n  /** Get the current watermark config (or null if none). */\n  getWatermark(): WatermarkConfig | null {\n    return this._watermark;\n  }\n\n  /**\n   * Set a watermark. Pass null to remove.\n   *\n   * Renders as a single tiled overlay (repeating SVG background) covering\n   * the whole page, so it reads consistently down the entire document in\n   * both view modes — no per-mode branching needed here.\n   */\n  setWatermark(config: WatermarkConfig | null): void {\n    if (this._watermarkEl) {\n      this._watermarkEl.remove();\n      this._watermarkEl = null;\n    }\n    this._watermark = config;\n    const el = createWatermarkElement(config);\n    if (el && this._page) {\n      this._page.appendChild(el);\n      this._watermarkEl = el;\n    }\n  }\n\n  /** Get the list of preset watermarks. */\n  getWatermarkPresets() {\n    return DEFAULT_WATERMARK_PRESETS;\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Cursor / document context API                                     */\n  /* ------------------------------------------------------------------ */\n\n  /**\n   * Capture a snapshot of what's around the cursor right now: the text\n   * immediately before and after it, its page number, and its \"line\"\n   * (the 1-based index of the top-level block — paragraph, heading,\n   * list item, etc. — it's in). Used to give the AI agent situational\n   * awareness (\"what's near, what page/line the user is on\") without\n   * shipping the whole document on every request.\n   */\n  getCursorContext(contextChars = 300): CursorContext {\n    const { state } = this.editor;\n    const { doc, selection } = state;\n    const pos = selection.from;\n\n    const before = doc.textBetween(Math.max(0, pos - contextChars), pos, '\\n', '\\n');\n    const after = doc.textBetween(pos, Math.min(doc.content.size, pos + contextChars), '\\n', '\\n');\n\n    // Page number: count pageBreak nodes before the cursor (+1 for 1-based).\n    let totalPageBreaks = 0;\n    let pageBreaksBeforeCursor = 0;\n    doc.descendants((node, nodePos) => {\n      if (node.type.name === 'pageBreak') {\n        totalPageBreaks++;\n        if (nodePos < pos) pageBreaksBeforeCursor++;\n      }\n      return true;\n    });\n\n    // \"Line\" number: which top-level block (paragraph/heading/etc.) the\n    // cursor falls inside, 1-based.\n    let line = 1;\n    let totalLines = 0;\n    let foundLine = false;\n    doc.forEach((node, offset, index) => {\n      totalLines++;\n      const from = offset;\n      const to = offset + node.nodeSize;\n      if (!foundLine && pos >= from && (pos < to || (index === doc.childCount - 1 && pos <= to))) {\n        line = index + 1;\n        foundLine = true;\n      }\n    });\n\n    // Structural context: what KIND of block is the cursor in (title? bullet?\n    // quote?) and what character marks are live at the caret right now. Built\n    // from `editor.getJSON()` (the same JSON shape every agent tool already\n    // reads) via the pure helpers in `context/block-format.ts`, rather than\n    // walking raw ProseMirror positions — so it's trivially the same answer\n    // a tool would get from `ctx.doc`, just delivered proactively instead of\n    // requiring an extra round-trip tool call to discover.\n    const blockIndex = Math.max(0, line - 1);\n    const blockNode = this.editor.getJSON()?.content?.[blockIndex] ?? null;\n    const blockType = describeBlockType(blockNode);\n    const alignment = getBlockAlignment(blockNode);\n    const blockAnnotated = blockNode ? annotateNode(blockNode) : '';\n\n    const activeMarks = KNOWN_MARK_NAMES.filter((markName) => {\n      try {\n        return this.editor.isActive(markName);\n      } catch {\n        return false;\n      }\n    });\n\n    return {\n      before,\n      after,\n      page: pageBreaksBeforeCursor + 1,\n      totalPages: totalPageBreaks + 1,\n      line,\n      totalLines,\n      blockType,\n      alignment,\n      activeMarks,\n      blockAnnotated,\n    };\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Header / Footer API                                                */\n  /* ------------------------------------------------------------------ */\n\n  /** Get the current header/footer config. */\n  getHeaderFooter(): HeaderFooterConfig {\n    return { ...this._headerFooter };\n  }\n\n  /** Get the header DOM element (or null if no header region). */\n  getHeaderElement(): HTMLElement | null {\n    return this._headerEl;\n  }\n\n  /** Get the footer DOM element (or null if no footer region). */\n  getFooterElement(): HTMLElement | null {\n    return this._footerEl;\n  }\n\n  /** Get the header HTML content. */\n  getHeaderHTML(): string {\n    return this._headerEl?.innerHTML ?? '';\n  }\n\n  /** Get the footer HTML content. */\n  getFooterHTML(): string {\n    return this._footerEl?.innerHTML ?? '';\n  }\n\n  /** Set the header HTML content. Creates the header region if it doesn't exist. */\n  setHeaderHTML(html: string): void {\n    this._ensureHeaderFooter();\n    if (this._headerEl) {\n      this._headerEl.innerHTML = html;\n      this._headerFooter.headerHTML = html;\n    }\n  }\n\n  /** Set the footer HTML content. Creates the footer region if it doesn't exist. */\n  setFooterHTML(html: string): void {\n    this._ensureHeaderFooter();\n    if (this._footerEl) {\n      this._footerEl.innerHTML = html;\n      this._headerFooter.footerHTML = html;\n    }\n  }\n\n  /** Toggle page number visibility in the footer. */\n  setShowPageNumber(show: boolean): void {\n    this._headerFooter.showPageNumber = show;\n    if (show) {\n      this._ensureHeaderFooter();\n      if (this._footerEl && !this._footerEl.innerHTML.trim()) {\n        this._footerEl.innerHTML = '<p style=\"text-align:center\">Page 1</p>';\n      }\n    }\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Export snapshot (for native PDF export — see io/pdf.ts)             */\n  /* ------------------------------------------------------------------ */\n\n  /**\n   * Gather everything a PDF export needs, in one call: the document's real\n   * HTML (via TipTap's own schema-aware serializer, not a hand-rolled\n   * JSON→HTML walker — so exported PDFs stay faithful to marks/attributes\n   * the same way .docx round-tripping already relies on `getHTML()`), plus\n   * the page-level extras that live outside the document JSON (watermark,\n   * header/footer, theme/page geometry).\n   *\n   * PDF rendering itself (`renderHtmlToPdf` in `io/pdf.ts`) runs in Node via\n   * a headless browser, which can't reach into this live editor instance —\n   * so the browser side calls `getExportSnapshot()` and sends the result to\n   * wherever `renderHtmlToPdf` runs (typically a server endpoint).\n   */\n  getExportSnapshot(): DocxEditorExportSnapshot {\n    return {\n      html: this.getHTML(),\n      themeCSSVars: themeToCSSVars(this.theme),\n      watermark: this.getWatermark(),\n      headerHTML: this.getHeaderHTML(),\n      footerHTML: this.getFooterHTML(),\n    };\n  }\n\n  /**\n   * Lay out the document into Word/Google-Docs-style pages.\n   *\n   * This editor keeps ONE continuous contenteditable region (splitting a\n   * live ProseMirror doc across separate DOM nodes would break editing),\n   * so \"pages\" are simulated:\n   *\n   *   1. Each `pageBreak` node is dynamically sized so that whatever comes\n   *      after it always lands exactly on the top margin of the next\n   *      simulated page — never leaving a big stray blank rectangle and\n   *      never bunching two pages together.\n   *   2. The overall page container's min-height is grown to fit\n   *      `pageBreaks + 1` full pages (with a page-gap between each), so an\n   *      empty trailing page still renders at full page height, like Word.\n   *\n   * Runs after every content change (typing, paste, insert/delete page\n   * break, image load, font load, .docx load).\n   */\n  private _layoutPagination(): void {\n    if (!this._page || !this._host || !this._content) return;\n\n    // Pageless mode: no simulated page boxes, no dynamically-sized page\n    // break gaps — just let content flow continuously.\n    if (this._viewMode === 'pageless') {\n      this._resetPagination();\n      return;\n    }\n\n    const styles = getComputedStyle(this._host);\n    const pageHeight = parseInt(styles.getPropertyValue('--de-page-height')) || 1056; // 11in @ 96dpi\n    const marginY = parseInt(styles.getPropertyValue('--de-page-margin-y')) || 96; // 1in @ 96dpi\n    const pageGap = parseInt(styles.getPropertyValue('--de-page-gap')) || 24;\n\n    const pm = this._content.querySelector('.ProseMirror') as HTMLElement | null;\n    const breaks = pm ? Array.from(pm.querySelectorAll<HTMLElement>('.docx-page-break')) : [];\n\n    // Reset every break's computed sizing before re-measuring, so stale\n    // heights from a previous layout pass don't skew the new measurement.\n    for (const el of breaks) {\n      el.style.removeProperty('height');\n      el.style.removeProperty('--pb-total');\n      el.style.removeProperty('--pb-gap-top');\n      el.style.removeProperty('--pb-gap-bottom');\n    }\n\n    // Total min-height: (pageBreaks + 1) pages, with a page-gap between\n    // each pair of pages (no gap after the final page).\n    const pageCount = breaks.length + 1;\n    const totalMinHeight = pageCount * pageHeight + breaks.length * pageGap;\n    this._page.style.minHeight = `${totalMinHeight}px`;\n    const contentMinHeight = Math.max(totalMinHeight - 2 * marginY, 0);\n    this._content.style.minHeight = `${contentMinHeight}px`;\n    if (pm) pm.style.minHeight = `${contentMinHeight}px`;\n\n    if (breaks.length === 0 || !pm) return;\n\n    // Position each break so the content after it starts exactly at the\n    // top margin of the next page. Processed in document order so that\n    // each break's own height (already applied to the DOM) is reflected\n    // when measuring the position of the NEXT break.\n    //\n    // `getBoundingClientRect()` reports POST-transform pixels, while every\n    // page-geometry value above (`--de-page-height`, `--de-page-margin-y`,\n    // `--de-page-gap`) is in untransformed CSS px. On mobile the page carries\n    // a `transform: scale(zoom)` from `usePageZoom` (auto fit-to-width, so\n    // zoom is ~0.4 on a phone, never 1) — mixing the two units made every\n    // computed page-break gap wrong by the zoom factor, so simulated page\n    // boundaries drifted out of step with the paper behind them. Dividing the\n    // measurement back by the live scale puts both sides in CSS px again; on\n    // desktop (no transform) the scale is 1 and nothing changes.\n    const pmRect = pm.getBoundingClientRect();\n    const scale = pm.offsetWidth > 0 ? pmRect.width / pm.offsetWidth : 1;\n    const safeScale = scale > 0 ? scale : 1;\n    const pmTop = pmRect.top;\n    breaks.forEach((el, index) => {\n      // px from ProseMirror top, converted back to untransformed CSS px\n      const naturalTop = (el.getBoundingClientRect().top - pmTop) / safeScale;\n      const currentAbsoluteY = marginY + naturalTop; // px from the very first page's top edge\n\n      // Slot `index` (0-based) is the page ending right before this break.\n      // Its box occupies [index * (pageHeight + pageGap), + pageHeight).\n      const slotBottomEdge = index * (pageHeight + pageGap) + pageHeight;\n      const nextSlotContentTop = (index + 1) * (pageHeight + pageGap) + marginY;\n\n      let addedHeight = nextSlotContentTop - currentAbsoluteY;\n      // If content already overran this page (more content than fits),\n      // don't collapse the gap — just grow the page to absorb the overflow.\n      if (addedHeight < pageGap + marginY) addedHeight = pageGap + marginY;\n\n      const gapTop = Math.max(addedHeight - pageGap - marginY, 0);\n      const gapBottom = gapTop + pageGap;\n\n      el.style.setProperty('--pb-total', `${addedHeight}px`);\n      el.style.setProperty('--pb-gap-top', `${gapTop}px`);\n      el.style.setProperty('--pb-gap-bottom', `${gapBottom}px`);\n      el.style.height = `${addedHeight}px`;\n\n      void slotBottomEdge; // kept for readability of the derivation above\n    });\n  }\n\n  /**\n   * Clear per-page-break pagination sizing and give the page/content a\n   * single default page-sized min-height — used in 'pageless' mode.\n   *\n   * Unlike 'paged' mode (which grows the page in whole-page increments to\n   * fit `pageBreaks + 1` simulated pages), pageless mode never adds extra\n   * height for page breaks — they're just thin dividers now — but the\n   * page still starts out looking like a normal sheet of paper (one full\n   * page tall) instead of collapsing to whatever little content exists.\n   * Content simply keeps flowing past that height once it grows beyond it\n   * (min-height, not height).\n   */\n  private _resetPagination(): void {\n    if (!this._page || !this._host || !this._content) return;\n\n    const styles = getComputedStyle(this._host);\n    const pageHeight = parseInt(styles.getPropertyValue('--de-page-height')) || 1056; // 11in @ 96dpi\n    const marginY = parseInt(styles.getPropertyValue('--de-page-margin-y')) || 96; // 1in @ 96dpi\n    const contentMinHeight = Math.max(pageHeight - 2 * marginY, 0);\n\n    this._page.style.minHeight = `${pageHeight}px`;\n    this._content.style.minHeight = `${contentMinHeight}px`;\n\n    const pm = this._content.querySelector('.ProseMirror') as HTMLElement | null;\n    if (pm) {\n      pm.style.minHeight = `${contentMinHeight}px`;\n      const breaks = Array.from(pm.querySelectorAll<HTMLElement>('.docx-page-break'));\n      for (const el of breaks) {\n        el.style.removeProperty('height');\n        el.style.removeProperty('--pb-total');\n        el.style.removeProperty('--pb-gap-top');\n        el.style.removeProperty('--pb-gap-bottom');\n      }\n    }\n  }\n\n  /** Schedule a pagination layout pass on the next animation frame (coalesces bursts of updates). */\n  private _scheduleLayoutPagination(): void {\n    if (this._layoutRaf !== null) return;\n    this._layoutRaf = requestAnimationFrame(() => {\n      this._layoutRaf = null;\n      this._layoutPagination();\n    });\n  }\n\n  private _ensureHeaderFooter(): void {\n    if (!this._headerEl) {\n      const el = document.createElement('div');\n      el.className = 'docx-editor-header';\n      el.setAttribute('contenteditable', 'true');\n      el.setAttribute('data-docx-region', 'header');\n      this._page.insertBefore(el, this._content);\n      (this as any)._headerEl = el;\n    }\n    if (!this._footerEl) {\n      const el = document.createElement('div');\n      el.className = 'docx-editor-footer';\n      el.setAttribute('contenteditable', 'true');\n      el.setAttribute('data-docx-region', 'footer');\n      this._page.appendChild(el);\n      (this as any)._footerEl = el;\n    }\n  }\n}\n","/**\n * Bidirectional helpers between TipTap JSON and HTML.\n * These wrap the underlying TipTap Editor commands so callers don't need\n * direct TipTap knowledge.\n */\nexport interface HtmlConvertible {\n  getHTML(): string;\n  setHTML(html: string): void;\n  getJSON(): any;\n  setJSON(json: any): void;\n}\n\n/**\n * Convert a TipTap JSON node into HTML using a temporary in-memory DOM.\n *\n * This is a fallback for callers who don't have a live editor instance.\n * For round-trip fidelity, prefer using the live editor's `getHTML()` /\n * `setHTML()` methods, which use ProseMirror's serializer.\n */\nexport function jsonToHTML(json: any): string {\n  if (typeof window === 'undefined') {\n    // SSR fallback: very rough\n    return jsonToHTMLFallback(json);\n  }\n  // Create a temporary div and use the DOMParser pattern\n  // (ProseMirror's own serializer would be ideal, but to avoid a hard\n  // dependency on the schema we use a structural walker.)\n  return jsonToHTMLFallback(json);\n}\n\n/** Set HTML on the given TipTap-compatible editor instance. */\nexport function setEditorHTML(editor: any, html: string): void {\n  editor?.commands?.setContent?.(html);\n}\n\n/** Get HTML from the given TipTap-compatible editor instance. */\nexport function getEditorHTML(editor: any): string {\n  return editor?.getHTML?.() ?? '';\n}\n\n/* -------------------------------------------------------------------------- */\n/* Fallback HTML serializer (structural, not schema-aware)                    */\n/* -------------------------------------------------------------------------- */\n\nfunction jsonToHTMLFallback(node: any): string {\n  if (!node) return '';\n  if (node.type === 'text') {\n    let s = escapeHTML(node.text ?? '');\n    for (const m of node.marks ?? []) {\n      switch (m.type) {\n        case 'bold':\n          s = `<strong>${s}</strong>`;\n          break;\n        case 'italic':\n          s = `<em>${s}</em>`;\n          break;\n        case 'underline':\n          s = `<u>${s}</u>`;\n          break;\n        case 'strike':\n          s = `<s>${s}</s>`;\n          break;\n        case 'link':\n          s = `<a href=\"${escapeAttr(m.attrs?.href ?? '')}\">${s}</a>`;\n          break;\n        case 'textStyle':\n          if (m.attrs?.color) s = `<span style=\"color:${m.attrs.color}\">${s}</span>`;\n          break;\n        case 'highlight':\n          s = `<mark>${s}</mark>`;\n          break;\n      }\n    }\n    return s;\n  }\n  if (!node.content) return '';\n  const inner = node.content.map(jsonToHTMLFallback).join('');\n  switch (node.type) {\n    case 'doc':\n      return inner;\n    case 'paragraph':\n      return `<p>${inner}</p>`;\n    case 'heading': {\n      const lvl = node.attrs?.level ?? 1;\n      return `<h${lvl}>${inner}</h${lvl}>`;\n    }\n    case 'bulletList':\n      return `<ul>${inner}</ul>`;\n    case 'orderedList':\n      return `<ol>${inner}</ol>`;\n    case 'listItem':\n      return `<li>${inner}</li>`;\n    case 'blockquote':\n      return `<blockquote>${inner}</blockquote>`;\n    case 'codeBlock':\n      return `<pre><code>${inner}</code></pre>`;\n    case 'horizontalRule':\n      return '<hr>';\n    case 'image':\n      return `<img src=\"${escapeAttr(node.attrs?.src ?? '')}\" alt=\"${escapeAttr(node.attrs?.alt ?? '')}\">`;\n    case 'table':\n      return `<table>${inner}</table>`;\n    case 'tableRow':\n      return `<tr>${inner}</tr>`;\n    case 'tableCell':\n      return `<td>${inner}</td>`;\n    case 'tableHeader':\n      return `<th>${inner}</th>`;\n    default:\n      return inner;\n  }\n}\n\nfunction escapeHTML(s: string): string {\n  return s\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nfunction escapeAttr(s: string): string {\n  return escapeHTML(s).replace(/\"/g, '&quot;');\n}\n","/**\n * Embedded font extraction and registration.\n *\n * Word documents can embed fonts as obfuscated `.odttf` files in the\n * `word/fonts/` directory. The first 32 bytes are XOR-scrambled with\n * a 16-byte key derived from the `w:fontKey` GUID (byte order reversed).\n *\n * This module:\n *   1. Extracts font files from a .docx ArrayBuffer using JSZip\n *   2. Reads `word/fontTable.xml` to find embedded font declarations\n *   3. Reads `word/_rels/fontTable.xml.rels` to map relIds → file paths\n *   4. De-obfuscates each `.odttf` file\n *   5. Registers each font as a CSS `@font-face` via the FontFace API\n *\n * After registration, imported documents render in their authored fonts\n * instead of falling back to system defaults.\n */\n\n// Lazy-load JSZip only when needed (it's already a dependency of the editor)\nlet JSZip: any = null;\nasync function getJSZip(): Promise<any> {\n  if (JSZip) return JSZip;\n  const mod = await import('jszip');\n  JSZip = mod.default || mod;\n  return JSZip;\n}\n\n/* -------------------------------------------------------------------------- */\n/* De-obfuscation (ECMA-376 Part 4 §2.8.1)                                    */\n/* -------------------------------------------------------------------------- */\n\nconst HEADER_LENGTH = 32;\nconst KEY_LENGTH = 16;\n\n/**\n * Convert a `w:fontKey` GUID string to 16 reversed key bytes.\n * Example: \"001B70DC-AA60-4AD5-90EC-18A0948E1EAE\" →\n *   [AE, 1E, 8E, 94, A0, 18, EC, 90, D5, 4A, 60, AA, DC, 70, 1B, 00]\n */\nfunction fontKeyToReversedBytes(fontKey: string): Uint8Array | null {\n  const hex = fontKey.replace(/[^0-9a-fA-F]/g, '');\n  if (hex.length !== KEY_LENGTH * 2) return null;\n  const forward = new Uint8Array(KEY_LENGTH);\n  for (let i = 0; i < KEY_LENGTH; i++) {\n    const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n    if (isNaN(byte)) return null;\n    forward[i] = byte;\n  }\n  const reversed = new Uint8Array(KEY_LENGTH);\n  for (let i = 0; i < KEY_LENGTH; i++) {\n    reversed[i] = forward[KEY_LENGTH - 1 - i];\n  }\n  return reversed;\n}\n\n/**\n * De-obfuscate an embedded `.odttf` font by XOR-ing its first 32 bytes\n * with the reversed `w:fontKey` GUID. Returns a new buffer.\n */\nexport function deobfuscateFont(data: ArrayBuffer, fontKey: string): ArrayBuffer {\n  const key = fontKeyToReversedBytes(fontKey);\n  if (!key) throw new Error(`Invalid embedded-font key: \"${fontKey}\"`);\n  const out = new Uint8Array(data.slice(0));\n  const end = Math.min(HEADER_LENGTH, out.length);\n  for (let i = 0; i < end; i++) {\n    out[i] ^= key[i % KEY_LENGTH];\n  }\n  return out.buffer;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Font table XML parsing                                                      */\n/* -------------------------------------------------------------------------- */\n\ninterface FontEmbedInfo {\n  relId: string;\n  fontKey?: string;\n  subsetted?: boolean;\n}\n\ninterface FontEntry {\n  name: string;\n  embedRegular?: FontEmbedInfo;\n  embedBold?: FontEmbedInfo;\n  embedItalic?: FontEmbedInfo;\n  embedBoldItalic?: FontEmbedInfo;\n}\n\ninterface ParsedFontTable {\n  fonts: FontEntry[];\n}\n\n/**\n * Parse `word/fontTable.xml` to extract embedded font declarations.\n * Uses DOMParser (available in browsers and Node 18+ with happy-dom).\n */\nfunction parseFontTable(xml: string): ParsedFontTable {\n  const fonts: FontEntry[] = [];\n  if (typeof DOMParser === 'undefined') return { fonts };\n\n  try {\n    const doc = new DOMParser().parseFromString(xml, 'text/xml');\n    const fontEls = doc.getElementsByTagName('w:font');\n    for (let i = 0; i < fontEls.length; i++) {\n      const fontEl = fontEls[i];\n      const name = fontEl.getAttribute('w:name') || '';\n      if (!name) continue;\n\n      const entry: FontEntry = { name };\n\n      // Parse embed declarations: w:embedRegular, w:embedBold, w:embedItalic, w:embedBoldItalic\n      const embedKinds: Array<{ tag: string; key: keyof FontEntry }> = [\n        { tag: 'w:embedRegular', key: 'embedRegular' },\n        { tag: 'w:embedBold', key: 'embedBold' },\n        { tag: 'w:embedItalic', key: 'embedItalic' },\n        { tag: 'w:embedBoldItalic', key: 'embedBoldItalic' },\n      ];\n\n      for (const { tag, key } of embedKinds) {\n        const embedEl = fontEl.getElementsByTagName(tag)[0];\n        if (embedEl) {\n          const info: FontEmbedInfo = {\n            relId: embedEl.getAttribute('r:id') || '',\n            fontKey: embedEl.getAttribute('w:fontKey') || undefined,\n            subsetted: embedEl.getAttribute('w:subsetted') === '1',\n          };\n          if (info.relId) {\n            (entry as any)[key] = info;\n          }\n        }\n      }\n\n      if (entry.embedRegular || entry.embedBold || entry.embedItalic || entry.embedBoldItalic) {\n        fonts.push(entry);\n      }\n    }\n  } catch (e) {\n    // XML parsing failed — skip embedded fonts\n    console.warn('[docx-editor] Failed to parse fontTable.xml:', e);\n  }\n\n  return { fonts };\n}\n\n/**\n * Parse `word/_rels/fontTable.xml.rels` to map relId → target file path.\n */\nfunction parseFontTableRels(xml: string): Map<string, string> {\n  const rels = new Map<string, string>();\n  if (typeof DOMParser === 'undefined') return rels;\n\n  try {\n    const doc = new DOMParser().parseFromString(xml, 'text/xml');\n    const relEls = doc.getElementsByTagName('Relationship');\n    for (let i = 0; i < relEls.length; i++) {\n      const rel = relEls[i];\n      const id = rel.getAttribute('Id') || '';\n      const target = rel.getAttribute('Target') || '';\n      if (id && target) rels.set(id, target);\n    }\n  } catch (e) {\n    // Ignore parse errors\n  }\n\n  return rels;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Font registration                                                           */\n/* -------------------------------------------------------------------------- */\n\nconst loadedFontFamilies = new Set<string>();\n\n/**\n * Register a single font face with the browser using the FontFace API.\n * Falls back to injecting a `<style>` tag with `@font-face` if FontFace\n * API is unavailable.\n */\nasync function registerFontFace(\n  family: string,\n  data: ArrayBuffer,\n  weight: 'normal' | 'bold',\n  style: 'normal' | 'italic',\n): Promise<boolean> {\n  if (typeof document === 'undefined') return false;\n\n  try {\n    // Use FontFace API (modern browsers)\n    if (typeof FontFace !== 'undefined') {\n      const fontFace = new FontFace(family, data, { weight, style });\n      await fontFace.load();\n      (document as any).fonts.add(fontFace);\n      loadedFontFamilies.add(family);\n      return true;\n    }\n\n    // Fallback: inject @font-face style\n    const blob = new Blob([data], { type: 'font/ttf' });\n    const url = URL.createObjectURL(blob);\n    const styleEl = document.createElement('style');\n    styleEl.textContent = `\n      @font-face {\n        font-family: \"${family}\";\n        src: url(${url}) format('truetype');\n        font-weight: ${weight};\n        font-style: ${style};\n        font-display: swap;\n      }\n    `;\n    document.head.appendChild(styleEl);\n    loadedFontFamilies.add(family);\n    return true;\n  } catch (e) {\n    console.warn(`[docx-editor] Failed to register font \"${family}\" (${weight} ${style}):`, e);\n    return false;\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Main API                                                                    */\n/* -------------------------------------------------------------------------- */\n\nexport interface EmbeddedFontResult {\n  /** Set of font family names that were successfully registered. */\n  families: Set<string>;\n  /** Total number of font faces processed. */\n  faceCount: number;\n}\n\n/**\n * Extract and register all embedded fonts from a .docx ArrayBuffer.\n *\n * This should be called AFTER loading the document content, so the fonts\n * are registered before the browser tries to render text using them.\n *\n * @param docxBuffer - The .docx file as an ArrayBuffer\n * @returns Set of registered font family names\n */\nexport async function loadEmbeddedFontsFromDocx(docxBuffer: ArrayBuffer): Promise<EmbeddedFontResult> {\n  const families = new Set<string>();\n  let faceCount = 0;\n\n  try {\n    const zip = await getJSZip();\n    const doc = await zip.loadAsync(docxBuffer);\n\n    // 1. Read fontTable.xml\n    const fontTableFile = doc.file('word/fontTable.xml');\n    if (!fontTableFile) return { families, faceCount };\n    const fontTableXml = await fontTableFile.async('string');\n    const fontTable = parseFontTable(fontTableXml);\n    if (fontTable.fonts.length === 0) return { families, faceCount };\n\n    // 2. Read fontTable.xml.rels\n    const relsFile = doc.file('word/_rels/fontTable.xml.rels');\n    const relsXml = relsFile ? await relsFile.async('string') : '';\n    const relTargets = parseFontTableRels(relsXml);\n\n    // 3. Collect all font files from word/fonts/\n    const fontFiles = new Map<string, ArrayBuffer>();\n    const fontPaths = Object.keys(doc.files).filter(\n      (p: string) => p.toLowerCase().startsWith('word/fonts/') && p.toLowerCase().endsWith('.odttf'),\n    );\n    // Also check for .ttf and .otf (non-obfuscated embedded fonts)\n    const allFontPaths = Object.keys(doc.files).filter(\n      (p: string) =>\n        p.toLowerCase().startsWith('word/fonts/') &&\n        (p.toLowerCase().endsWith('.odttf') ||\n          p.toLowerCase().endsWith('.ttf') ||\n          p.toLowerCase().endsWith('.otf')),\n    );\n\n    for (const path of allFontPaths) {\n      const data = await doc.files[path].async('arraybuffer');\n      fontFiles.set(path, data);\n    }\n\n    if (fontFiles.size === 0) return { families, faceCount };\n\n    // 4. For each font entry, resolve and de-obfuscate each embedded face\n    const embedKinds: Array<{\n      key: keyof Pick<FontEntry, 'embedRegular' | 'embedBold' | 'embedItalic' | 'embedBoldItalic'>;\n      weight: 'normal' | 'bold';\n      style: 'normal' | 'italic';\n    }> = [\n      { key: 'embedRegular', weight: 'normal', style: 'normal' },\n      { key: 'embedBold', weight: 'bold', style: 'normal' },\n      { key: 'embedItalic', weight: 'normal', style: 'italic' },\n      { key: 'embedBoldItalic', weight: 'bold', style: 'italic' },\n    ];\n\n    for (const font of fontTable.fonts) {\n      for (const kind of embedKinds) {\n        const embed = font[kind.key] as FontEmbedInfo | undefined;\n        if (!embed || !embed.relId) continue;\n\n        // Resolve the target path from the relationship\n        const target = relTargets.get(embed.relId);\n        if (!target) continue;\n\n        // Normalize the path (rel targets are relative to word/)\n        const cleanedTarget = target.replace(/^\\/+/, '');\n        const fullPath = cleanedTarget.toLowerCase().startsWith('word/')\n          ? cleanedTarget\n          : `word/${cleanedTarget}`;\n\n        // Find the font file (case-insensitive match)\n        let fontData: ArrayBuffer | undefined;\n        for (const [path, data] of fontFiles) {\n          if (path.toLowerCase() === fullPath.toLowerCase()) {\n            fontData = data;\n            break;\n          }\n        }\n        if (!fontData) continue;\n\n        // De-obfuscate if it's an .odttf with a fontKey\n        let finalData: ArrayBuffer;\n        if (embed.fontKey && fullPath.toLowerCase().endsWith('.odttf')) {\n          try {\n            finalData = deobfuscateFont(fontData, embed.fontKey);\n          } catch {\n            continue; // Skip on de-obfuscation failure\n          }\n        } else {\n          finalData = fontData;\n        }\n\n        // Register the font face\n        faceCount++;\n        const ok = await registerFontFace(font.name, finalData, kind.weight, kind.style);\n        if (ok) {\n          families.add(font.name);\n        }\n      }\n    }\n\n    if (families.size > 0) {\n      console.log(\n        `[docx-editor] Registered ${faceCount} embedded font faces ` +\n          `across ${families.size} families: ${Array.from(families).join(', ')}`,\n      );\n    }\n  } catch (e) {\n    console.warn('[docx-editor] Failed to load embedded fonts:', e);\n  }\n\n  return { families, faceCount };\n}\n\n/**\n * Returns the set of font family names that have been registered from\n * embedded fonts. Useful for populating a \"Document fonts\" section in\n * the font picker.\n */\nexport function getLoadedEmbeddedFonts(): Set<string> {\n  return new Set(loadedFontFamilies);\n}\n\n/**\n * Clear all registered embedded fonts (for when a new document is loaded).\n * Note: FontFace API doesn't support removal, so we just clear the tracking set.\n */\nexport function clearEmbeddedFonts(): void {\n  loadedFontFamilies.clear();\n}\n","/**\n * Shared SVG icons for the editor toolbar, menu bar, and title bar.\n *\n * Centralized here so all components use consistent icon styles\n * (stroke width, viewBox, etc.) and so consumers can import them\n * for custom toolbars.\n */\nimport * as React from 'react';\n\nexport interface IconProps {\n  size?: number;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nconst base = (size: number) => ({\n  width: size,\n  height: size,\n  viewBox: '0 0 24 24',\n  fill: 'none',\n  stroke: 'currentColor',\n  strokeWidth: 2,\n  strokeLinecap: 'round' as const,\n  strokeLinejoin: 'round' as const,\n});\n\nexport const UndoIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M3 12a9 9 0 1 0 9-9c-2.5 0-4.5 1-6 2.5L3 8\" />\n    <path d=\"M3 3v5h5\" />\n  </svg>\n);\n\nexport const RedoIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M21 12a9 9 0 1 1-9-9c2.5 0 4.5 1 6 2.5L21 8\" />\n    <path d=\"M21 3v5h-5\" />\n  </svg>\n);\n\nexport const LinkIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n    <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n  </svg>\n);\n\nexport const ImageIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n    <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n    <polyline points=\"21 15 16 10 5 21\" />\n  </svg>\n);\n\nexport const UploadIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n    <polyline points=\"17 8 12 3 7 8\" />\n    <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n  </svg>\n);\n\nexport const TableIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n    <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" />\n    <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n    <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n    <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n  </svg>\n);\n\nexport const TemplateIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n    <line x1=\"3\" y1=\"8\" x2=\"21\" y2=\"8\" />\n    <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\" />\n    <line x1=\"7\" y1=\"16\" x2=\"13\" y2=\"16\" />\n  </svg>\n);\n\n/**\n * Distinct from `TemplateIcon` (a full document with header rule) — this\n * reads as a single inserted paragraph/section block, for the toolbar's\n * \"Clauses\" dropdown (a snippet you drop into an existing document, not a\n * whole document you start from).\n */\nexport const ClauseIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n    <line x1=\"7\" y1=\"9\" x2=\"17\" y2=\"9\" />\n    <line x1=\"7\" y1=\"13\" x2=\"17\" y2=\"13\" />\n    <path d=\"M3 5 L3 3 L9 3\" />\n  </svg>\n);\n\nexport const PageBreakIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <rect x=\"3\" y=\"3\" width=\"18\" height=\"14\" rx=\"1\" />\n    <line x1=\"3\" y1=\"11\" x2=\"21\" y2=\"11\" strokeDasharray=\"3 2\" />\n    <line x1=\"8\" y1=\"20\" x2=\"16\" y2=\"20\" />\n    <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"22\" />\n  </svg>\n);\n\nexport const HorizontalRuleIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" strokeWidth=\"3\" />\n  </svg>\n);\n\nexport const QuoteIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M3 21c3 0 5-2 5-5V7H3v6h3\" />\n    <path d=\"M14 21c3 0 5-2 5-5V7h-5v6h3\" />\n  </svg>\n);\n\nexport const CodeIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"16 18 22 12 16 6\" />\n    <polyline points=\"8 6 2 12 8 18\" />\n  </svg>\n);\n\nexport const AlignLeftIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\" />\n    <line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\" />\n  </svg>\n);\n\nexport const AlignCenterIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\" />\n    <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n  </svg>\n);\n\nexport const AlignRightIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\" />\n    <line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\" />\n  </svg>\n);\n\nexport const AlignJustifyIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n    <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n  </svg>\n);\n\nexport const BulletListIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n    <line x1=\"8\" y1=\"6\" x2=\"20\" y2=\"6\" />\n    <circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n    <line x1=\"8\" y1=\"12\" x2=\"20\" y2=\"12\" />\n    <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n    <line x1=\"8\" y1=\"18\" x2=\"20\" y2=\"18\" />\n  </svg>\n);\n\nexport const OrderedListIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <text x=\"2\" y=\"9\" fontSize=\"7\" fill=\"currentColor\" stroke=\"none\">1.</text>\n    <line x1=\"8\" y1=\"6\" x2=\"20\" y2=\"6\" />\n    <text x=\"2\" y=\"15\" fontSize=\"7\" fill=\"currentColor\" stroke=\"none\">2.</text>\n    <line x1=\"8\" y1=\"12\" x2=\"20\" y2=\"12\" />\n    <text x=\"2\" y=\"21\" fontSize=\"7\" fill=\"currentColor\" stroke=\"none\">3.</text>\n    <line x1=\"8\" y1=\"18\" x2=\"20\" y2=\"18\" />\n  </svg>\n);\n\nexport const OutdentIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <polyline points=\"9 12 5 16 9 20\" />\n    <line x1=\"5\" y1=\"16\" x2=\"21\" y2=\"16\" />\n  </svg>\n);\n\nexport const IndentIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n    <polyline points=\"15 12 19 16 15 20\" />\n    <line x1=\"3\" y1=\"16\" x2=\"19\" y2=\"16\" />\n  </svg>\n);\n\nexport const CloseIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n    <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n  </svg>\n);\n\nexport const SendIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n    <polyline points=\"5 12 12 5 19 12\" />\n  </svg>\n);\n\nexport const PlusIcon = ({ size = 20, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n    <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n  </svg>\n);\n\nexport const ChevronDownIcon = ({ size = 12, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"6 9 12 15 18 9\" />\n  </svg>\n);\n\nexport const ChevronLeftIcon = ({ size = 12, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"15 6 9 12 15 18\" />\n  </svg>\n);\n\nexport const ChevronRightIcon = ({ size = 12, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"9 6 15 12 9 18\" />\n  </svg>\n);\n\nexport const CheckIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p} strokeWidth={2.5}>\n    <polyline points=\"20 6 9 17 4 12\" />\n  </svg>\n);\n\nexport const PencilIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n    <path d=\"M15 5l4 4\" />\n  </svg>\n);\n\nexport const SuggestIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\" />\n    <path d=\"M12.5 8.5 9.5 11.5l-1-1\" />\n  </svg>\n);\n\nexport const EyeIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7Z\" />\n    <circle cx=\"12\" cy=\"12\" r=\"3\" />\n  </svg>\n);\n\nexport const EyeOffIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M17.94 17.94A10.94 10.94 0 0 1 12 20c-7 0-11-8-11-8a20.3 20.3 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a20.4 20.4 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n    <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n  </svg>\n);\n\nexport const TrashIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"3 6 5 6 21 6\" />\n    <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n    <path d=\"M10 11v6\" />\n    <path d=\"M14 11v6\" />\n    <path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\" />\n  </svg>\n);\n\nexport const DocumentLogoIcon = ({ size = 24, ...p }: IconProps) => (\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" {...p}>\n    <path d=\"M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Z\" fill=\"#4285f4\" />\n    <path d=\"M14 2v5a1 1 0 0 0 1 1h5Z\" fill=\"#a1c2fa\" />\n    <line x1=\"7.5\" y1=\"12\" x2=\"16.5\" y2=\"12\" stroke=\"#fff\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n    <line x1=\"7.5\" y1=\"15\" x2=\"16.5\" y2=\"15\" stroke=\"#fff\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n    <line x1=\"7.5\" y1=\"18\" x2=\"13\" y2=\"18\" stroke=\"#fff\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n  </svg>\n);\n\nexport const CollapseUpIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <polyline points=\"18 15 12 9 6 15\" />\n  </svg>\n);\n\nexport const FolderOpenIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v1H5\" />\n    <path d=\"M3 7v10a2 2 0 0 0 2 2h13a2 2 0 0 0 2-1.7l1.4-8A1 1 0 0 0 20.4 8H5.6a2 2 0 0 0-2 1.7Z\" />\n  </svg>\n);\n\nexport const SaveIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2Z\" />\n    <polyline points=\"17 21 17 13 7 13 7 21\" />\n    <polyline points=\"7 3 7 8 15 8\" />\n  </svg>\n);\n\nexport const PdfExportIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z\" />\n    <polyline points=\"14 2 14 8 20 8\" />\n    <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"18\" />\n    <polyline points=\"9.5 15.5 12 18 14.5 15.5\" />\n  </svg>\n);\n\n/** Clock-with-back-arrow — the History drawer's toolbar button. */\nexport const HistoryIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n    <path d=\"M3 3v5h5\" />\n    <polyline points=\"12 7 12 12 16 14\" />\n  </svg>\n);\n\n/** History-entry source badge: a manual/user save. */\nexport const UserIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M20 21a8 8 0 0 0-16 0\" />\n    <circle cx=\"12\" cy=\"7\" r=\"4\" />\n  </svg>\n);\n\n/** History-entry source badge: an AI agent edit. */\nexport const SparklesIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M12 3v4M12 17v4M3 12h4M17 12h4M5.6 5.6l2.8 2.8M15.6 15.6l2.8 2.8M18.4 5.6l-2.8 2.8M8.4 15.6l-2.8 2.8\" />\n  </svg>\n);\n\n/** History-entry source badge: a restored-from-version entry. */\nexport const RestoreIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n    <path d=\"M3 3v5h5\" />\n  </svg>\n);\n\n/** Comments toggle bubble + add-comment trigger. */\nexport const CommentIcon = ({ size = 16, ...p }: IconProps) => (\n  <svg {...base(size)} {...p}>\n    <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n  </svg>\n);\n\n/** Drag handle for the comments panel header. */\nexport const GripIcon = ({ size = 14, ...p }: IconProps) => (\n  <svg {...base(size)} {...p} fill=\"currentColor\" stroke=\"none\">\n    <circle cx=\"8\" cy=\"6\" r=\"1.5\" />\n    <circle cx=\"16\" cy=\"6\" r=\"1.5\" />\n    <circle cx=\"8\" cy=\"12\" r=\"1.5\" />\n    <circle cx=\"16\" cy=\"12\" r=\"1.5\" />\n    <circle cx=\"8\" cy=\"18\" r=\"1.5\" />\n    <circle cx=\"16\" cy=\"18\" r=\"1.5\" />\n  </svg>\n);\n","/**\n * TitleBar — the document icon + filename, left-most in the header row.\n *\n * Exported so consumers can use it in custom layouts or replace it entirely\n * via the `renderTitleBar` prop on <ReactDocxEditor />. Open/Save/Export live\n * in `HeaderActions` (the right side of the same header row) — kept as a\n * separate component so the filename input can sit directly next to the\n * File/Insert/Format/View menu instead of being pushed apart from it.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport { DocumentLogoIcon } from './icons';\n\nexport interface TitleBarProps {\n  editor: DocxEditor;\n  /** Current filename (controlled — see `ReactDocxEditor`'s internal state). */\n  name: string;\n  onNameChange: (name: string) => void;\n}\n\nexport function TitleBar({ name, onNameChange }: TitleBarProps): React.ReactElement {\n  return (\n    <div className=\"docx-editor-title-bar\">\n      <DocumentLogoIcon size={26} className=\"docx-editor-title-bar__logo\" />\n      <input\n        className=\"docx-editor-title-bar__filename-input\"\n        type=\"text\"\n        value={name}\n        onChange={(e) => onNameChange(e.target.value)}\n        spellCheck={false}\n      />\n    </div>\n  );\n}\n","/**\n * FloatingPanel — shared positioning primitive for every toolbar/menu-bar\n * popover (color picker, table-size picker, style/font/size dropdown, the\n * File/Insert/Format/View menu, template picker).\n *\n * Replaces the old pattern where each popover was `position: absolute; left:\n * 0` inside the trigger's own DOM subtree, plus a `data-dropdown-open`\n * attribute that flipped the toolbar from `overflow-x: auto` to `overflow:\n * visible` while any popover was open (so the popover wasn't clipped).\n *\n * That had two bugs, both reported as \"menus open in the wrong place /\n * beyond the viewport\":\n *  1. Flipping the toolbar to `overflow: visible` resets its `scrollLeft`\n *     (a scrolled `overflow: auto` box has no scroll position once it's no\n *     longer scrollable), so if the toolbar was scrolled when a popover\n *     trigger was clicked, the whole toolbar — trigger included — visually\n *     snapped back to its unscrolled position the instant the popover\n *     opened, and the popover (anchored to that trigger) opened wherever\n *     the trigger jumped to, not where the user actually clicked.\n *  2. `left: 0` anchors the popover's left edge to the trigger with no\n *     clamping, so a trigger near the right edge of a narrow host container\n *     pushed the popover off-screen.\n *\n * FloatingPanel renders into a `document.body` portal with `position:\n * fixed`, computing its coordinates from the trigger's live\n * `getBoundingClientRect()` — so it's immune to any ancestor's `overflow`/\n * `scrollLeft`, and clamps to the viewport so it can never render off-screen.\n */\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface FloatingPanelProps {\n  /** Ref to the trigger element the panel is anchored below. */\n  anchorRef: React.RefObject<HTMLElement>;\n  open: boolean;\n  onClose: () => void;\n  children: React.ReactNode;\n  className?: string;\n  style?: React.CSSProperties;\n  /** Gap between the anchor's bottom edge and the panel, in px. Default 4. */\n  gap?: number;\n  role?: string;\n  'aria-label'?: string;\n}\n\nconst VIEWPORT_MARGIN = 8;\n\nexport function FloatingPanel({\n  anchorRef,\n  open,\n  onClose,\n  children,\n  className,\n  style,\n  gap = 4,\n  role,\n  'aria-label': ariaLabel,\n}: FloatingPanelProps): React.ReactElement | null {\n  const panelRef = React.useRef<HTMLDivElement>(null);\n  const [pos, setPos] = React.useState<{ top: number; left: number } | null>(null);\n\n  const reposition = React.useCallback(() => {\n    const anchor = anchorRef.current;\n    const panel = panelRef.current;\n    if (!anchor || !panel) return;\n    const a = anchor.getBoundingClientRect();\n    const panelWidth = panel.offsetWidth;\n    const panelHeight = panel.offsetHeight;\n\n    let left = a.left;\n    left = Math.min(left, window.innerWidth - panelWidth - VIEWPORT_MARGIN);\n    left = Math.max(left, VIEWPORT_MARGIN);\n\n    let top = a.bottom + gap;\n    if (top + panelHeight > window.innerHeight - VIEWPORT_MARGIN) {\n      const above = a.top - panelHeight - gap;\n      top = above >= VIEWPORT_MARGIN ? above : Math.max(VIEWPORT_MARGIN, window.innerHeight - panelHeight - VIEWPORT_MARGIN);\n    }\n    setPos({ top, left });\n  }, [anchorRef, gap]);\n\n  // Measure-then-place: the first commit with `open: true` renders the\n  // panel off-screen (so it has real layout to measure), then this effect\n  // (which runs before paint) measures it and repositions — both commits\n  // land before the browser paints, so there's no visible flicker.\n  React.useLayoutEffect(() => {\n    if (!open) {\n      setPos(null);\n      return;\n    }\n    reposition();\n  }, [open, reposition]);\n\n  // Re-clamp on resize, and re-anchor if any ancestor (e.g. the toolbar)\n  // scrolls while the panel is open.\n  React.useEffect(() => {\n    if (!open) return;\n    window.addEventListener('resize', reposition);\n    window.addEventListener('scroll', reposition, true);\n    return () => {\n      window.removeEventListener('resize', reposition);\n      window.removeEventListener('scroll', reposition, true);\n    };\n  }, [open, reposition]);\n\n  React.useEffect(() => {\n    if (!open) return;\n    const onDoc = (e: MouseEvent) => {\n      const target = e.target as Node;\n      if (panelRef.current?.contains(target)) return;\n      if (anchorRef.current?.contains(target)) return;\n      onClose();\n    };\n    document.addEventListener('mousedown', onDoc);\n    return () => document.removeEventListener('mousedown', onDoc);\n  }, [open, onClose, anchorRef]);\n\n  React.useEffect(() => {\n    if (!open) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose();\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, [open, onClose]);\n\n  if (!open || typeof document === 'undefined') return null;\n\n  return createPortal(\n    <div\n      ref={panelRef}\n      className={className}\n      role={role}\n      aria-label={ariaLabel}\n      style={{\n        position: 'fixed',\n        top: pos?.top ?? -9999,\n        left: pos?.left ?? -9999,\n        visibility: pos ? 'visible' : 'hidden',\n        zIndex: 10000,\n        ...style,\n      }}\n    >\n      {children}\n    </div>,\n    document.body,\n  );\n}\n","/**\n * ModeSwitcher — the Editing / Suggesting / Viewing pill at the right end of\n * the toolbar (matches Google Docs' mode dropdown). Drives `editor.setMode`.\n *\n * Uncontrolled by default: the user can freely pick a mode from the\n * dropdown. Pass `mode` to control it from the host app instead — the pill\n * then renders as a plain, non-interactive indicator (no dropdown, no\n * click handler) showing whatever mode the host set, and the only way to\n * change it is for the host to change the `mode` prop. `ReactDocxEditor`'s\n * own `mode` prop threads through to this automatically.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport type { EditorMode } from '../editor';\nimport { FloatingPanel } from './FloatingPanel';\nimport { PencilIcon, SuggestIcon, EyeIcon, ChevronDownIcon, CheckIcon } from './icons';\n\nconst MODES: Array<{ id: EditorMode; label: string; description: string; Icon: React.ComponentType<{ size?: number }> }> = [\n  { id: 'editing', label: 'Editing', description: 'Edit document directly', Icon: PencilIcon },\n  { id: 'suggesting', label: 'Suggesting', description: 'Edits become suggestions', Icon: SuggestIcon },\n  { id: 'viewing', label: 'Viewing', description: 'Read or print final document', Icon: EyeIcon },\n];\n\nexport interface ModeSwitcherProps {\n  editor: DocxEditor;\n  /**\n   * Locks the mode to this value and hides the dropdown — the user can no\n   * longer switch modes from the editor UI. Omit to let the user pick\n   * freely (default); the internal selection still calls `editor.setMode`.\n   */\n  mode?: EditorMode;\n}\n\nexport function ModeSwitcher({ editor, mode: controlledMode }: ModeSwitcherProps): React.ReactElement {\n  const [internalMode, setInternalMode] = React.useState<EditorMode>(editor.getMode());\n  const [open, setOpen] = React.useState(false);\n  const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n  const locked = controlledMode !== undefined;\n  const mode = locked ? controlledMode : internalMode;\n  const current = MODES.find((m) => m.id === mode) ?? MODES[0];\n\n  const applyMode = (next: EditorMode) => {\n    editor.setMode(next);\n    setInternalMode(next);\n    setOpen(false);\n  };\n\n  if (locked) {\n    return (\n      <div className=\"docx-editor-mode-switcher\" data-locked=\"true\">\n        <span className=\"docx-editor-mode-switcher__trigger docx-editor-mode-switcher__trigger--locked\" data-mode={mode}>\n          <current.Icon size={15} />\n          <span>{current.label}</span>\n        </span>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"docx-editor-mode-switcher\">\n      <button\n        ref={triggerRef}\n        type=\"button\"\n        className=\"docx-editor-mode-switcher__trigger\"\n        data-mode={mode}\n        onClick={() => setOpen((o) => !o)}\n        aria-haspopup=\"menu\"\n        aria-expanded={open}\n      >\n        <current.Icon size={15} />\n        <span>{current.label}</span>\n        <ChevronDownIcon size={12} />\n      </button>\n      <FloatingPanel\n        anchorRef={triggerRef}\n        open={open}\n        onClose={() => setOpen(false)}\n        className=\"docx-editor-mode-switcher__menu\"\n        role=\"menu\"\n        aria-label=\"Editing mode\"\n      >\n        {MODES.map(({ id, label, description, Icon }) => (\n          <button\n            key={id}\n            type=\"button\"\n            className=\"docx-editor-mode-switcher__option\"\n            data-active={mode === id ? 'true' : undefined}\n            onClick={() => applyMode(id)}\n            role=\"menuitemradio\"\n            aria-checked={mode === id}\n          >\n            <Icon size={18} />\n            <span className=\"docx-editor-mode-switcher__option-text\">\n              <span className=\"docx-editor-mode-switcher__option-label\">{label}</span>\n              <span className=\"docx-editor-mode-switcher__option-desc\">{description}</span>\n            </span>\n            {mode === id && <CheckIcon size={16} className=\"docx-editor-mode-switcher__check\" />}\n          </button>\n        ))}\n      </FloatingPanel>\n    </div>\n  );\n}\n","/**\n * HeaderActions — the compact icon-button cluster at the right end of the\n * header row (Open .docx / Save .docx / Export PDF / History + any\n * host-supplied `titleBarActions`). Split out from `TitleBar` so the\n * filename input can sit directly next to the File/Insert/Format/View menu,\n * with these actions docked to the far right of the same row instead.\n *\n * The History sidebar itself is NOT mounted here — it lives in\n * `ReactDocxEditor.tsx`'s body row (a flex sibling of the editor's main\n * column, docked like the AI agent sidebar) so opening it can shrink the\n * editor's width instead of overlaying it. This component only owns the\n * toggle button; `onToggleHistory`'s presence is what shows it.\n *\n * Host chrome (`actions`) can be either:\n *   - a bare `React.ReactNode` — rendered once, right after the mode pill\n *     (the historical behavior, unchanged); or\n *   - a `HeaderActionItem[]` — each node dropped into a named slot between\n *     the built-in buttons (`placement`, default `'after-mode'`), so an app\n *     can interleave its own buttons with Open/Save/Export/History and the\n *     mode pill instead of only appending to the end.\n * Built-in buttons can be hidden individually via `hideDefaultActions` (so an\n * app that saves somewhere other than a local download doesn't need CSS to\n * hide the file-download \"Save\", etc.).\n */\nimport * as React from 'react';\nimport type { DocxEditor, EditorMode } from '../editor';\nimport { FolderOpenIcon, SaveIcon, PdfExportIcon, HistoryIcon } from './icons';\nimport { ModeSwitcher } from './ModeSwitcher';\n\n/** Where a `HeaderActionItem` is inserted among the built-in header buttons. */\nexport type HeaderActionPlacement =\n  | 'start'\n  | 'before-open'\n  | 'after-open'\n  | 'after-save'\n  | 'after-export-pdf'\n  | 'after-history'\n  | 'before-mode'\n  | 'after-mode'\n  | 'end';\n\nexport interface HeaderActionItem {\n  /** Stable key for the node. */\n  id: string;\n  /** Rendered content (a button, a badge, a `<>`-fragment of several, …). */\n  node: React.ReactNode;\n  /** Slot to render into. Default `'after-mode'` — same spot as the legacy bare-node `actions`. */\n  placement?: HeaderActionPlacement;\n}\n\n/** Per-button visibility for the built-in header actions (`true` hides it). */\nexport interface HeaderDefaultActionToggles {\n  open?: boolean;\n  save?: boolean;\n  exportPdf?: boolean;\n}\n\nexport interface HeaderActionsProps {\n  editor: DocxEditor;\n  /** Current filename (used as the download name and updated on file open). */\n  name: string;\n  onNameChange: (name: string) => void;\n  /** Host chrome: a bare node (rendered at `'after-mode'`) or positioned `HeaderActionItem[]`. */\n  actions?: React.ReactNode | HeaderActionItem[];\n  /** Hide individual built-in buttons (Open / Save / Export PDF). */\n  hideDefaultActions?: HeaderDefaultActionToggles;\n  /** Locks the Editing/Suggesting/Viewing pill to this mode (see `ReactDocxEditorProps.mode`). Omit to let the user switch freely. */\n  mode?: EditorMode;\n  /**\n   * Override what \"Export PDF\" does. Defaults to `editor.printToPdf()`\n   * (the browser's print dialog — works today, no server needed). Pass\n   * this to swap in a server-rendered pipeline instead — e.g. sending\n   * `editor.getExportSnapshot()` to a server that calls `renderHtmlToPdf()`\n   * (`@shashimadushan/docx-editor-editor/headless`) — without changing this button.\n   */\n  onExportPdf?: (editor: DocxEditor) => void;\n  /**\n   * Shows the \"History\" button and wires it to toggle the History sidebar.\n   * Omit (or pass `undefined`) to hide the button entirely — matches\n   * `ReactDocxEditorProps.history: false`, which also disables checkpoint\n   * recording on save.\n   */\n  onToggleHistory?: () => void;\n}\n\nfunction isItemArray(a: HeaderActionsProps['actions']): a is HeaderActionItem[] {\n  return Array.isArray(a);\n}\n\nexport function HeaderActions({\n  editor,\n  name,\n  onNameChange,\n  actions,\n  hideDefaultActions,\n  onExportPdf,\n  onToggleHistory,\n  mode,\n}: HeaderActionsProps): React.ReactElement {\n  const handleOpenFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (!file) return;\n    editor.setLoading(true, 'Loading .docx…');\n    try {\n      const buffer = await file.arrayBuffer();\n      await editor.loadDocx(buffer);\n      onNameChange(file.name);\n    } catch (err) {\n      alert('Failed to open file: ' + (err as Error).message);\n    } finally {\n      editor.setLoading(false);\n    }\n    e.target.value = '';\n  };\n\n  const handleSave = async () => {\n    try {\n      await editor.downloadDocx(name || 'document.docx');\n      if (onToggleHistory) editor.recordCheckpoint({ source: 'user', label: 'Manual save' });\n    } catch (err) {\n      alert('Failed to save: ' + (err as Error).message);\n    }\n  };\n\n  const handleExportPdf = () => {\n    if (onExportPdf) onExportPdf(editor);\n    else editor.printToPdf();\n  };\n\n  // Normalize host chrome to a placement -> nodes map. A bare node keeps its\n  // historical spot ('after-mode').\n  const bySlot = React.useMemo(() => {\n    const map = new Map<HeaderActionPlacement, React.ReactNode[]>();\n    const push = (slot: HeaderActionPlacement, key: string, node: React.ReactNode) => {\n      const list = map.get(slot) ?? [];\n      list.push(<React.Fragment key={key}>{node}</React.Fragment>);\n      map.set(slot, list);\n    };\n    if (isItemArray(actions)) {\n      actions.forEach((it, i) => push(it.placement ?? 'after-mode', it.id || `hai-${i}`, it.node));\n    } else if (actions != null && actions !== false) {\n      push('after-mode', 'legacy-actions', actions);\n    }\n    return map;\n  }, [actions]);\n\n  const slot = (name: HeaderActionPlacement) => bySlot.get(name) ?? null;\n\n  const hide = hideDefaultActions ?? {};\n\n  return (\n    <div className=\"docx-editor-header-actions\">\n      {slot('start')}\n      {slot('before-open')}\n      {!hide.open && (\n        <label className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\" title=\"Open .docx\">\n          <FolderOpenIcon />\n          <span>Open</span>\n          <input type=\"file\" accept=\".docx\" onChange={handleOpenFile} style={{ display: 'none' }} />\n        </label>\n      )}\n      {slot('after-open')}\n      {!hide.save && (\n        <button type=\"button\" className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\" title=\"Save .docx\" onClick={handleSave}>\n          <SaveIcon />\n          <span>Save</span>\n        </button>\n      )}\n      {slot('after-save')}\n      {!hide.exportPdf && (\n        <button type=\"button\" className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\" title=\"Export PDF\" onClick={handleExportPdf}>\n          <PdfExportIcon />\n          <span>Export PDF</span>\n        </button>\n      )}\n      {slot('after-export-pdf')}\n      {onToggleHistory && (\n        <button\n          type=\"button\"\n          className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\"\n          title=\"History\"\n          onClick={onToggleHistory}\n        >\n          <HistoryIcon />\n          <span>History</span>\n        </button>\n      )}\n      {slot('after-history')}\n      <div className=\"docx-editor-header-actions__divider\" />\n      {slot('before-mode')}\n      <ModeSwitcher editor={editor} mode={mode} />\n      {slot('after-mode')}\n      {slot('end')}\n    </div>\n  );\n}\n","/**\n * HistoryManager — pluggable, append-only edit-history storage.\n *\n * Parallels `auto-save.ts`'s `AutoSaveManager`/`StorageAdapter` shape, but\n * where auto-save keeps a single \"latest draft,\" history keeps a *list* of\n * versions: every manual save and every agent-edited turn appends a new\n * `HistoryEntry` (see `../history-types`) instead of overwriting the last one.\n *\n * Usage (default — localStorage):\n *   const manager = new HistoryManager({ key: 'my-doc-history' });\n *   const detach = manager.attach(editor);\n *   // ... later ...\n *   detach();\n *\n * Usage (custom HTTP backend):\n *   const manager = new HistoryManager({\n *     key: 'my-doc',\n *     storage: new HttpHistoryAdapter({ baseUrl: '/api/history', documentId: 'my-doc' }),\n *   });\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport type {\n  HistoryCheckpointMeta,\n  HistoryEntry,\n  HistoryEntryMeta,\n  HistoryStorageAdapter,\n} from '../history-types';\n\nfunction generateHistoryId(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  return `h_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n}\n\n/** Stamps an id onto an appended entry — identical across every adapter that assigns ids client-side. */\nfunction toFullEntry(entry: Omit<HistoryEntry, 'id'>): HistoryEntry {\n  return { ...entry, id: generateHistoryId() };\n}\n\n/** Drops `content` for the list view — every adapter's `list()` does this so full snapshots are only ever fetched one at a time via `get(id)`. */\nfunction stripContent(entries: HistoryEntry[]): HistoryEntryMeta[] {\n  return entries.map(({ content: _content, ...meta }) => meta);\n}\n\n/**\n * Given entries newest-first, returns the subset to keep after applying\n * `prune()`'s options — both a `maxEntries` cap *and* a `maxAgeMs` cutoff\n * must hold. Shared so the \"keep newest N, and only if not too old\" rule\n * only has to be gotten right once; `IndexedDBHistoryAdapter` (which prunes\n * by deleting individual records rather than rewriting the whole list) uses\n * this to compute which ids to delete instead of rewriting directly.\n */\nfunction selectEntriesToKeep<T extends { timestamp: number }>(\n  entriesNewestFirst: T[],\n  opts?: { maxEntries?: number; maxAgeMs?: number },\n): T[] {\n  let kept = entriesNewestFirst;\n  if (opts?.maxEntries != null) kept = kept.slice(0, opts.maxEntries);\n  if (opts?.maxAgeMs != null) {\n    const cutoff = Date.now() - opts.maxAgeMs;\n    kept = kept.filter((e) => e.timestamp >= cutoff);\n  }\n  return kept;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Built-in adapters                                                          */\n/* -------------------------------------------------------------------------- */\n\n/** In-memory adapter (for testing or server-side). */\nexport class MemoryHistoryAdapter implements HistoryStorageAdapter {\n  private entries: HistoryEntry[] = [];\n\n  async append(entry: Omit<HistoryEntry, 'id'>): Promise<HistoryEntry> {\n    const full = toFullEntry(entry);\n    this.entries.unshift(full);\n    return full;\n  }\n\n  async list(): Promise<HistoryEntryMeta[]> {\n    return stripContent(this.entries);\n  }\n\n  async get(id: string): Promise<HistoryEntry | null> {\n    return this.entries.find((e) => e.id === id) ?? null;\n  }\n\n  async prune(opts?: { maxEntries?: number; maxAgeMs?: number }): Promise<void> {\n    this.entries = selectEntriesToKeep(this.entries, opts);\n  }\n\n  async remove(id: string): Promise<void> {\n    this.entries = this.entries.filter((e) => e.id !== id);\n  }\n}\n\n/**\n * localStorage adapter (browser only) — one JSON array under a single key.\n * Simplest possible default; be mindful of localStorage's ~5-10MB quota if\n * documents are large, since every entry stores a full snapshot\n * (`IndexedDBHistoryAdapter` scales further).\n */\nexport class LocalStorageHistoryAdapter implements HistoryStorageAdapter {\n  constructor(private key: string) {}\n\n  private readAll(): HistoryEntry[] {\n    if (typeof localStorage === 'undefined') return [];\n    try {\n      const raw = localStorage.getItem(this.key);\n      return raw ? JSON.parse(raw) : [];\n    } catch {\n      return [];\n    }\n  }\n\n  private writeAll(entries: HistoryEntry[]): void {\n    if (typeof localStorage === 'undefined') return;\n    localStorage.setItem(this.key, JSON.stringify(entries));\n  }\n\n  async append(entry: Omit<HistoryEntry, 'id'>): Promise<HistoryEntry> {\n    const full = toFullEntry(entry);\n    const entries = this.readAll();\n    entries.unshift(full);\n    this.writeAll(entries);\n    return full;\n  }\n\n  async list(): Promise<HistoryEntryMeta[]> {\n    return stripContent(this.readAll());\n  }\n\n  async get(id: string): Promise<HistoryEntry | null> {\n    return this.readAll().find((e) => e.id === id) ?? null;\n  }\n\n  async prune(opts?: { maxEntries?: number; maxAgeMs?: number }): Promise<void> {\n    this.writeAll(selectEntriesToKeep(this.readAll(), opts));\n  }\n\n  async clear(): Promise<void> {\n    if (typeof localStorage === 'undefined') return;\n    localStorage.removeItem(this.key);\n  }\n\n  async remove(id: string): Promise<void> {\n    this.writeAll(this.readAll().filter((e) => e.id !== id));\n  }\n}\n\n/**\n * IndexedDB adapter (browser only) — one object store keyed by entry id.\n * Recommended over `LocalStorageHistoryAdapter` for real use: full-document\n * snapshots accumulate past localStorage's quota quickly, and IndexedDB\n * reads are local-disk-cheap. Note: `list()` still reads every record's\n * bytes (no separate meta-only index) — acceptable for a first version.\n */\nexport class IndexedDBHistoryAdapter implements HistoryStorageAdapter {\n  private dbName: string;\n  private storeName = 'entries';\n  private dbPromise: Promise<IDBDatabase> | null = null;\n\n  constructor(key: string, opts?: { dbName?: string }) {\n    this.dbName = opts?.dbName ?? `docx-editor-history-${key}`;\n  }\n\n  private openDB(): Promise<IDBDatabase> {\n    if (typeof indexedDB === 'undefined') {\n      return Promise.reject(new Error('IndexedDBHistoryAdapter: indexedDB is not available in this environment'));\n    }\n    if (!this.dbPromise) {\n      this.dbPromise = new Promise((resolve, reject) => {\n        const req = indexedDB.open(this.dbName, 1);\n        req.onupgradeneeded = () => {\n          const db = req.result;\n          if (!db.objectStoreNames.contains(this.storeName)) {\n            db.createObjectStore(this.storeName, { keyPath: 'id' });\n          }\n        };\n        req.onsuccess = () => resolve(req.result);\n        req.onerror = () => reject(req.error);\n      });\n    }\n    return this.dbPromise;\n  }\n\n  private async getAllEntries(): Promise<HistoryEntry[]> {\n    const db = await this.openDB();\n    return new Promise((resolve, reject) => {\n      const tx = db.transaction(this.storeName, 'readonly');\n      const req = tx.objectStore(this.storeName).getAll();\n      req.onsuccess = () => resolve(req.result as HistoryEntry[]);\n      req.onerror = () => reject(req.error);\n    });\n  }\n\n  async append(entry: Omit<HistoryEntry, 'id'>): Promise<HistoryEntry> {\n    const db = await this.openDB();\n    const full = toFullEntry(entry);\n    await new Promise<void>((resolve, reject) => {\n      const tx = db.transaction(this.storeName, 'readwrite');\n      tx.objectStore(this.storeName).put(full);\n      tx.oncomplete = () => resolve();\n      tx.onerror = () => reject(tx.error);\n    });\n    return full;\n  }\n\n  async list(): Promise<HistoryEntryMeta[]> {\n    const all = await this.getAllEntries();\n    return stripContent(all).sort((a, b) => b.timestamp - a.timestamp);\n  }\n\n  async get(id: string): Promise<HistoryEntry | null> {\n    const db = await this.openDB();\n    return new Promise((resolve, reject) => {\n      const tx = db.transaction(this.storeName, 'readonly');\n      const req = tx.objectStore(this.storeName).get(id);\n      req.onsuccess = () => resolve((req.result as HistoryEntry) ?? null);\n      req.onerror = () => reject(req.error);\n    });\n  }\n\n  async prune(opts?: { maxEntries?: number; maxAgeMs?: number }): Promise<void> {\n    const all = await this.getAllEntries();\n    const sorted = all.sort((a, b) => b.timestamp - a.timestamp);\n    // IndexedDB prunes by deleting individual records rather than rewriting\n    // the whole list, so compute the keep-set then delete its complement\n    // instead of writing `selectEntriesToKeep`'s result directly.\n    const keepIds = new Set(selectEntriesToKeep(sorted, opts).map((e) => e.id));\n    const toDelete = sorted.filter((e) => !keepIds.has(e.id)).map((e) => e.id);\n    if (toDelete.length === 0) return;\n    const db = await this.openDB();\n    await new Promise<void>((resolve, reject) => {\n      const tx = db.transaction(this.storeName, 'readwrite');\n      const store = tx.objectStore(this.storeName);\n      toDelete.forEach((id) => store.delete(id));\n      tx.oncomplete = () => resolve();\n      tx.onerror = () => reject(tx.error);\n    });\n  }\n\n  async remove(id: string): Promise<void> {\n    const db = await this.openDB();\n    await new Promise<void>((resolve, reject) => {\n      const tx = db.transaction(this.storeName, 'readwrite');\n      tx.objectStore(this.storeName).delete(id);\n      tx.oncomplete = () => resolve();\n      tx.onerror = () => reject(tx.error);\n    });\n  }\n}\n\n/**\n * HTTP API adapter — save/list/get via fetch to a REST endpoint. This is\n * the adapter `examples/demo` wires up against `app/api/history/route.ts`\n * (JSON-file-backed) — any app with a real database implements the same\n * contract: `POST {baseUrl}` (append), `GET {baseUrl}` (list, no content),\n * `GET {baseUrl}/:id` (get, with content).\n */\nexport class HttpHistoryAdapter implements HistoryStorageAdapter {\n  constructor(private opts: {\n    baseUrl: string;\n    /** Scopes requests to one document — sent as a `documentId` query param. */\n    documentId?: string;\n    headers?: Record<string, string>;\n  }) {}\n\n  private withDocId(url: string): string {\n    if (!this.opts.documentId) return url;\n    const sep = url.includes('?') ? '&' : '?';\n    return `${url}${sep}documentId=${encodeURIComponent(this.opts.documentId)}`;\n  }\n\n  async append(entry: Omit<HistoryEntry, 'id'>): Promise<HistoryEntry> {\n    const res = await fetch(this.withDocId(this.opts.baseUrl), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', ...this.opts.headers },\n      body: JSON.stringify(entry),\n    });\n    if (!res.ok) throw new Error(`HttpHistoryAdapter: append failed (${res.status})`);\n    return res.json();\n  }\n\n  async list(): Promise<HistoryEntryMeta[]> {\n    const res = await fetch(this.withDocId(this.opts.baseUrl), { headers: this.opts.headers });\n    if (!res.ok) throw new Error(`HttpHistoryAdapter: list failed (${res.status})`);\n    return res.json();\n  }\n\n  async get(id: string): Promise<HistoryEntry | null> {\n    const base = this.opts.baseUrl.replace(/\\/$/, '');\n    const res = await fetch(this.withDocId(`${base}/${id}`), { headers: this.opts.headers });\n    if (res.status === 404) return null;\n    if (!res.ok) throw new Error(`HttpHistoryAdapter: get failed (${res.status})`);\n    return res.json();\n  }\n\n  async prune(opts?: { maxEntries?: number; maxAgeMs?: number }): Promise<void> {\n    const base = this.opts.baseUrl.replace(/\\/$/, '');\n    await fetch(this.withDocId(`${base}/prune`), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', ...this.opts.headers },\n      body: JSON.stringify(opts ?? {}),\n    });\n  }\n\n  async remove(id: string): Promise<void> {\n    const base = this.opts.baseUrl.replace(/\\/$/, '');\n    const res = await fetch(this.withDocId(`${base}/${id}`), {\n      method: 'DELETE',\n      headers: this.opts.headers,\n    });\n    if (!res.ok && res.status !== 404) throw new Error(`HttpHistoryAdapter: remove failed (${res.status})`);\n  }\n}\n\n/**\n * The subset of `HistoryManager` that the drawer UI (`react/history/`)\n * actually needs — `HistoryDrawer`/`HistoryEntryRow` take this instead of\n * the full class so `useDocumentHistory`'s returned `get`/`restore`\n * functions satisfy it directly, no manager instance or casting required.\n */\nexport interface HistoryManagerLike {\n  get(id: string): Promise<HistoryEntry | null>;\n  restore(id: string): Promise<void>;\n  remove(id: string): Promise<void>;\n}\n\n/* -------------------------------------------------------------------------- */\n/* HistoryManager                                                             */\n/* -------------------------------------------------------------------------- */\n\nexport interface HistoryManagerOptions {\n  /** Unique key for this document's history (used by the default localStorage adapter). */\n  key: string;\n  /** Storage adapter. Defaults to LocalStorageHistoryAdapter. */\n  storage?: HistoryStorageAdapter;\n  /** Prune to at most this many entries after every append. Unset = unbounded. */\n  maxEntries?: number;\n  /** Called with the full entry list whenever it changes (append, restore). */\n  onEntriesChange?: (entries: HistoryEntryMeta[]) => void;\n}\n\nexport class HistoryManager {\n  private storage: HistoryStorageAdapter;\n  private maxEntries?: number;\n  private onEntriesChange?: (entries: HistoryEntryMeta[]) => void;\n  private editor: DocxEditor | null = null;\n  private unsubscribeCheckpoint: (() => void) | null = null;\n\n  constructor(opts: HistoryManagerOptions) {\n    this.storage = opts.storage ?? new LocalStorageHistoryAdapter(opts.key);\n    this.maxEntries = opts.maxEntries;\n    this.onEntriesChange = opts.onEntriesChange;\n  }\n\n  /**\n   * Subscribe to `editor.onCheckpoint()` — every checkpoint (manual save,\n   * agent turn) is snapshotted (`editor.getJSON()`) and appended. Returns a\n   * detach function.\n   */\n  attach(editor: DocxEditor): () => void {\n    this.editor = editor;\n    this.unsubscribeCheckpoint?.();\n    this.unsubscribeCheckpoint = editor.onCheckpoint((meta) => {\n      void this.recordFromCheckpoint(meta);\n    });\n    return () => {\n      this.unsubscribeCheckpoint?.();\n      this.unsubscribeCheckpoint = null;\n      this.editor = null;\n    };\n  }\n\n  private async recordFromCheckpoint(meta: HistoryCheckpointMeta): Promise<void> {\n    if (!this.editor) return;\n    await this.appendAndSync({ ...meta, timestamp: Date.now(), content: this.editor.getJSON(), format: 'json' });\n  }\n\n  /** `append()`, then prune (if configured) and notify — every write path (checkpoint, restore) does exactly this. */\n  private async appendAndSync(entry: Omit<HistoryEntry, 'id'>): Promise<void> {\n    await this.storage.append(entry);\n    if (this.maxEntries != null) await this.storage.prune?.({ maxEntries: this.maxEntries });\n    await this.notifyChange();\n  }\n\n  private async notifyChange(): Promise<void> {\n    if (!this.onEntriesChange) return;\n    this.onEntriesChange(await this.storage.list());\n  }\n\n  list(): Promise<HistoryEntryMeta[]> {\n    return this.storage.list();\n  }\n\n  get(id: string): Promise<HistoryEntry | null> {\n    return this.storage.get(id);\n  }\n\n  /**\n   * Restore `id` as the current document, then append a new `restore` entry\n   * describing the revert. Append-only: never truncates or removes existing\n   * entries, so a revert is itself part of the timeline (Google-Docs style).\n   */\n  async restore(id: string): Promise<void> {\n    if (!this.editor) throw new Error('HistoryManager: not attached to an editor');\n    const entry = await this.storage.get(id);\n    if (!entry) throw new Error(`HistoryManager: no history entry with id \"${id}\"`);\n    this.editor.replaceContent(entry.content);\n    await this.appendAndSync({\n      source: 'restore',\n      label: `Restored from \"${entry.label}\"`,\n      restoredFromId: id,\n      timestamp: Date.now(),\n      content: entry.content,\n      format: 'json',\n    });\n  }\n\n  /** Permanently delete one entry. Does not touch the live document. */\n  async remove(id: string): Promise<void> {\n    if (!this.storage.remove) {\n      throw new Error('HistoryManager: the configured storage adapter does not implement remove()');\n    }\n    await this.storage.remove(id);\n    await this.notifyChange();\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* React hook                                                                 */\n/* -------------------------------------------------------------------------- */\n\nexport function useDocumentHistory(editor: DocxEditor | null, options: HistoryManagerOptions): {\n  entries: HistoryEntryMeta[];\n  refresh: () => Promise<void>;\n  get: (id: string) => Promise<HistoryEntry | null>;\n  restore: (id: string) => Promise<void>;\n  remove: (id: string) => Promise<void>;\n} {\n  const managerRef = React.useRef<HistoryManager | null>(null);\n  const [entries, setEntries] = React.useState<HistoryEntryMeta[]>([]);\n\n  if (!managerRef.current) {\n    managerRef.current = new HistoryManager({\n      ...options,\n      onEntriesChange: setEntries,\n    });\n  }\n\n  const refresh = React.useCallback(async () => {\n    setEntries(await managerRef.current!.list());\n  }, []);\n\n  React.useEffect(() => {\n    if (!editor) return;\n    const detach = managerRef.current!.attach(editor);\n    void refresh();\n    return detach;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [editor]);\n\n  return {\n    entries,\n    refresh,\n    get: (id: string) => managerRef.current!.get(id),\n    restore: (id: string) => managerRef.current!.restore(id),\n    remove: (id: string) => managerRef.current!.remove(id),\n  };\n}\n","/**\n * Diff between the current document and a history snapshot — pure, no\n * React, no ProseMirror. Powers the \"hover a history item to see what\n * changed\" preview: `HistoryEntryRow` calls this on hover, then\n * `DocxEditor.previewHistoryDiff()` (see `../../editor.ts`) renders the\n * result as ProseMirror decorations without touching document content.\n *\n * Two levels, both built on the same LCS alignment (`lcsAlign`):\n *   - Block-level (`diffHistoryBlocks`): treats each top-level node of\n *     `doc.content` as one atomic \"line\" — cheap enough for the block\n *     counts a document actually has (at most a few hundred).\n *   - Word-level (`diffWords`): for a block matched as `modified`, diffs its\n *     text word-by-word so the overlay can highlight only the words that\n *     actually changed instead of tinting the whole paragraph — see\n *     `BlockDiffEntry.wordDiff`.\n */\n\nexport type BlockDiffKind = 'added' | 'removed' | 'modified';\n\nexport type WordDiffKind = 'same' | 'added' | 'removed';\n\nexport interface WordDiffEntry {\n  kind: WordDiffKind;\n  /** The token itself — a run of non-whitespace, or a run of whitespace (tokens preserve every character, so join()-ing all `text` fields losslessly reconstructs the original string). */\n  text: string;\n}\n\nexport interface BlockDiffEntry {\n  kind: BlockDiffKind;\n  /** Index into the CURRENT document's top-level blocks (added/modified only). */\n  currentIndex?: number;\n  /** Index into the SNAPSHOT document's top-level blocks (removed/modified only). */\n  snapshotIndex?: number;\n  /**\n   * `removed` only — index into the CURRENT document's top-level blocks that\n   * this removed content should be anchored *before* (`current.length` means\n   * \"at the end of the document\"). Unlike `snapshotIndex`, this stays valid\n   * as a position in the current doc even once it and the snapshot have a\n   * different number of blocks.\n   */\n  anchorIndex?: number;\n  /** Short text preview, mainly for the `removed` widget pill (no node in the current doc to anchor to). */\n  preview?: string;\n  /** `removed` only — full (untruncated) text of the removed block, for rendering the whole removed line. */\n  removedText?: string;\n  /** `modified` only — word-level diff between the snapshot's and current's full text, in order. */\n  wordDiff?: WordDiffEntry[];\n}\n\nexport interface BlockDiffResult {\n  entries: BlockDiffEntry[];\n}\n\nfunction fingerprintBlock(node: any): string {\n  return `${node?.type ?? ''}:${JSON.stringify(node)}`;\n}\n\nfunction extractNodeText(node: any): string {\n  if (!node) return '';\n  if (typeof node.text === 'string') return node.text;\n  if (Array.isArray(node.content)) return node.content.map(extractNodeText).join('');\n  return '';\n}\n\nfunction textOf(node: any): string {\n  return extractNodeText(node).trim().replace(/\\s+/g, ' ');\n}\n\nfunction previewOf(node: any, maxLen = 60): string {\n  const text = textOf(node);\n  return text.length > maxLen ? `${text.slice(0, maxLen)}…` : text;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Shared LCS alignment                                                       */\n/* -------------------------------------------------------------------------- */\n\ntype AlignOp =\n  | { kind: 'match'; aIndex: number; bIndex: number }\n  | { kind: 'onlyA'; aIndex: number }\n  | { kind: 'onlyB'; bIndex: number };\n\n/**\n * Classic LCS diff over two fingerprint arrays (exact match, not fuzzy).\n * `a` is the \"current/new\" side, `b` the \"snapshot/old\" side — used both for\n * block-level diffing (fingerprints = whole-node JSON) and word-level\n * diffing (fingerprints = the token text itself).\n */\nfunction lcsAlign(aFp: string[], bFp: string[]): AlignOp[] {\n  const n = aFp.length;\n  const m = bFp.length;\n  const width = m + 1;\n\n  // Standard LCS DP table, built backwards so we can greedily walk forward.\n  // Flat Int32Array instead of an array of arrays: one contiguous\n  // allocation instead of n+1 separate JS array objects, which matters once\n  // a large document pushes n/m into the thousands (fewer allocations, much\n  // less per-cell overhead, better cache locality for the same O(n*m) work).\n  const dp = new Int32Array((n + 1) * width);\n  for (let i = n - 1; i >= 0; i--) {\n    const row = i * width;\n    const nextRow = row + width;\n    for (let j = m - 1; j >= 0; j--) {\n      dp[row + j] = aFp[i] === bFp[j] ? dp[nextRow + j + 1] + 1 : Math.max(dp[nextRow + j], dp[row + j + 1]);\n    }\n  }\n\n  const ops: AlignOp[] = [];\n  let i = 0;\n  let j = 0;\n  while (i < n && j < m) {\n    if (aFp[i] === bFp[j]) {\n      ops.push({ kind: 'match', aIndex: i, bIndex: j });\n      i++;\n      j++;\n    } else if (dp[(i + 1) * width + j] >= dp[i * width + j + 1]) {\n      ops.push({ kind: 'onlyA', aIndex: i });\n      i++;\n    } else {\n      ops.push({ kind: 'onlyB', bIndex: j });\n      j++;\n    }\n  }\n  while (i < n) ops.push({ kind: 'onlyA', aIndex: i++ });\n  while (j < m) ops.push({ kind: 'onlyB', bIndex: j++ });\n  return ops;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Block-level diff                                                           */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Diff `current.content` against `snapshot.content` (both full TipTap JSON\n * documents). Returns entries in document order (interleaving added/removed/\n * modified as they occur, matched blocks omitted).\n */\nexport function diffHistoryBlocks(currentDoc: any, snapshotDoc: any): BlockDiffResult {\n  const current: any[] = currentDoc?.content ?? [];\n  const snapshot: any[] = snapshotDoc?.content ?? [];\n  const ops = lcsAlign(current.map(fingerprintBlock), snapshot.map(fingerprintBlock));\n\n  // For every op, which CURRENT-doc block index it should anchor *before* —\n  // its own aIndex for match/onlyA, or the nearest following match/onlyA's\n  // aIndex (current.length if none follows) for onlyB. Lets a standalone\n  // `removed` entry point at a real position in the current doc instead of\n  // the snapshot doc's index space (which the current doc's block count no\n  // longer matches once anything has been added/removed).\n  const anchorForOp: number[] = new Array(ops.length);\n  let nextCurrentIndex = current.length;\n  for (let idx = ops.length - 1; idx >= 0; idx--) {\n    const op = ops[idx];\n    anchorForOp[idx] = op.kind === 'onlyB' ? nextCurrentIndex : op.aIndex;\n    if (op.kind !== 'onlyB') nextCurrentIndex = op.aIndex;\n  }\n\n  // Post-pass: an adjacent (onlyA, onlyB) or (onlyB, onlyA) pair of the same\n  // node `type` reads as one edited block (\"modified\"), not a delete+insert.\n  // Heuristic, not content-similarity — a heavily-rewritten paragraph that no\n  // longer lands adjacent to its old position will show as separate\n  // add+remove instead. Acceptable at block-level granularity.\n  const entries: BlockDiffEntry[] = [];\n  let k = 0;\n  while (k < ops.length) {\n    const op = ops[k];\n    if (op.kind === 'match') {\n      k++;\n      continue;\n    }\n    const next = ops[k + 1];\n    const isAddRemovePair =\n      next && ((op.kind === 'onlyA' && next.kind === 'onlyB') || (op.kind === 'onlyB' && next.kind === 'onlyA'));\n    if (isAddRemovePair) {\n      const addOp = (op.kind === 'onlyA' ? op : next) as Extract<AlignOp, { kind: 'onlyA' }>;\n      const removeOp = (op.kind === 'onlyB' ? op : next) as Extract<AlignOp, { kind: 'onlyB' }>;\n      const addNode = current[addOp.aIndex];\n      const removeNode = snapshot[removeOp.bIndex];\n      if (addNode?.type && addNode.type === removeNode?.type) {\n        entries.push({\n          kind: 'modified',\n          currentIndex: addOp.aIndex,\n          snapshotIndex: removeOp.bIndex,\n          preview: previewOf(addNode),\n          wordDiff: diffWords(extractNodeText(addNode), extractNodeText(removeNode)),\n        });\n        k += 2;\n        continue;\n      }\n    }\n    if (op.kind === 'onlyA') {\n      entries.push({ kind: 'added', currentIndex: op.aIndex, preview: previewOf(current[op.aIndex]) });\n    } else {\n      entries.push({\n        kind: 'removed',\n        snapshotIndex: op.bIndex,\n        anchorIndex: anchorForOp[k],\n        preview: previewOf(snapshot[op.bIndex]),\n        removedText: textOf(snapshot[op.bIndex]),\n      });\n    }\n    k++;\n  }\n\n  return { entries };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Word-level diff                                                            */\n/* -------------------------------------------------------------------------- */\n\n// Splits into alternating non-whitespace/whitespace runs, covering every\n// character — join()-ing the matched tokens reconstructs the input exactly,\n// which the overlay extension relies on to map diff offsets back to\n// ProseMirror positions (see history-diff-overlay.ts).\nconst WORD_TOKEN_RE = /\\S+|\\s+/g;\n\nfunction tokenize(text: string): string[] {\n  return text.match(WORD_TOKEN_RE) ?? [];\n}\n\n/**\n * Word-level diff between `currentText` and `snapshotText`. Whitespace runs\n * are tokens too (not diffed away) so the overlay can precisely map every\n * token back to a text offset — see `WordDiffEntry`.\n */\nexport function diffWords(currentText: string, snapshotText: string): WordDiffEntry[] {\n  const currentTokens = tokenize(currentText);\n  const snapshotTokens = tokenize(snapshotText);\n  const ops = lcsAlign(currentTokens, snapshotTokens);\n  return ops.map((op): WordDiffEntry => {\n    if (op.kind === 'match') return { kind: 'same', text: currentTokens[op.aIndex] };\n    if (op.kind === 'onlyA') return { kind: 'added', text: currentTokens[op.aIndex] };\n    return { kind: 'removed', text: snapshotTokens[op.bIndex] };\n  });\n}\n","/**\n * Shared \"fetch a history entry's snapshot → diff it against the live doc →\n * push the result into the editor's preview overlay\" flow, used by both\n * `HistorySidebar` (which owns a cache + pin state across the whole list)\n * and `HistoryEntryRow`'s standalone fallback (no sidebar wrapping it) — see\n * that component's `pinned`/`onHoverEnter` prop docs. Only the *fetch*\n * strategy differs between the two (a `Map` cache across rows vs. a single\n * `HistoryEntry | null` ref per row); this hook owns the diffing and the\n * race-guard so that logic doesn't drift between the two call sites.\n *\n * The race guard matters twice over: it drops an in-flight fetch that\n * resolves after a *newer* one started (fast mouse pass over several rows),\n * and `clear()` bumps the same counter so an in-flight fetch that resolves\n * *after* the mouse has already left can't re-show a stale diff over a\n * preview that was just cleared.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport type { HistoryEntry } from '../../history-types';\nimport { diffHistoryBlocks } from './historyDiff';\n\nexport function useHistoryDiffPreview(\n  editor: DocxEditor,\n  fetchEntry: (id: string) => Promise<HistoryEntry | null>,\n): {\n  showDiffFor: (id: string) => Promise<void>;\n  clear: () => void;\n} {\n  const latestRequestRef = React.useRef(0);\n\n  const showDiffFor = React.useCallback(\n    async (id: string) => {\n      const requestId = ++latestRequestRef.current;\n      try {\n        const full = await fetchEntry(id);\n        if (requestId !== latestRequestRef.current || !full) return;\n        const diff = diffHistoryBlocks(editor.getJSON(), full.content);\n        if (requestId !== latestRequestRef.current) return;\n        editor.previewHistoryDiff(diff);\n      } catch {\n        // best-effort — a failed diff preview shouldn't break the UI\n      }\n    },\n    [editor, fetchEntry],\n  );\n\n  const clear = React.useCallback(() => {\n    latestRequestRef.current++; // invalidate any fetch still in flight\n    editor.clearHistoryDiffPreview();\n  }, [editor]);\n\n  return { showDiffFor, clear };\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport type { HistoryEntry, HistoryEntryMeta } from '../../history-types';\nimport type { HistoryManagerLike } from '../history';\nimport { useHistoryDiffPreview } from './useHistoryDiffPreview';\nimport { UserIcon, SparklesIcon, RestoreIcon, EyeIcon, EyeOffIcon, TrashIcon } from '../icons';\n\nexport interface HistoryEntryRowProps {\n  entry: HistoryEntryMeta;\n  editor: DocxEditor;\n  manager: HistoryManagerLike;\n  /** Called after a successful revert (e.g. to close the drawer or toast a confirmation). */\n  onRestored?: () => void;\n  /** Called after a successful delete (e.g. so the parent can drop it from a pinned state). */\n  onDeleted?: () => void;\n  /**\n   * Whether this entry's diff is \"pinned\" — i.e. stays visible in the editor\n   * without hovering (\"diff view mode\"), so the confirm/scroll UX doesn't\n   * depend on keeping the mouse over the row. Omit to let the row manage its\n   * own pin state locally (fine when using `HistoryEntryRow` standalone,\n   * outside `HistorySidebar`).\n   */\n  pinned?: boolean;\n  /** Called on hover-enter. Defaults to fetching + previewing this entry's diff directly. */\n  onHoverEnter?: () => void;\n  /** Called on hover-leave. Defaults to clearing the diff preview (unless pinned). */\n  onHoverLeave?: () => void;\n  /**\n   * Called when the \"diff view\" toggle is clicked. Defaults to a local pin\n   * toggle. `HistorySidebar` overrides this to keep only one entry pinned\n   * across the whole list.\n   */\n  onTogglePin?: () => void;\n}\n\nfunction formatTimestamp(ts: number): string {\n  const diff = Date.now() - ts;\n  if (diff < 60000) return 'Just now';\n  if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n  if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n  return new Date(ts).toLocaleString();\n}\n\nfunction badgeFor(source: HistoryEntryMeta['source']): { icon: React.ReactNode; cls: string } {\n  switch (source) {\n    case 'agent':\n      return { icon: <SparklesIcon size={13} />, cls: 'docx-editor-history-entry__badge--agent' };\n    case 'restore':\n      return { icon: <RestoreIcon size={13} />, cls: 'docx-editor-history-entry__badge--restore' };\n    default:\n      return { icon: <UserIcon size={13} />, cls: 'docx-editor-history-entry__badge--user' };\n  }\n}\n\nexport function HistoryEntryRow({\n  entry,\n  editor,\n  manager,\n  onRestored,\n  onDeleted,\n  pinned: pinnedProp,\n  onHoverEnter,\n  onHoverLeave,\n  onTogglePin,\n}: HistoryEntryRowProps): React.ReactElement {\n  // 'restore' (click the row) and 'delete' (click the trash icon) each show\n  // the same inline confirm bar, just with different copy/action.\n  const [confirmMode, setConfirmMode] = React.useState<'restore' | 'delete' | null>(null);\n  const [restoring, setRestoring] = React.useState(false);\n  const [deleting, setDeleting] = React.useState(false);\n  const [localPinned, setLocalPinned] = React.useState(false);\n  const pinned = pinnedProp ?? localPinned;\n  // Caches the fetched full entry (including content) so repeat hovers over\n  // the same row don't re-fetch from a possibly-remote adapter.\n  const fetchedRef = React.useRef<HistoryEntry | null>(null);\n  const fetchEntry = React.useCallback(\n    async (id: string) => {\n      if (fetchedRef.current?.id === id) return fetchedRef.current;\n      const full = await manager.get(id);\n      fetchedRef.current = full;\n      return full;\n    },\n    [manager],\n  );\n  const { showDiffFor, clear: clearDiffPreview } = useHistoryDiffPreview(editor, fetchEntry);\n\n  const handleMouseEnter = () => {\n    if (onHoverEnter) onHoverEnter();\n    else showDiffFor(entry.id);\n  };\n\n  const handleMouseLeave = () => {\n    if (onHoverLeave) onHoverLeave();\n    else if (!pinned) clearDiffPreview();\n  };\n\n  const handleToggleDiffView = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    if (onTogglePin) {\n      onTogglePin();\n      return;\n    }\n    setLocalPinned((prev) => {\n      const next = !prev;\n      if (next) showDiffFor(entry.id);\n      else clearDiffPreview();\n      return next;\n    });\n  };\n\n  const handleRestore = async () => {\n    setRestoring(true);\n    try {\n      await manager.restore(entry.id);\n      onRestored?.();\n    } finally {\n      setRestoring(false);\n      setConfirmMode(null);\n    }\n  };\n\n  const handleDelete = async () => {\n    setDeleting(true);\n    try {\n      // Always — not just `if (pinned)`: a merely-*hovered* (not pinned) row\n      // being removed from the DOM won't fire a mouseleave, so nothing else\n      // clears the overlay. Deleting the last entry made this visible: the\n      // diff for the just-deleted content stayed on screen indefinitely with\n      // no other row left to hover and overwrite it.\n      clearDiffPreview();\n      await manager.remove(entry.id);\n      onDeleted?.();\n    } finally {\n      setDeleting(false);\n      setConfirmMode(null);\n    }\n  };\n\n  const badge = badgeFor(entry.source);\n  const busy = restoring || deleting;\n\n  return (\n    <div\n      className={`docx-editor-history-entry${pinned ? ' docx-editor-history-entry--pinned' : ''}`}\n      onMouseEnter={handleMouseEnter}\n      onMouseLeave={handleMouseLeave}\n      onClick={() => !confirmMode && setConfirmMode('restore')}\n    >\n      <div className={`docx-editor-history-entry__badge ${badge.cls}`}>{badge.icon}</div>\n      <div className=\"docx-editor-history-entry__body\">\n        <div className=\"docx-editor-history-entry__label\">{entry.label}</div>\n        <div className=\"docx-editor-history-entry__timestamp\">{formatTimestamp(entry.timestamp)}</div>\n      </div>\n      <button\n        type=\"button\"\n        className={`docx-editor-history-entry__diff-toggle${pinned ? ' docx-editor-history-entry__diff-toggle--active' : ''}`}\n        title={pinned ? 'Stop showing diff' : 'Keep diff visible while you scroll'}\n        aria-pressed={pinned}\n        onClick={handleToggleDiffView}\n      >\n        {pinned ? <EyeOffIcon size={14} /> : <EyeIcon size={14} />}\n      </button>\n      <button\n        type=\"button\"\n        className=\"docx-editor-history-entry__diff-toggle docx-editor-history-entry__delete-toggle\"\n        title=\"Delete this version\"\n        onClick={(e) => {\n          e.stopPropagation();\n          setConfirmMode('delete');\n        }}\n      >\n        <TrashIcon size={14} />\n      </button>\n\n      {confirmMode && (\n        <div className=\"docx-editor-history-entry__confirm\" onClick={(e) => e.stopPropagation()}>\n          <span className=\"docx-editor-history-entry__confirm-text\">\n            {confirmMode === 'delete' ? 'Delete this version?' : 'Restore this version?'}\n          </span>\n          <button\n            type=\"button\"\n            className=\"docx-editor-history-entry__confirm-btn\"\n            onClick={() => setConfirmMode(null)}\n            disabled={busy}\n          >\n            Cancel\n          </button>\n          {confirmMode === 'delete' ? (\n            <button\n              type=\"button\"\n              className=\"docx-editor-history-entry__confirm-btn docx-editor-history-entry__confirm-btn--danger\"\n              onClick={handleDelete}\n              disabled={busy}\n            >\n              {deleting ? 'Deleting…' : 'Delete'}\n            </button>\n          ) : (\n            <button\n              type=\"button\"\n              className=\"docx-editor-history-entry__confirm-btn docx-editor-history-entry__confirm-btn--primary\"\n              onClick={handleRestore}\n              disabled={busy}\n            >\n              {restoring ? 'Restoring…' : 'Restore'}\n            </button>\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport type { HistoryEntry, HistoryEntryMeta } from '../../history-types';\nimport type { HistoryManagerLike } from '../history';\nimport { HistoryEntryRow } from './HistoryEntryRow';\nimport { useHistoryDiffPreview } from './useHistoryDiffPreview';\nimport { CloseIcon, EyeOffIcon, HistoryIcon } from '../icons';\n\nexport interface HistorySidebarProps {\n  open: boolean;\n  onClose: () => void;\n  editor: DocxEditor;\n  manager: HistoryManagerLike;\n  entries: HistoryEntryMeta[];\n}\n\n/**\n * Docked, collapsible version-history panel (see `HeaderActions.tsx`'s\n * History button) — mounted as a flex sibling of the editor's main column\n * (`ReactDocxEditor.tsx`'s body row), the same docked pattern as the AI\n * agent sidebar (`agent-panel.css`), so opening it shrinks the editor's\n * available width instead of overlaying/dimming it. Always mounted; toggling\n * `open` animates `flex-basis`/`width` to 0 via `[data-closed]` rather than\n * unmounting, so scroll position and hover state survive a close/reopen.\n *\n * Lists every checkpoint — manual saves, AI agent turns, and reverts —\n * newest first. Hovering a row previews its diff in the live document\n * transiently. Clicking a row's eye toggle instead **pins** that entry's\n * diff (\"diff view mode\") so it stays visible without holding the mouse\n * over the row — lets the user scroll the document and read through the\n * changes at their own pace. Only one entry is pinned at a time; hovering a\n * different row still previews it, but leaving that row restores the\n * pinned diff rather than clearing it. Clicking a row (outside the toggle)\n * still reverts after an inline confirm.\n */\nexport function HistorySidebar({ open, onClose, editor, manager, entries }: HistorySidebarProps): React.ReactElement {\n  const [pinnedId, setPinnedId] = React.useState<string | null>(null);\n  // Caches fetched full entries (including content) across rows so\n  // re-hovering or re-pinning doesn't re-fetch from a possibly-remote adapter.\n  const entryCacheRef = React.useRef<Map<string, HistoryEntry>>(new Map());\n  // Diffing a large document is O(blockCount²)-ish (LCS) — a fast mouse pass\n  // over several rows shouldn't run that for every row it merely crossed, so\n  // the actual diff only fires once the pointer settles on one for a beat.\n  const hoverTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const fetchEntry = React.useCallback(\n    async (id: string): Promise<HistoryEntry | null> => {\n      const cached = entryCacheRef.current.get(id);\n      if (cached) return cached;\n      const full = await manager.get(id);\n      if (full) entryCacheRef.current.set(id, full);\n      return full;\n    },\n    [manager],\n  );\n\n  const { showDiffFor, clear: clearDiffPreview } = useHistoryDiffPreview(editor, fetchEntry);\n\n  const clearHoverTimeout = () => {\n    if (hoverTimeoutRef.current) {\n      clearTimeout(hoverTimeoutRef.current);\n      hoverTimeoutRef.current = null;\n    }\n  };\n\n  const handleHoverEnter = React.useCallback(\n    (id: string) => {\n      clearHoverTimeout();\n      hoverTimeoutRef.current = setTimeout(() => showDiffFor(id), 120);\n    },\n    [showDiffFor],\n  );\n\n  const handleHoverLeave = React.useCallback(() => {\n    clearHoverTimeout();\n    if (pinnedId) showDiffFor(pinnedId);\n    else clearDiffPreview();\n  }, [pinnedId, showDiffFor, clearDiffPreview]);\n\n  React.useEffect(() => clearHoverTimeout, []);\n\n  const handleTogglePin = React.useCallback(\n    (id: string) => {\n      setPinnedId((current) => {\n        const next = current === id ? null : id;\n        if (next) showDiffFor(next);\n        else clearDiffPreview();\n        return next;\n      });\n    },\n    [showDiffFor, clearDiffPreview],\n  );\n\n  // Closing the sidebar shouldn't leave a stale diff overlay lit up in the\n  // editor with no visible way to turn it off.\n  React.useEffect(() => {\n    if (!open && pinnedId) {\n      setPinnedId(null);\n      clearDiffPreview();\n    }\n  }, [open, pinnedId, clearDiffPreview]);\n\n  // Safety net for the last entry being deleted while hovered (not pinned):\n  // removing that row from the DOM doesn't fire a mouseleave, so with no\n  // other row left to hover and overwrite it, a stale diff for the\n  // now-deleted content could otherwise stay on screen indefinitely.\n  React.useEffect(() => {\n    if (entries.length === 0) {\n      clearHoverTimeout();\n      if (pinnedId) setPinnedId(null);\n      clearDiffPreview();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [entries.length]);\n\n  return (\n    <div className=\"docx-editor-history-sidebar\" data-closed={!open} aria-hidden={!open}>\n      <div className=\"docx-editor-history-sidebar__header\">\n        <h2 className=\"docx-editor-history-sidebar__title\">Version History</h2>\n        <button type=\"button\" className=\"docx-editor-history-sidebar__close\" title=\"Close\" onClick={onClose}>\n          <CloseIcon size={16} />\n        </button>\n      </div>\n      {pinnedId && (\n        <div className=\"docx-editor-history-sidebar__diff-mode-banner\">\n          <span className=\"docx-editor-history-sidebar__diff-mode-banner-icon\">\n            <EyeOffIcon size={14} />\n          </span>\n          <span>Diff view on — scroll the document to review changes.</span>\n          <button type=\"button\" onClick={() => handleTogglePin(pinnedId)}>\n            Stop\n          </button>\n        </div>\n      )}\n      <div className=\"docx-editor-history-sidebar__body\">\n        {entries.length === 0 ? (\n          <div className=\"docx-editor-history-sidebar__empty\">\n            <span className=\"docx-editor-history-sidebar__empty-icon\">\n              <HistoryIcon size={18} />\n            </span>\n            No versions yet — saves and AI agent edits will show up here.\n          </div>\n        ) : (\n          <div className=\"docx-editor-history-sidebar__list\">\n            {entries.map((entry) => (\n              <HistoryEntryRow\n                key={entry.id}\n                entry={entry}\n                editor={editor}\n                manager={manager}\n                pinned={entry.id === pinnedId}\n                onHoverEnter={() => handleHoverEnter(entry.id)}\n                onHoverLeave={handleHoverLeave}\n                onDeleted={() => {\n                  // Evict so a fetch racing the delete (e.g. a pending hover\n                  // timeout that fires just after) can't resurrect this\n                  // entry's content from the cache into a fresh diff.\n                  entryCacheRef.current.delete(entry.id);\n                  if (entry.id === pinnedId) setPinnedId(null);\n                }}\n                onTogglePin={() => handleTogglePin(entry.id)}\n              />\n            ))}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { FloatingPanel } from '../FloatingPanel';\n\nexport interface MenuDropdownProps {\n  label: string;\n  open: boolean;\n  onToggle: () => void;\n  onClose: () => void;\n  children: React.ReactNode;\n  /** Disable the trigger entirely (e.g. Insert/Format while Viewing). */\n  disabled?: boolean;\n}\n\nexport function MenuDropdown({\n  label,\n  open,\n  onToggle,\n  onClose,\n  children,\n  disabled,\n}: MenuDropdownProps): React.ReactElement {\n  const ref = React.useRef<HTMLButtonElement>(null);\n\n  return (\n    <div className=\"docx-editor-menu-item\">\n      <button\n        ref={ref}\n        type=\"button\"\n        className=\"docx-editor-menu-trigger\"\n        data-open={open ? 'true' : undefined}\n        onClick={onToggle}\n        disabled={disabled}\n        role=\"menuitem\"\n        aria-haspopup=\"menu\"\n        aria-expanded={open}\n      >\n        {label}\n      </button>\n      <FloatingPanel anchorRef={ref} open={open} onClose={onClose} className=\"docx-editor-menu-dropdown\" role=\"menu\">\n        {children}\n      </FloatingPanel>\n    </div>\n  );\n}\n","import * as React from 'react';\n\nexport interface MenuDropdownItemProps {\n  label: string;\n  shortcut?: string;\n  active?: boolean;\n  disabled?: boolean;\n  onClick: () => void;\n}\n\nexport function MenuDropdownItem({\n  label,\n  shortcut,\n  active,\n  disabled,\n  onClick,\n}: MenuDropdownItemProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"docx-editor-menu-dropdown-item\"\n      data-active={active ? 'true' : undefined}\n      disabled={disabled}\n      onClick={onClick}\n      role=\"menuitem\"\n    >\n      <span>{label}</span>\n      {shortcut && <span className=\"docx-editor-menu-dropdown-item__shortcut\">{shortcut}</span>}\n    </button>\n  );\n}\n","import * as React from 'react';\n\nexport function MenuDropdownSeparator(): React.ReactElement {\n  return <div className=\"docx-editor-menu-dropdown-separator\" />;\n}\n","import * as React from 'react';\n\nexport function MenuDropdownLabel({ children }: { children: React.ReactNode }): React.ReactElement {\n  return <div className=\"docx-editor-menu-dropdown-label\">{children}</div>;\n}\n","/**\n * Helper functions for reading the current editor state (used by toolbar\n * dropdowns to show the current value).\n */\n\n/** Get the current paragraph style as a string key. */\nexport function currentParagraphStyle(ed: any): string {\n  for (const level of [1, 2, 3, 4, 5, 6]) {\n    if (ed.isActive('heading', { level })) return `h${level}`;\n  }\n  if (ed.isActive('blockquote')) return 'blockquote';\n  if (ed.isActive('codeBlock')) return 'codeBlock';\n  return 'paragraph';\n}\n\n/** Apply a paragraph style by string key. */\nexport function applyParagraphStyle(ed: any, value: string): void {\n  const chain = ed.chain().focus();\n  if (value === 'paragraph') chain.setParagraph().run();\n  else if (value === 'blockquote') chain.toggleBlockquote().run();\n  else if (value === 'codeBlock') chain.toggleCodeBlock().run();\n  else if (value.startsWith('h')) {\n    const level = Number(value.slice(1));\n    chain.setHeading({ level }).run();\n  }\n}\n\n/** Get the current font size as a px string. */\nexport function currentFontSize(ed: any): string {\n  const fontSize = ed.getAttributes('textStyle').fontSize as string | undefined;\n  if (!fontSize) return String(11 * 1.333); // default 11pt\n  const pxMatch = fontSize.match(/^([\\d.]+)px$/);\n  if (pxMatch) return pxMatch[1];\n  return String(11 * 1.333);\n}\n\n/** Get the current line height as a string. */\nexport function currentLineHeight(ed: any): string {\n  const attrs = ed.getAttributes('paragraph');\n  const lh = attrs?.lineHeight;\n  if (lh) {\n    const num = parseFloat(lh);\n    if (!isNaN(num)) return String(num);\n    return lh;\n  }\n  return '1.5';\n}\n\n/** Get the current text transform value. */\nexport function currentTextTransform(ed: any): string {\n  if (ed.isActive('textTransform')) {\n    const attrs = ed.getAttributes('textTransform');\n    return attrs?.transform || 'none';\n  }\n  return 'none';\n}\n","/**\n * Document structure dialogs and components: page setup, symbol insertion,\n * paste special, watermark, Google Docs paste inlining, document outline,\n * and paragraph style picker.\n *\n * One component per file; this barrel re-exports the same names the old\n * single-file `document-structure.tsx` exported, so nothing outside this\n * folder needs to change its imports.\n */\n\n// `PageSetup`/`PAGE_SIZE_PRESETS` live in core `../../page-setup` (framework-\n// agnostic) since `DocxEditor.setPageSetup()` needs them directly — re-export\n// here for back-compat with existing imports from this folder.\nexport type { PageSetup, PageSizePreset } from '../../page-setup';\nexport { PAGE_SIZE_PRESETS, DEFAULT_PAGE_SETUP } from '../../page-setup';\n\nexport { PageSetupDialog } from './PageSetupDialog';\nexport type { PageSetupDialogProps } from './PageSetupDialog';\n\nexport { PromptDialog } from './PromptDialog';\nexport type { PromptDialogProps } from './PromptDialog';\n\nexport { InsertSymbolDialog } from './InsertSymbolDialog';\nexport type { InsertSymbolDialogProps } from './InsertSymbolDialog';\n\nexport { PasteSpecialDialog } from './PasteSpecialDialog';\nexport type { PasteSpecialDialogProps } from './PasteSpecialDialog';\n\nexport { WatermarkDialog } from './WatermarkDialog';\nexport type { WatermarkDialogProps } from './WatermarkDialog';\n\nexport { GoogleDocsPasteInliner } from './GoogleDocsPasteInliner';\n\nexport { DocumentOutline } from './DocumentOutline';\nexport type { OutlineItem, DocumentOutlineProps } from './DocumentOutline';\n\nexport { ParagraphStylePicker, DEFAULT_NAMED_STYLES } from './ParagraphStylePicker';\nexport type { NamedStyle, ParagraphStylePickerProps } from './ParagraphStylePicker';\n","import * as React from 'react';\nimport { type PageSetup, PAGE_SIZE_PRESETS } from '../../page-setup';\nimport { overlayStyle, dialogStyle, closeBtnStyle, labelStyle, inputStyle, primaryBtnStyle, cancelBtnStyle } from './dialogStyles';\n\nexport interface PageSetupDialogProps {\n  open: boolean;\n  onClose: () => void;\n  current: PageSetup;\n  onApply: (setup: PageSetup) => void;\n}\n\nexport function PageSetupDialog({ open, onClose, current, onApply }: PageSetupDialogProps): React.ReactElement | null {\n  const [setup, setSetup] = React.useState<PageSetup>(current);\n\n  // Resync local state from `current` every time the dialog opens, so a\n  // page setup applied elsewhere (or loaded from localStorage) is reflected\n  // instead of showing whatever was left over from the last time this\n  // component instance rendered its form.\n  React.useEffect(() => {\n    if (open) setSetup(current);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [open]);\n\n  if (!open) return null;\n\n  const apply = () => {\n    onApply(setup);\n    onClose();\n  };\n\n  return (\n    <div onClick={onClose} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={dialogStyle}>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n          <h2 style={{ fontSize: 16, fontWeight: 600, margin: 0 }}>Page Setup</h2>\n          <button onClick={onClose} style={closeBtnStyle}>✕</button>\n        </div>\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>Page Size</label>\n          <select value={setup.size} onChange={(e) => setSetup({ ...setup, size: e.target.value as PageSetup['size'] })} style={inputStyle}>\n            {Object.entries(PAGE_SIZE_PRESETS).map(([key, { label }]) => (\n              <option key={key} value={key}>{label}</option>\n            ))}\n            <option value=\"custom\">Custom</option>\n          </select>\n        </div>\n\n        {setup.size === 'custom' && (\n          <div style={{ marginBottom: 16, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\n            <label style={{ fontSize: 12, color: '#6b7280' }}>Width (mm)\n              <input\n                type=\"number\" step=\"1\" min=\"1\"\n                value={setup.customWidthMm ?? 210}\n                onChange={(e) => setSetup({ ...setup, customWidthMm: Number(e.target.value) })}\n                style={inputStyle}\n              />\n            </label>\n            <label style={{ fontSize: 12, color: '#6b7280' }}>Height (mm)\n              <input\n                type=\"number\" step=\"1\" min=\"1\"\n                value={setup.customHeightMm ?? 297}\n                onChange={(e) => setSetup({ ...setup, customHeightMm: Number(e.target.value) })}\n                style={inputStyle}\n              />\n            </label>\n          </div>\n        )}\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>Orientation</label>\n          <div style={{ display: 'flex', gap: 12 }}>\n            <label style={{ display: 'flex', alignItems: 'center', gap: 4, fontSize: 13, cursor: 'pointer' }}>\n              <input type=\"radio\" checked={setup.orientation === 'portrait'} onChange={() => setSetup({ ...setup, orientation: 'portrait' })} />\n              Portrait\n            </label>\n            <label style={{ display: 'flex', alignItems: 'center', gap: 4, fontSize: 13, cursor: 'pointer' }}>\n              <input type=\"radio\" checked={setup.orientation === 'landscape'} onChange={() => setSetup({ ...setup, orientation: 'landscape' })} />\n              Landscape\n            </label>\n          </div>\n        </div>\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>Margins (inches)</label>\n          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\n            <label style={{ fontSize: 12, color: '#6b7280' }}>Horizontal (left/right)\n              <input type=\"number\" step=\"0.25\" min=\"0\" value={setup.marginX} onChange={(e) => setSetup({ ...setup, marginX: Number(e.target.value) })} style={inputStyle} />\n            </label>\n            <label style={{ fontSize: 12, color: '#6b7280' }}>Vertical (top/bottom)\n              <input type=\"number\" step=\"0.25\" min=\"0\" value={setup.marginY} onChange={(e) => setSetup({ ...setup, marginY: Number(e.target.value) })} style={inputStyle} />\n            </label>\n          </div>\n        </div>\n\n        <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, marginTop: 16 }}>\n          <button onClick={onClose} style={cancelBtnStyle}>Cancel</button>\n          <button onClick={apply} style={primaryBtnStyle}>Apply</button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\n\n/** Shared inline-style objects for the modal dialogs in this folder. */\nexport const overlayStyle: React.CSSProperties = {\n  position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.4)', zIndex: 1000,\n  display: 'grid', placeItems: 'center',\n};\nexport const dialogStyle: React.CSSProperties = {\n  background: '#fff', borderRadius: 12, padding: 24, width: 400, maxWidth: '90vw',\n  boxShadow: '0 8px 32px rgba(0,0,0,0.2)',\n};\nexport const closeBtnStyle: React.CSSProperties = {\n  border: 'none', background: 'transparent', fontSize: 16, cursor: 'pointer', color: '#6b7280',\n};\nexport const labelStyle: React.CSSProperties = {\n  display: 'block', fontSize: 12, fontWeight: 500, color: '#374151', marginBottom: 4,\n};\nexport const inputStyle: React.CSSProperties = {\n  width: '100%', padding: '6px 8px', fontSize: 13, border: '1px solid #d0d7de',\n  borderRadius: 4, outline: 'none', boxSizing: 'border-box',\n};\nexport const primaryBtnStyle: React.CSSProperties = {\n  padding: '6px 16px', fontSize: 13, background: '#2563eb', color: '#fff',\n  border: 'none', borderRadius: 4, cursor: 'pointer', fontWeight: 500,\n};\nexport const cancelBtnStyle: React.CSSProperties = {\n  padding: '6px 16px', fontSize: 13, background: '#fff', color: '#374151',\n  border: '1px solid #d0d7de', borderRadius: 4, cursor: 'pointer',\n};\n","/**\n * PromptDialog — a small reusable modal that replaces `window.prompt` for\n * a single text-input value (Insert link URL, Insert image from URL, Edit\n * existing link, header/footer HTML on mobile).\n *\n * `window.prompt`/`window.confirm` are unreliable (often silently no-op or\n * unsupported) inside a React Native WebView, which is where the mobile\n * layout mode is ultimately meant to run — so the mobile UI paths route\n * through this dialog instead. Desktop (`Toolbar.tsx`, `MenuBar.tsx`) keeps\n * using `window.prompt` unchanged; this component is additive, not a\n * replacement for the desktop behavior.\n *\n * Styled to match the other modals in this folder (`PageSetupDialog`,\n * `WatermarkDialog`) via the shared `dialogStyles.ts` — a single label +\n * text input + Cancel/OK, nothing fancier.\n */\nimport * as React from 'react';\nimport { overlayStyle, dialogStyle, closeBtnStyle, labelStyle, inputStyle, primaryBtnStyle, cancelBtnStyle } from './dialogStyles';\n\nexport interface PromptDialogProps {\n  open: boolean;\n  /** Dialog title / field label (e.g. \"Link URL\", \"Image URL\"). */\n  label: string;\n  /** Initial value shown in the input. */\n  defaultValue?: string;\n  placeholder?: string;\n  /** Text shown on the confirm button. Default \"OK\". */\n  confirmLabel?: string;\n  /** Called with the entered value when the user confirms. */\n  onSubmit: (value: string) => void;\n  /** Called when the user cancels/dismisses without submitting. */\n  onCancel: () => void;\n}\n\nexport function PromptDialog({\n  open,\n  label,\n  defaultValue = '',\n  placeholder,\n  confirmLabel = 'OK',\n  onSubmit,\n  onCancel,\n}: PromptDialogProps): React.ReactElement | null {\n  const [value, setValue] = React.useState(defaultValue);\n  const inputRef = React.useRef<HTMLInputElement>(null);\n\n  // Resync from `defaultValue` every time the dialog opens (mirrors\n  // PageSetupDialog's resync-on-open pattern) and autofocus the input.\n  React.useEffect(() => {\n    if (open) {\n      setValue(defaultValue);\n      // Focus after the input has mounted/painted.\n      requestAnimationFrame(() => inputRef.current?.focus());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [open]);\n\n  if (!open) return null;\n\n  const submit = () => onSubmit(value);\n\n  return (\n    <div onClick={onCancel} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={dialogStyle}>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n          <h2 style={{ fontSize: 16, fontWeight: 600, margin: 0 }}>{label}</h2>\n          <button onClick={onCancel} style={closeBtnStyle}>✕</button>\n        </div>\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>{label}</label>\n          <input\n            ref={inputRef}\n            type=\"text\"\n            value={value}\n            placeholder={placeholder}\n            onChange={(e) => setValue(e.target.value)}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') submit();\n              else if (e.key === 'Escape') onCancel();\n            }}\n            style={inputStyle}\n          />\n        </div>\n\n        <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, marginTop: 16 }}>\n          <button onClick={onCancel} style={cancelBtnStyle}>Cancel</button>\n          <button onClick={submit} style={primaryBtnStyle}>{confirmLabel}</button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { overlayStyle, dialogStyle, closeBtnStyle, inputStyle } from './dialogStyles';\n\nconst SYMBOL_CATEGORIES: Record<string, string[]> = {\n  'Common': ['©', '®', '™', '°', '±', '×', '÷', '∞', '√', '∑', '∫', 'π', '≈', '≠', '≤', '≥', '→', '←', '↑', '↓', '↔', '•', '…', '—', '–', '§', '¶', '†', '‡'],\n  'Currency': ['$', '€', '£', '¥', '₹', '₽', '₩', '₪', '₫', '₱', '฿', '₴', '₸', '₡', '₦', '₮'],\n  'Math': ['+', '−', '×', '÷', '±', '∞', '√', '∑', '∫', 'π', '∂', '∆', '∇', '∝', '∠', '⊥', '∥', '∈', '∉', '∩', '∪', '⊂', '⊃', '⊆', '⊇', '⊕', '⊗'],\n  'Arrows': ['→', '←', '↑', '↓', '↔', '↕', '⇒', '⇐', '⇑', '⇓', '⇔', '⇕', '↦', '↪', '↩', '➜', '➡', '⬅', '⬆', '⬇'],\n  'Greek': ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Λ', 'Μ', 'Ξ', 'Π', 'Σ', 'Φ', 'Ψ', 'Ω'],\n  'Punctuation': ['«', '»', '‹', '›', '„', '“', '”', '‘', '’', '‚', '‛', '¿', '¡', '¦', '¨', '¯', '¸'],\n  'Superscript': ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹', '⁺', '⁻', '⁼', '⁽', '⁾', 'ⁿ', 'ⁱ'],\n  'Subscript': ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉', '₊', '₋', '₌', '₍', '₎', 'ₐ', 'ₑ', 'ₒ', 'ₓ'],\n};\n\nexport interface InsertSymbolDialogProps {\n  open: boolean;\n  onClose: () => void;\n  onInsert: (symbol: string) => void;\n}\n\nexport function InsertSymbolDialog({ open, onClose, onInsert }: InsertSymbolDialogProps): React.ReactElement | null {\n  const [category, setCategory] = React.useState('Common');\n  const [search, setSearch] = React.useState('');\n  const [recent, setRecent] = React.useState<string[]>([]);\n\n  if (!open) return null;\n\n  let symbols: string[];\n  if (search) {\n    symbols = Object.values(SYMBOL_CATEGORIES).flat().filter((s) => s.includes(search));\n  } else {\n    symbols = SYMBOL_CATEGORIES[category] || [];\n  }\n\n  const handleInsert = (sym: string) => {\n    onInsert(sym);\n    setRecent((prev) => [sym, ...prev.filter((s) => s !== sym)].slice(0, 10));\n  };\n\n  return (\n    <div onClick={onClose} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={{ ...dialogStyle, width: 480 }}>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n          <h2 style={{ fontSize: 16, fontWeight: 600, margin: 0 }}>Insert Symbol</h2>\n          <button onClick={onClose} style={closeBtnStyle}>✕</button>\n        </div>\n\n        <input\n          type=\"text\"\n          placeholder=\"Search...\"\n          value={search}\n          onChange={(e) => setSearch(e.target.value)}\n          style={{ ...inputStyle, marginBottom: 12, width: '100%' }}\n        />\n\n        {!search && (\n          <div style={{ display: 'flex', gap: 4, marginBottom: 12, flexWrap: 'wrap' }}>\n            {Object.keys(SYMBOL_CATEGORIES).map((cat) => (\n              <button key={cat} onClick={() => setCategory(cat)}\n                style={{\n                  padding: '4px 10px', fontSize: 12, border: '1px solid #e5e7eb', borderRadius: 12,\n                  background: category === cat ? '#2563eb' : '#fff', color: category === cat ? '#fff' : '#374151',\n                  cursor: 'pointer',\n                }}>\n                {cat}\n              </button>\n            ))}\n          </div>\n        )}\n\n        {recent.length > 0 && (\n          <>\n            <div style={{ fontSize: 11, fontWeight: 600, color: '#6b7280', marginBottom: 4 }}>Recent</div>\n            <div style={{ display: 'flex', gap: 4, marginBottom: 12, flexWrap: 'wrap' }}>\n              {recent.map((s, i) => (\n                <button key={i} onClick={() => handleInsert(s)} style={symbolBtnStyle}>{s}</button>\n              ))}\n            </div>\n          </>\n        )}\n\n        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(10, 1fr)', gap: 4, maxHeight: 280, overflow: 'auto' }}>\n          {symbols.map((s, i) => (\n            <button key={i} onClick={() => handleInsert(s)} style={symbolBtnStyle}>{s}</button>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nconst symbolBtnStyle: React.CSSProperties = {\n  width: 36, height: 36, fontSize: 18, border: '1px solid #e5e7eb', background: '#fff',\n  borderRadius: 6, cursor: 'pointer', display: 'grid', placeItems: 'center', color: '#1f2328',\n};\n","import * as React from 'react';\nimport { overlayStyle, dialogStyle } from './dialogStyles';\n\nexport interface PasteSpecialDialogProps {\n  open: boolean;\n  onClose: () => void;\n  onPaste: (mode: 'formatted' | 'plain') => void;\n}\n\nexport function PasteSpecialDialog({ open, onClose, onPaste }: PasteSpecialDialogProps): React.ReactElement | null {\n  if (!open) return null;\n  return (\n    <div onClick={onClose} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={{ ...dialogStyle, width: 320 }}>\n        <h2 style={{ fontSize: 16, fontWeight: 600, margin: '0 0 16px 0' }}>Paste Special</h2>\n        <button onClick={() => { onPaste('formatted'); onClose(); }} style={pasteOptionStyle}>\n          <strong>Keep formatting</strong>\n          <br /><span style={{ fontSize: 11, color: '#6b7280' }}>Paste with source formatting (fonts, colors, styles)</span>\n        </button>\n        <button onClick={() => { onPaste('plain'); onClose(); }} style={pasteOptionStyle}>\n          <strong>Paste as plain text</strong>\n          <br /><span style={{ fontSize: 11, color: '#6b7280' }}>Remove all formatting, keep text only</span>\n        </button>\n      </div>\n    </div>\n  );\n}\n\nconst pasteOptionStyle: React.CSSProperties = {\n  display: 'block', width: '100%', padding: 12, marginBottom: 8, border: '1px solid #e5e7eb',\n  background: '#fff', borderRadius: 8, cursor: 'pointer', textAlign: 'left', fontSize: 13, color: '#1f2328',\n};\n","import * as React from 'react';\nimport {\n  type WatermarkConfig,\n  DEFAULT_WATERMARK,\n  DEFAULT_WATERMARK_PRESETS,\n} from '../../extensions/builtins/watermark';\nimport { overlayStyle, dialogStyle, closeBtnStyle, labelStyle, inputStyle, primaryBtnStyle, cancelBtnStyle } from './dialogStyles';\n\n/** Best-effort extraction of a hex color from an rgb()/rgba()/hex string, for populating a native `<input type=\"color\">`. */\nfunction toHexColor(color: string | undefined): string {\n  if (!color) return '#d00707';\n  if (color.startsWith('#')) return color.length === 7 ? color : '#d00707';\n  const m = color.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/);\n  if (!m) return '#d00707';\n  const toHex = (n: string) => Number(n).toString(16).padStart(2, '0');\n  return `#${toHex(m[1])}${toHex(m[2])}${toHex(m[3])}`;\n}\n\nexport interface WatermarkDialogProps {\n  open: boolean;\n  onClose: () => void;\n  /** The watermark currently applied (or null if none) — used to prefill the form. */\n  current: WatermarkConfig | null;\n  /** Called with the new config to apply, or `null` to remove the watermark. */\n  onApply: (config: WatermarkConfig | null) => void;\n}\n\nexport function WatermarkDialog({ open, onClose, current, onApply }: WatermarkDialogProps): React.ReactElement | null {\n  const base = { ...DEFAULT_WATERMARK, ...current };\n  const [text, setText] = React.useState(current?.text ?? '');\n  const [color, setColor] = React.useState(toHexColor(base.color));\n  const [fontSize, setFontSize] = React.useState(base.fontSize ?? 56);\n  const [rotation, setRotation] = React.useState(base.rotation ?? -30);\n  const [opacity, setOpacity] = React.useState(base.opacity ?? 0.18);\n\n  if (!open) return null;\n\n  const apply = () => {\n    const trimmed = text.trim();\n    if (!trimmed) {\n      onApply(null);\n    } else {\n      onApply({ text: trimmed, color, fontSize, rotation, opacity });\n    }\n    onClose();\n  };\n\n  const applyPreset = (config: WatermarkConfig) => {\n    setText(config.text);\n    setColor(toHexColor(config.color));\n    setFontSize(config.fontSize ?? 56);\n    setRotation(config.rotation ?? -30);\n    setOpacity(config.opacity ?? 0.18);\n  };\n\n  return (\n    <div onClick={onClose} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={{ ...dialogStyle, width: 380 }}>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n          <h2 style={{ fontSize: 16, fontWeight: 600, margin: 0 }}>Custom Watermark</h2>\n          <button onClick={onClose} style={closeBtnStyle}>✕</button>\n        </div>\n\n        <div style={{ marginBottom: 14 }}>\n          <label style={labelStyle}>Text</label>\n          <input\n            type=\"text\"\n            value={text}\n            onChange={(e) => setText(e.target.value)}\n            placeholder=\"e.g. CONFIDENTIAL\"\n            style={inputStyle}\n            autoFocus\n          />\n        </div>\n\n        <div style={{ marginBottom: 14, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\n          <label style={{ fontSize: 12, color: '#6b7280' }}>\n            Color\n            <input\n              type=\"color\"\n              value={color}\n              onChange={(e) => setColor(e.target.value)}\n              style={{ ...inputStyle, padding: 2, height: 30, cursor: 'pointer' }}\n            />\n          </label>\n          <label style={{ fontSize: 12, color: '#6b7280' }}>\n            Font size (px)\n            <input\n              type=\"number\"\n              min={12}\n              max={200}\n              value={fontSize}\n              onChange={(e) => setFontSize(Number(e.target.value))}\n              style={inputStyle}\n            />\n          </label>\n        </div>\n\n        <div style={{ marginBottom: 14 }}>\n          <label style={labelStyle}>Rotation ({rotation}°)</label>\n          <input\n            type=\"range\"\n            min={-90}\n            max={90}\n            value={rotation}\n            onChange={(e) => setRotation(Number(e.target.value))}\n            style={{ width: '100%' }}\n          />\n        </div>\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>Opacity ({Math.round(opacity * 100)}%)</label>\n          <input\n            type=\"range\"\n            min={0.05}\n            max={1}\n            step={0.01}\n            value={opacity}\n            onChange={(e) => setOpacity(Number(e.target.value))}\n            style={{ width: '100%' }}\n          />\n        </div>\n\n        <div style={{ marginBottom: 16 }}>\n          <label style={labelStyle}>Presets</label>\n          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n            {DEFAULT_WATERMARK_PRESETS.map(({ label, config }) => (\n              <button\n                key={label}\n                type=\"button\"\n                onClick={() => applyPreset(config)}\n                style={{\n                  padding: '4px 10px', fontSize: 12, border: '1px solid #d0d7de',\n                  background: '#fff', borderRadius: 999, cursor: 'pointer', color: '#374151',\n                }}\n              >\n                {label}\n              </button>\n            ))}\n          </div>\n        </div>\n\n        <div style={{ display: 'flex', justifyContent: 'space-between', gap: 8, marginTop: 16 }}>\n          <button\n            onClick={() => { onApply(null); onClose(); }}\n            style={{ ...cancelBtnStyle, color: '#b91c1c', borderColor: '#fecaca' }}\n          >\n            Remove watermark\n          </button>\n          <div style={{ display: 'flex', gap: 8 }}>\n            <button onClick={onClose} style={cancelBtnStyle}>Cancel</button>\n            <button onClick={apply} style={primaryBtnStyle} disabled={!text.trim()}>Apply</button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\n/**\n * Intercept paste from Google Docs — parse `<style>` rules and inline them\n * onto matching elements, and unwrap Google Docs' structural wrappers.\n */\nexport const GoogleDocsPasteInliner = Extension.create({\n  name: 'googleDocsPasteInliner',\n\n  addProseMirrorPlugins() {\n    return [\n      new Plugin({\n        key: new PluginKey('googleDocsPasteInliner'),\n        props: {\n          handlePaste(view: any, event: ClipboardEvent) {\n            const html = event.clipboardData?.getData('text/html');\n            if (!html) return false;\n\n            // Detect Google Docs paste (contains docs-internal-guid or Google Docs style rules)\n            if (!html.includes('docs-internal-guid') && !html.includes('google.com')) {\n              return false;\n            }\n\n            // Parse the HTML and inline styles\n            const parser = new DOMParser();\n            const doc = parser.parseFromString(html, 'text/html');\n\n            // Extract <style> rules\n            const styleEls = doc.querySelectorAll('style');\n            const rules: Array<{ selector: string; styles: string }> = [];\n            styleEls.forEach((styleEl) => {\n              const cssText = styleEl.textContent || '';\n              const ruleRegex = /([^{]+)\\{([^}]+)\\}/g;\n              let match;\n              while ((match = ruleRegex.exec(cssText)) !== null) {\n                rules.push({\n                  selector: match[1].trim(),\n                  styles: match[2].trim(),\n                });\n              }\n              styleEl.remove();\n            });\n\n            // Apply rules to matching elements\n            for (const rule of rules) {\n              try {\n                const els = doc.querySelectorAll(rule.selector);\n                els.forEach((el) => {\n                  const existing = el.getAttribute('style') || '';\n                  el.setAttribute('style', existing + ';' + rule.styles);\n                });\n              } catch {\n                // Invalid selector — skip\n              }\n            }\n\n            // Unwrap Google Docs' <b id=\"docs-internal-guid-...\"> wrapper\n            const guidEls = doc.querySelectorAll('b[id^=\"docs-internal-guid\"]');\n            guidEls.forEach((el) => {\n              const parent = el.parentNode;\n              if (parent) {\n                while (el.firstChild) {\n                  parent.insertBefore(el.firstChild, el);\n                }\n                parent.removeChild(el);\n              }\n            });\n\n            // Serialize back to HTML and let TipTap process it\n            const cleanedHtml = doc.body.innerHTML;\n            if (cleanedHtml && cleanedHtml !== html) {\n              event.preventDefault();\n              view.pasteHTML?.(cleanedHtml) || view.dispatch(view.state.tr.insertText(cleanedHtml));\n              return true;\n            }\n\n            return false;\n          },\n        },\n      }),\n    ];\n  },\n});\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { closeBtnStyle } from './dialogStyles';\n\n/** Heading navigation sidebar. */\nexport interface OutlineItem {\n  index: number;\n  level: number;\n  text: string;\n}\n\nexport interface DocumentOutlineProps {\n  editor: DocxEditor;\n  open: boolean;\n  onClose: () => void;\n}\n\nexport function DocumentOutline({ editor, open, onClose }: DocumentOutlineProps): React.ReactElement | null {\n  const [outlines, setOutlines] = React.useState<OutlineItem[]>([]);\n\n  React.useEffect(() => {\n    const update = () => {\n      const json = editor.getJSON();\n      const items: OutlineItem[] = [];\n      if (json?.content) {\n        json.content.forEach((block: any, i: number) => {\n          if (block.type === 'heading') {\n            const text = (block.content || []).map((r: any) => r.text || '').join('');\n            items.push({ index: i, level: block.attrs?.level || 1, text });\n          }\n        });\n      }\n      setOutlines(items);\n    };\n    update();\n    editor.editor.on('update', update);\n    editor.editor.on('transaction', update);\n    return () => {\n      editor.editor.off('update', update);\n      editor.editor.off('transaction', update);\n    };\n  }, [editor]);\n\n  if (!open) return null;\n\n  const scrollTo = (index: number) => {\n    const pm = editor.getHost()?.querySelector('.ProseMirror');\n    if (!pm) return;\n    const children = pm.children;\n    if (children[index]) {\n      (children[index] as HTMLElement).scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  };\n\n  return (\n    <div style={{\n      width: 240, flexShrink: 0, borderRight: '1px solid #e5e7eb', background: '#fafbfc',\n      display: 'flex', flexDirection: 'column', overflow: 'hidden',\n    }}>\n      <div style={{ padding: '8px 12px', borderBottom: '1px solid #e5e7eb', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n        <span style={{ fontSize: 13, fontWeight: 600, color: '#1f2328' }}>Outline</span>\n        <button onClick={onClose} style={closeBtnStyle}>✕</button>\n      </div>\n      <div style={{ flex: 1, overflow: 'auto', padding: '4px 0' }}>\n        {outlines.length === 0 ? (\n          <div style={{ padding: 16, fontSize: 12, color: '#9ca3af', textAlign: 'center' }}>\n            No headings found. Add headings to see the outline.\n          </div>\n        ) : (\n          outlines.map((item) => (\n            <button\n              key={item.index}\n              onClick={() => scrollTo(item.index)}\n              style={{\n                display: 'block', width: '100%', padding: `4px 12px 4px ${12 + (item.level - 1) * 16}px`,\n                border: 'none', background: 'transparent', cursor: 'pointer', textAlign: 'left',\n                fontSize: 12, color: '#374151', lineHeight: 1.4,\n              }}\n              onMouseEnter={(e) => { e.currentTarget.style.background = '#f3f4f6'; }}\n              onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}\n            >\n              {item.text || '(empty heading)'}\n            </button>\n          ))\n        )}\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\n\n/** Named styles with preview. */\nexport interface NamedStyle {\n  id: string;\n  label: string;\n  preview: { fontFamily?: string; fontSize?: string; fontWeight?: string; color?: string; fontStyle?: string };\n}\n\nexport const DEFAULT_NAMED_STYLES: NamedStyle[] = [\n  { id: 'paragraph', label: 'Normal', preview: { fontSize: '11pt' } },\n  { id: 'h1', label: 'Heading 1', preview: { fontSize: '24pt', fontWeight: '700' } },\n  { id: 'h2', label: 'Heading 2', preview: { fontSize: '18pt', fontWeight: '700' } },\n  { id: 'h3', label: 'Heading 3', preview: { fontSize: '14pt', fontWeight: '700' } },\n  { id: 'h4', label: 'Heading 4', preview: { fontSize: '12pt', fontWeight: '700' } },\n  { id: 'h5', label: 'Heading 5', preview: { fontSize: '11pt', fontWeight: '700', fontStyle: 'italic' } },\n  { id: 'h6', label: 'Heading 6', preview: { fontSize: '11pt', fontWeight: '700', color: '#57606a' } },\n  { id: 'blockquote', label: 'Quote', preview: { fontStyle: 'italic', color: '#57606a' } },\n  { id: 'codeBlock', label: 'Code', preview: { fontFamily: 'monospace', fontSize: '10pt' } },\n];\n\nexport interface ParagraphStylePickerProps {\n  editor: DocxEditor;\n  styles?: NamedStyle[];\n}\n\nexport function ParagraphStylePicker({\n  editor,\n  styles = DEFAULT_NAMED_STYLES,\n}: ParagraphStylePickerProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const ref = React.useRef<HTMLDivElement>(null);\n  const ed = editor.editor;\n\n  const current = (() => {\n    for (const level of [1, 2, 3, 4, 5, 6]) {\n      if (ed.isActive('heading', { level })) return `h${level}`;\n    }\n    if (ed.isActive('blockquote')) return 'blockquote';\n    if (ed.isActive('codeBlock')) return 'codeBlock';\n    return 'paragraph';\n  })();\n\n  const currentStyle = styles.find((s) => s.id === current);\n\n  React.useEffect(() => {\n    if (!open) return;\n    const onDoc = (e: MouseEvent) => {\n      if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n    };\n    document.addEventListener('mousedown', onDoc);\n    return () => document.removeEventListener('mousedown', onDoc);\n  }, [open]);\n\n  const apply = (id: string) => {\n    const chain = ed.chain().focus();\n    if (id === 'paragraph') chain.setParagraph().run();\n    else if (id === 'blockquote') chain.toggleBlockquote().run();\n    else if (id === 'codeBlock') chain.toggleCodeBlock().run();\n    else if (id.startsWith('h')) chain.setHeading({ level: Number(id.slice(1)) as any }).run();\n    setOpen(false);\n  };\n\n  return (\n    <div ref={ref} style={{ position: 'relative' }}>\n      <button onClick={() => setOpen(!open)} style={triggerStyle}>\n        <span style={currentStyle?.preview}>{currentStyle?.label || 'Normal'}</span>\n        <span style={{ fontSize: 10, opacity: 0.6 }}>▼</span>\n      </button>\n      {open && (\n        <div style={menuStyle}>\n          {styles.map((s) => (\n            <button key={s.id} onClick={() => apply(s.id)} style={optionStyle}>\n              <span style={s.preview}>{s.label}</span>\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n\nconst triggerStyle: React.CSSProperties = {\n  display: 'flex', alignItems: 'center', gap: 4, height: 28, padding: '0 8px',\n  border: '1px solid #e5e7eb', background: '#fff', borderRadius: 4, cursor: 'pointer',\n  fontSize: 13, color: '#1f2328',\n};\nconst menuStyle: React.CSSProperties = {\n  position: 'absolute', top: '100%', left: 0, marginTop: 4, background: '#fff',\n  border: '1px solid #d0d7de', borderRadius: 6, boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n  padding: 4, zIndex: 1000, minWidth: 160,\n};\nconst optionStyle: React.CSSProperties = {\n  display: 'block', width: '100%', padding: '6px 10px', border: 'none', background: 'transparent',\n  cursor: 'pointer', textAlign: 'left', fontSize: 13, color: '#1f2328', borderRadius: 4,\n};\n","/**\n * Persists the user's last-used Page Setup as a single global localStorage\n * preference (not per-document). Kept separate from core `page-setup.ts` so\n * `DocxEditor.setPageSetup()` stays a pure function with no implicit I/O —\n * matches the opt-in-storage pattern used by `AutoSaveManager`.\n */\nimport type { PageSetup } from '../page-setup';\n\nconst KEY = 'docx-editor:page-setup';\n\nexport function loadPageSetup(): PageSetup | null {\n  if (typeof localStorage === 'undefined') return null;\n  const raw = localStorage.getItem(KEY);\n  if (!raw) return null;\n  try {\n    return JSON.parse(raw) as PageSetup;\n  } catch {\n    return null;\n  }\n}\n\nexport function savePageSetup(setup: PageSetup): void {\n  if (typeof localStorage === 'undefined') return;\n  localStorage.setItem(KEY, JSON.stringify(setup));\n}\n\n/**\n * Persists the user's last-used page zoom level (see `usePageZoom.ts`) the\n * same way `loadPageSetup`/`savePageSetup` persist page setup — a single\n * global localStorage preference, not per-document. Kept in this file\n * (rather than a new one) since it already owns the \"persist editor\n * display prefs to localStorage\" concern.\n */\nconst ZOOM_KEY = 'docx-editor:zoom';\n\nexport function loadZoom(): number | null {\n  if (typeof localStorage === 'undefined') return null;\n  const raw = localStorage.getItem(ZOOM_KEY);\n  if (!raw) return null;\n  const n = Number(raw);\n  return Number.isFinite(n) && n > 0 ? n : null;\n}\n\nexport function saveZoom(zoom: number): void {\n  if (typeof localStorage === 'undefined') return;\n  localStorage.setItem(ZOOM_KEY, String(zoom));\n}\n","/**\n * MenuBar — the File / Insert / Format / View menu bar above the toolbar.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport {\n  currentParagraphStyle,\n} from '../helpers';\nimport { insertTableFitted } from '../../extensions/builtins/table-enhancements';\nimport { WatermarkDialog, PageSetupDialog } from '../document-structure';\nimport { savePageSetup } from '../page-setup-storage';\nimport { MenuDropdown } from './MenuDropdown';\nimport { MenuDropdownItem } from './MenuDropdownItem';\nimport { MenuDropdownSeparator } from './MenuDropdownSeparator';\nimport { MenuDropdownLabel } from './MenuDropdownLabel';\n\nexport interface MenuBarProps {\n  editor: DocxEditor;\n  /**\n   * Override what \"Export PDF\" does. Defaults to `editor.printToPdf()`\n   * (the browser's print dialog). See `TitleBarProps.onExportPdf` for the\n   * full rationale — same override, so a host app can wire both the\n   * title-bar button and this menu item to the same server-rendered path.\n   */\n  onExportPdf?: (editor: DocxEditor) => void;\n}\n\nexport function MenuBar({ editor, onExportPdf }: MenuBarProps): React.ReactElement {\n  const [openMenu, setOpenMenu] = React.useState<string | null>(null);\n  const [viewMode, setViewModeState] = React.useState(editor.getViewMode());\n  const [watermarkDialogOpen, setWatermarkDialogOpen] = React.useState(false);\n  const [pageSetupOpen, setPageSetupOpen] = React.useState(false);\n  const ed = editor.editor;\n  const viewOnly = editor.getMode() === 'viewing';\n\n  React.useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') setOpenMenu(null);\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, []);\n\n  const applyViewMode = (mode: 'pageless' | 'paged') => {\n    editor.setViewMode(mode);\n    setViewModeState(mode);\n    setOpenMenu(null);\n  };\n\n  return (\n    <div className=\"docx-editor-menu-bar\" role=\"menubar\">\n      <MenuDropdown\n        label=\"File\"\n        open={openMenu === 'file'}\n        onToggle={() => setOpenMenu(openMenu === 'file' ? null : 'file')}\n        onClose={() => setOpenMenu(null)}\n      >\n        <MenuDropdownItem\n          label=\"New document\"\n          onClick={() => {\n            if (confirm('Start a new document? Current content will be lost.')) {\n              ed.commands.setContent('<p></p>');\n            }\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownItem\n          label=\"Open .docx…\"\n          onClick={() => {\n            const input = document.createElement('input');\n            input.type = 'file';\n            input.accept = '.docx';\n            input.onchange = async () => {\n              const file = input.files?.[0];\n              if (!file) return;\n              editor.setLoading(true, 'Loading .docx…');\n              try {\n                await editor.loadDocx(await file.arrayBuffer());\n              } catch (err) {\n                alert('Failed to open: ' + (err as Error).message);\n              } finally {\n                editor.setLoading(false);\n              }\n            };\n            input.click();\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownItem\n          label=\"Save .docx\"\n          shortcut=\"Ctrl+S\"\n          onClick={() => { editor.downloadDocx(); setOpenMenu(null); }}\n        />\n        <MenuDropdownItem\n          label=\"Export PDF…\"\n          onClick={() => {\n            if (onExportPdf) onExportPdf(editor);\n            else editor.printToPdf();\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownItem\n          label=\"Print…\"\n          shortcut=\"Ctrl+P\"\n          onClick={() => { window.print(); setOpenMenu(null); }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownItem\n          label=\"Clear document\"\n          onClick={() => {\n            if (confirm('Clear all content?')) ed.commands.setContent('<p></p>');\n            setOpenMenu(null);\n          }}\n        />\n      </MenuDropdown>\n\n      <MenuDropdown\n        label=\"Insert\"\n        disabled={viewOnly}\n        open={openMenu === 'insert'}\n        onToggle={() => setOpenMenu(openMenu === 'insert' ? null : 'insert')}\n        onClose={() => setOpenMenu(null)}\n      >\n        <MenuDropdownLabel>Image</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Image from URL…\"\n          onClick={() => {\n            const url = window.prompt('Image URL');\n            if (url) ed.chain().focus().setImage({ src: url }).run();\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownItem\n          label=\"Upload image from file…\"\n          onClick={() => {\n            const input = document.createElement('input');\n            input.type = 'file';\n            input.accept = 'image/*';\n            input.onchange = async () => {\n              const file = input.files?.[0];\n              if (!file) return;\n              const reader = new FileReader();\n              reader.onload = () => {\n                ed.chain().focus().setImage({ src: reader.result as string }).run();\n              };\n              reader.readAsDataURL(file);\n            };\n            input.click();\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Table</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Table (3×3)…\"\n          onClick={() => {\n            insertTableFitted(ed, { rows: 3, cols: 3, withHeaderRow: true });\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownItem\n          label=\"Custom table…\"\n          onClick={() => {\n            const spec = window.prompt('Rows × Columns (e.g. \"4x5\")', '3x3');\n            if (!spec) return;\n            const m = spec.match(/(\\d+)\\s*[x×]\\s*(\\d+)/);\n            if (!m) return;\n            insertTableFitted(ed, {\n              rows: Number(m[1]),\n              cols: Number(m[2]),\n              withHeaderRow: true,\n            });\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Link</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Insert link…\"\n          shortcut=\"Ctrl+K\"\n          onClick={() => {\n            const prev = ed.getAttributes('link').href;\n            const url = window.prompt('Link URL', prev ?? 'https://');\n            if (url === null) return;\n            if (url === '') {\n              ed.chain().focus().extendMarkRange('link').unsetLink().run();\n            } else {\n              ed.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n            }\n            setOpenMenu(null);\n          }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Blocks</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Page break\"\n          shortcut=\"Ctrl+Enter\"\n          onClick={() => { ed.chain().focus().insertPageBreak().run(); setOpenMenu(null); }}\n        />\n        <MenuDropdownItem\n          label=\"Horizontal rule\"\n          onClick={() => { ed.chain().focus().setHorizontalRule().run(); setOpenMenu(null); }}\n        />\n        <MenuDropdownItem\n          label=\"Blockquote\"\n          onClick={() => { ed.chain().focus().toggleBlockquote().run(); setOpenMenu(null); }}\n        />\n        <MenuDropdownItem\n          label=\"Code block\"\n          onClick={() => { ed.chain().focus().toggleCodeBlock().run(); setOpenMenu(null); }}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Lists</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Bullet list\"\n          onClick={() => { ed.chain().focus().toggleBulletList().run(); setOpenMenu(null); }}\n        />\n        <MenuDropdownItem\n          label=\"Numbered list\"\n          onClick={() => { ed.chain().focus().toggleOrderedList().run(); setOpenMenu(null); }}\n        />\n      </MenuDropdown>\n\n      <MenuDropdown\n        label=\"Format\"\n        disabled={viewOnly}\n        open={openMenu === 'format'}\n        onToggle={() => setOpenMenu(openMenu === 'format' ? null : 'format')}\n        onClose={() => setOpenMenu(null)}\n      >\n        <MenuDropdownLabel>Text style</MenuDropdownLabel>\n        <MenuDropdownItem label=\"Bold\" shortcut=\"Ctrl+B\" active={ed.isActive('bold')} onClick={() => { ed.chain().focus().toggleBold().run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Italic\" shortcut=\"Ctrl+I\" active={ed.isActive('italic')} onClick={() => { ed.chain().focus().toggleItalic().run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Underline\" shortcut=\"Ctrl+U\" active={ed.isActive('underline')} onClick={() => { ed.chain().focus().toggleUnderline().run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Strikethrough\" active={ed.isActive('strike')} onClick={() => { ed.chain().focus().toggleStrike().run(); setOpenMenu(null); }} />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Script</MenuDropdownLabel>\n        <MenuDropdownItem label=\"Subscript\" active={ed.isActive('subscript')} onClick={() => { ed.chain().focus().toggleSubscript().run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Superscript\" active={ed.isActive('superscript')} onClick={() => { ed.chain().focus().toggleSuperscript().run(); setOpenMenu(null); }} />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Text case</MenuDropdownLabel>\n        <MenuDropdownItem label=\"UPPERCASE\" active={ed.isActive('textTransform') && ed.getAttributes('textTransform').transform === 'uppercase'} onClick={() => { ed.chain().focus().setTextTransform('uppercase').run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"lowercase\" active={ed.isActive('textTransform') && ed.getAttributes('textTransform').transform === 'lowercase'} onClick={() => { ed.chain().focus().setTextTransform('lowercase').run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Capitalize Each Word\" active={ed.isActive('textTransform') && ed.getAttributes('textTransform').transform === 'capitalize'} onClick={() => { ed.chain().focus().setTextTransform('capitalize').run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Reset case\" onClick={() => { ed.chain().focus().setTextTransform('none').run(); setOpenMenu(null); }} />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Paragraph style</MenuDropdownLabel>\n        <MenuDropdownItem label=\"Normal\" active={currentParagraphStyle(ed) === 'paragraph'} onClick={() => { ed.chain().focus().setParagraph().run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Heading 1\" active={currentParagraphStyle(ed) === 'h1'} onClick={() => { ed.chain().focus().setHeading({ level: 1 }).run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Heading 2\" active={currentParagraphStyle(ed) === 'h2'} onClick={() => { ed.chain().focus().setHeading({ level: 2 }).run(); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Heading 3\" active={currentParagraphStyle(ed) === 'h3'} onClick={() => { ed.chain().focus().setHeading({ level: 3 }).run(); setOpenMenu(null); }} />\n        <MenuDropdownSeparator />\n        <MenuDropdownItem label=\"Clear formatting\" onClick={() => { ed.chain().focus().unsetAllMarks().clearNodes().run(); setOpenMenu(null); }} />\n      </MenuDropdown>\n\n      <MenuDropdown\n        label=\"View\"\n        open={openMenu === 'view'}\n        onToggle={() => setOpenMenu(openMenu === 'view' ? null : 'view')}\n        onClose={() => setOpenMenu(null)}\n      >\n        <MenuDropdownLabel>Layout</MenuDropdownLabel>\n        <MenuDropdownItem\n          label=\"Pageless\"\n          active={viewMode === 'pageless'}\n          onClick={() => applyViewMode('pageless')}\n        />\n        <MenuDropdownItem\n          label=\"Paged\"\n          active={viewMode === 'paged'}\n          onClick={() => applyViewMode('paged')}\n        />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Watermark</MenuDropdownLabel>\n        <MenuDropdownItem label=\"Add CONFIDENTIAL watermark\" onClick={() => { editor.setWatermark({ text: 'CONFIDENTIAL' }); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Add DRAFT watermark\" onClick={() => { editor.setWatermark({ text: 'DRAFT' }); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Add SAMPLE watermark\" onClick={() => { editor.setWatermark({ text: 'SAMPLE' }); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Custom watermark…\" onClick={() => { setWatermarkDialogOpen(true); setOpenMenu(null); }} />\n        <MenuDropdownItem label=\"Remove watermark\" disabled={!editor.getWatermark()} onClick={() => { editor.setWatermark(null); setOpenMenu(null); }} />\n        <MenuDropdownSeparator />\n        <MenuDropdownLabel>Header &amp; Footer</MenuDropdownLabel>\n        <MenuDropdownItem label=\"Add header…\" onClick={() => {\n          const html = window.prompt('Header HTML (e.g. <p>Company Name</p>)', '<p>Header</p>');\n          if (html !== null) editor.setHeaderHTML(html);\n          setOpenMenu(null);\n        }} />\n        <MenuDropdownItem label=\"Add footer…\" onClick={() => {\n          const html = window.prompt('Footer HTML (e.g. <p>Page 1</p>)', '<p style=\"text-align:center\">Page 1</p>');\n          if (html !== null) editor.setFooterHTML(html);\n          setOpenMenu(null);\n        }} />\n      </MenuDropdown>\n\n      <div className=\"docx-editor-menu-item\">\n        <button\n          type=\"button\"\n          className=\"docx-editor-menu-trigger\"\n          disabled={viewOnly}\n          onClick={() => setPageSetupOpen(true)}\n        >\n          Page Setup\n        </button>\n      </div>\n\n      <WatermarkDialog\n        open={watermarkDialogOpen}\n        onClose={() => setWatermarkDialogOpen(false)}\n        current={editor.getWatermark()}\n        onApply={(config) => editor.setWatermark(config)}\n      />\n\n      <PageSetupDialog\n        open={pageSetupOpen}\n        onClose={() => setPageSetupOpen(false)}\n        current={editor.getPageSetup()}\n        onApply={(setup) => {\n          editor.setPageSetup(setup);\n          savePageSetup(setup);\n        }}\n      />\n    </div>\n  );\n}\n","/**\n * Dropdown — a custom dropdown component with white background, hover states,\n * keyboard navigation, and a check mark on the selected option.\n *\n * Replaces the native <select> element which looks different on every OS\n * and can't be styled consistently.\n *\n * Exported so consumers can build custom toolbars with the same dropdown\n * styling as the built-in one.\n */\nimport * as React from 'react';\nimport { ChevronDownIcon, CheckIcon } from './icons';\nimport { FloatingPanel } from './FloatingPanel';\n\nexport interface DropdownOption {\n  /** The value to return when this option is selected. */\n  value: string;\n  /** The label to display in the trigger and the dropdown menu. */\n  label: string;\n  /** Optional inline style for the label (e.g. fontFamily preview). */\n  style?: React.CSSProperties;\n}\n\nexport interface DropdownProps {\n  /** Current selected value. */\n  value: string;\n  /** Options to display. */\n  options: DropdownOption[];\n  /** Called when the user picks an option. */\n  onChange: (value: string) => void;\n  /** Accessible label / tooltip. */\n  title?: string;\n  /** Width variant: 'narrow' (~50px) or 'medium' (~95px). Default: 'medium'. */\n  width?: 'narrow' | 'medium';\n  /** Placeholder shown when value is empty. */\n  placeholder?: string;\n  /** Disabled state. */\n  disabled?: boolean;\n}\n\nexport function Dropdown({\n  value,\n  options,\n  onChange,\n  title,\n  width = 'medium',\n  placeholder,\n  disabled,\n}: DropdownProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const [focusedIndex, setFocusedIndex] = React.useState(-1);\n  const ref = React.useRef<HTMLDivElement>(null);\n  const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n  const selectedOption = options.find((o) => o.value === value);\n  const displayLabel = selectedOption?.label ?? placeholder ?? '';\n\n  const closeDropdown = React.useCallback(() => {\n    setOpen(false);\n    setFocusedIndex(-1);\n  }, []);\n\n  // Reset focused index when opening\n  React.useEffect(() => {\n    if (open) {\n      const idx = options.findIndex((o) => o.value === value);\n      setFocusedIndex(idx >= 0 ? idx : 0);\n    }\n  }, [open, options, value]);\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    if (disabled) return;\n    if (e.key === 'Enter' || e.key === ' ') {\n      e.preventDefault();\n      if (!open) {\n        setOpen(true);\n      } else if (focusedIndex >= 0) {\n        onChange(options[focusedIndex].value);\n        setOpen(false);\n      }\n    } else if (e.key === 'Escape') {\n      closeDropdown();\n    } else if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      if (!open) {\n        setOpen(true);\n      } else {\n        setFocusedIndex((i) => Math.min(i + 1, options.length - 1));\n      }\n    } else if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      if (open) {\n        setFocusedIndex((i) => Math.max(i - 1, 0));\n      }\n    }\n  };\n\n  return (\n    <div\n      className={`docx-editor-dropdown docx-editor-dropdown--${width}`}\n      ref={ref}\n    >\n      <button\n        ref={triggerRef}\n        type=\"button\"\n        className=\"docx-editor-dropdown__trigger\"\n        title={title}\n        data-open={open ? 'true' : undefined}\n        disabled={disabled}\n        onClick={() => !disabled && setOpen((v) => !v)}\n        onKeyDown={handleKeyDown}\n        aria-haspopup=\"listbox\"\n        aria-expanded={open}\n      >\n        <span\n          className=\"docx-editor-dropdown__trigger-label\"\n          style={selectedOption?.style}\n        >\n          {displayLabel}\n        </span>\n        <ChevronDownIcon size={12} className=\"docx-editor-dropdown__trigger-caret\" />\n      </button>\n      <FloatingPanel\n        anchorRef={ref}\n        open={open}\n        onClose={closeDropdown}\n        className=\"docx-editor-dropdown__menu\"\n        style={{ minWidth: ref.current?.offsetWidth }}\n      >\n        <div role=\"listbox\">\n          {options.map((opt, i) => (\n            <button\n              key={opt.value}\n              type=\"button\"\n              className=\"docx-editor-dropdown__option\"\n              data-selected={opt.value === value ? 'true' : undefined}\n              data-focused={i === focusedIndex ? 'true' : undefined}\n              onClick={() => {\n                onChange(opt.value);\n                setOpen(false);\n                triggerRef.current?.focus();\n              }}\n              onMouseEnter={() => setFocusedIndex(i)}\n              role=\"option\"\n              aria-selected={opt.value === value}\n            >\n              <CheckIcon size={14} className=\"docx-editor-dropdown__option-check\" />\n              <span\n                className=\"docx-editor-dropdown__option-label\"\n                style={opt.style}\n              >\n                {opt.label}\n              </span>\n            </button>\n          ))}\n        </div>\n      </FloatingPanel>\n    </div>\n  );\n}\n","import * as React from 'react';\n\n/** A vertical separator group in the toolbar. */\nexport interface ToolbarGroupProps {\n  children: React.ReactNode;\n  /** Category name (e.g. \"Font\", \"Align\", \"Insert\") exposed as a hover\n   *  tooltip / accessible label on the group, so the tools are still\n   *  discoverable by category — without printing a visible caption under\n   *  every group, which doesn't match a compact, single-row toolbar. */\n  label?: string;\n}\n\nexport function ToolbarGroup({ children, label }: ToolbarGroupProps): React.ReactElement {\n  return (\n    <div className=\"docx-editor-toolbar-group\" title={label} aria-label={label}>\n      {children}\n    </div>\n  );\n}\n","import * as React from 'react';\n\n/** A small icon button in the toolbar. */\nexport interface ToolbarIconButtonProps {\n  title: string;\n  active?: boolean;\n  disabled?: boolean;\n  onClick: () => void;\n  children: React.ReactNode;\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nexport function ToolbarIconButton({\n  title,\n  active,\n  disabled,\n  onClick,\n  children,\n  style,\n  className,\n}: ToolbarIconButtonProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className={\n        'docx-editor-toolbar-button docx-editor-toolbar-button--icon' +\n        (className ? ' ' + className : '')\n      }\n      title={title}\n      data-active={active ? 'true' : undefined}\n      disabled={disabled}\n      onClick={onClick}\n      style={style}\n    >\n      {children}\n    </button>\n  );\n}\n","import * as React from 'react';\n\n/** A button with text + optional icon in the toolbar. */\nexport interface ToolbarTextButtonProps {\n  title?: string;\n  active?: boolean;\n  disabled?: boolean;\n  onClick: () => void;\n  children: React.ReactNode;\n  style?: React.CSSProperties;\n}\n\nexport function ToolbarTextButton({\n  title,\n  active,\n  disabled,\n  onClick,\n  children,\n  style,\n}: ToolbarTextButtonProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\"\n      title={title}\n      data-active={active ? 'true' : undefined}\n      disabled={disabled}\n      onClick={onClick}\n      style={style}\n    >\n      {children}\n    </button>\n  );\n}\n","import * as React from 'react';\nimport { FloatingPanel } from '../FloatingPanel';\nimport { ChevronDownIcon, CheckIcon } from '../icons';\n\n/**\n * A toolbar dropdown that collapses a set of mutually-exclusive icon\n * choices (e.g. text alignment, list type) into a single trigger showing\n * only the currently-active option, matching Google Docs' compact toolbar.\n */\nexport interface ToolbarIconMenuOption {\n  value: string;\n  label: string;\n  icon: React.ReactNode;\n  active: boolean;\n  onSelect: () => void;\n}\n\nexport interface ToolbarIconMenuProps {\n  title: string;\n  options: ToolbarIconMenuOption[];\n}\n\nexport function ToolbarIconMenu({ title, options }: ToolbarIconMenuProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const triggerRef = React.useRef<HTMLButtonElement>(null);\n  const current = options.find((o) => o.active) ?? options[0];\n\n  return (\n    <div className=\"docx-editor-icon-menu\">\n      <button\n        ref={triggerRef}\n        type=\"button\"\n        className=\"docx-editor-toolbar-button docx-editor-icon-menu__trigger\"\n        title={title}\n        onClick={() => setOpen((o) => !o)}\n        aria-haspopup=\"menu\"\n        aria-expanded={open}\n      >\n        {current.icon}\n        <ChevronDownIcon size={10} className=\"docx-editor-icon-menu__caret\" />\n      </button>\n      <FloatingPanel\n        anchorRef={triggerRef}\n        open={open}\n        onClose={() => setOpen(false)}\n        className=\"docx-editor-icon-menu__menu\"\n        role=\"menu\"\n        aria-label={title}\n      >\n        {options.map((opt) => (\n          <button\n            key={opt.value}\n            type=\"button\"\n            className=\"docx-editor-icon-menu__option\"\n            data-active={opt.active ? 'true' : undefined}\n            onClick={() => {\n              opt.onSelect();\n              setOpen(false);\n            }}\n            role=\"menuitemradio\"\n            aria-checked={opt.active}\n          >\n            {opt.icon}\n            <span className=\"docx-editor-icon-menu__option-label\">{opt.label}</span>\n            {opt.active && <CheckIcon size={14} className=\"docx-editor-icon-menu__check\" />}\n          </button>\n        ))}\n      </FloatingPanel>\n    </div>\n  );\n}\n","/** Shared color palette for `ColorButton` (text color / highlight pickers). */\nexport const PALETTE = [\n  '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n  '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n  '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n  '#cc4125', '#dd7e6b', '#e6b800', '#ffd966', '#93c47d', '#76a5af', '#6d9eeb', '#6fa8dc', '#8e7cc3', '#c27ba0',\n  '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3c78d8', '#3d85c6', '#674ea7', '#a64d79',\n];\n","import * as React from 'react';\nimport { FloatingPanel } from '../FloatingPanel';\nimport { PALETTE } from './palette';\n\n/** Color picker button with a swatch underline. */\nexport interface ColorButtonProps {\n  title: string;\n  currentColor: string;\n  onPick: (color: string) => void;\n  onClear: () => void;\n  mode?: 'text' | 'highlight';\n}\n\nexport function ColorButton({\n  title,\n  currentColor,\n  onPick,\n  onClear,\n  mode = 'text',\n}: ColorButtonProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const ref = React.useRef<HTMLButtonElement>(null);\n  const icon = mode === 'text' ? (\n    <span style={{ fontWeight: 700 }}>A</span>\n  ) : (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ width: 14, height: 14 }}>\n      <path d=\"M3 21h18l-3-9H6l-3 9z\" fill={currentColor} />\n      <rect x=\"6\" y=\"3\" width=\"12\" height=\"9\" rx=\"1\" />\n    </svg>\n  );\n\n  return (\n    <div style={{ position: 'relative', display: 'inline-flex' }}>\n      <button\n        ref={ref}\n        type=\"button\"\n        className=\"docx-editor-toolbar-button docx-editor-toolbar-button--icon docx-editor-color-button\"\n        title={title}\n        onClick={() => setOpen((v) => !v)}\n      >\n        {icon}\n        <span className=\"docx-editor-color-button__swatch\" style={{ background: currentColor }} />\n      </button>\n      <FloatingPanel\n        anchorRef={ref}\n        open={open}\n        onClose={() => setOpen(false)}\n        style={{\n          background: '#fff',\n          border: '1px solid #d0d7de',\n          borderRadius: 8,\n          padding: 8,\n          boxShadow: '0 4px 12px rgba(0,0,0,0.12)',\n          width: 220,\n        }}\n      >\n        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(10, 1fr)', gap: 2 }}>\n          {PALETTE.map((c) => (\n            <button\n              key={c}\n              type=\"button\"\n              title={c}\n              onClick={() => {\n                onPick(c);\n                setOpen(false);\n              }}\n              style={{\n                width: 20,\n                height: 20,\n                border: '1px solid #d0d7de',\n                borderRadius: 2,\n                background: c,\n                cursor: 'pointer',\n                padding: 0,\n              }}\n            />\n          ))}\n        </div>\n        <div style={{ marginTop: 8, display: 'flex', gap: 4 }}>\n          <input\n            type=\"color\"\n            value={currentColor}\n            onChange={(e) => onPick(e.target.value)}\n            style={{ width: 32, height: 28, border: '1px solid #d0d7de', borderRadius: 4, padding: 0, cursor: 'pointer' }}\n          />\n          <button\n            type=\"button\"\n            onClick={() => {\n              onClear();\n              setOpen(false);\n            }}\n            style={{\n              flex: 1,\n              height: 28,\n              border: '1px solid #d0d7de',\n              background: '#fff',\n              borderRadius: 4,\n              fontSize: 12,\n              cursor: 'pointer',\n            }}\n          >\n            Clear\n          </button>\n        </div>\n      </FloatingPanel>\n    </div>\n  );\n}\n","/**\n * TableSizePicker — a Google-Docs-style \"Insert table\" control.\n *\n * Combines two ways to choose a size:\n *   1. A grid (default 10×8) that highlights rows/cols as you move over it\n *      and shows a live \"C × R\" label, then inserts on release. Works with\n *      both a mouse (hover + click) and touch (drag a finger across the\n *      grid, lift to insert) — touch has no `mouseenter`, so we track the\n *      finger with `elementFromPoint` on `touchmove` instead.\n *   2. A \"Custom size\" row with two number inputs for dimensions bigger\n *      than the grid (e.g. 12×20), with its own Insert button.\n */\nimport * as React from 'react';\nimport { TableIcon } from './icons';\nimport { FloatingPanel } from './FloatingPanel';\n\nexport interface TableSizePickerProps {\n  /** Called with the chosen size when the user picks one. */\n  onInsert: (rows: number, cols: number) => void;\n  /** Max columns/rows shown in the hover grid. Default 10×8. */\n  maxCols?: number;\n  maxRows?: number;\n  /** Tooltip for the trigger button. */\n  title?: string;\n}\n\nexport function TableSizePicker({\n  onInsert,\n  maxCols = 10,\n  maxRows = 8,\n  title = 'Insert table',\n}: TableSizePickerProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const [hover, setHover] = React.useState<{ row: number; col: number } | null>(null);\n  const [customRows, setCustomRows] = React.useState('3');\n  const [customCols, setCustomCols] = React.useState('3');\n  const ref = React.useRef<HTMLButtonElement>(null);\n\n  const close = React.useCallback(() => {\n    setOpen(false);\n    setHover(null);\n  }, []);\n\n  const insert = (rows: number, cols: number) => {\n    if (rows > 0 && cols > 0) onInsert(rows, cols);\n    close();\n  };\n\n  // Touch has no hover: track the finger by hit-testing the element under\n  // it on each move, reading the cell's row/col from its data attributes.\n  const cellFromPoint = (x: number, y: number): { row: number; col: number } | null => {\n    const el = document.elementFromPoint(x, y);\n    const cell = el?.closest<HTMLElement>('.docx-editor-table-picker__cell');\n    if (!cell || cell.dataset.row === undefined || cell.dataset.col === undefined) return null;\n    return { row: Number(cell.dataset.row), col: Number(cell.dataset.col) };\n  };\n\n  const handleTouchMove = (e: React.TouchEvent) => {\n    const t = e.touches[0];\n    if (!t) return;\n    const hit = cellFromPoint(t.clientX, t.clientY);\n    if (hit) {\n      e.preventDefault(); // keep the panel from scrolling while dragging the grid\n      setHover(hit);\n    }\n  };\n\n  const handleTouchEnd = (e: React.TouchEvent) => {\n    const t = e.changedTouches[0];\n    const hit = t ? cellFromPoint(t.clientX, t.clientY) : hover;\n    if (hit) insert(hit.row + 1, hit.col + 1);\n  };\n\n  const cells: React.ReactElement[] = [];\n  for (let r = 0; r < maxRows; r++) {\n    for (let c = 0; c < maxCols; c++) {\n      const active = !!hover && r <= hover.row && c <= hover.col;\n      cells.push(\n        <div\n          key={`${r}-${c}`}\n          className=\"docx-editor-table-picker__cell\"\n          data-row={r}\n          data-col={c}\n          data-active={active ? 'true' : undefined}\n          onMouseEnter={() => setHover({ row: r, col: c })}\n          onClick={() => insert(r + 1, c + 1)}\n        />,\n      );\n    }\n  }\n\n  return (\n    <div style={{ position: 'relative', display: 'inline-flex' }}>\n      <button\n        ref={ref}\n        type=\"button\"\n        className=\"docx-editor-toolbar-button docx-editor-toolbar-button--icon\"\n        title={title}\n        onClick={() => setOpen((v) => !v)}\n      >\n        <TableIcon />\n      </button>\n      <FloatingPanel\n        anchorRef={ref}\n        open={open}\n        onClose={close}\n        className=\"docx-editor-table-picker\"\n        role=\"dialog\"\n        aria-label=\"Insert table\"\n      >\n        <div\n          className=\"docx-editor-table-picker__grid\"\n          style={{ gridTemplateColumns: `repeat(${maxCols}, 1fr)`, touchAction: 'none' }}\n          onMouseLeave={() => setHover(null)}\n          onTouchStart={handleTouchMove}\n          onTouchMove={handleTouchMove}\n          onTouchEnd={handleTouchEnd}\n        >\n          {cells}\n        </div>\n        <div className=\"docx-editor-table-picker__label\">\n          {hover ? `${hover.col + 1} × ${hover.row + 1} table` : 'Drag to pick a size'}\n        </div>\n        <div className=\"docx-editor-table-picker__custom\">\n          <span>Custom size:</span>\n          <input\n            type=\"number\"\n            min={1}\n            max={50}\n            value={customCols}\n            onChange={(e) => setCustomCols(e.target.value)}\n            aria-label=\"Columns\"\n          />\n          <span aria-hidden=\"true\">×</span>\n          <input\n            type=\"number\"\n            min={1}\n            max={50}\n            value={customRows}\n            onChange={(e) => setCustomRows(e.target.value)}\n            aria-label=\"Rows\"\n          />\n          <button\n            type=\"button\"\n            onClick={() => insert(parseInt(customRows, 10) || 0, parseInt(customCols, 10) || 0)}\n          >\n            Insert\n          </button>\n        </div>\n      </FloatingPanel>\n    </div>\n  );\n}\n","/**\n * TemplatePicker — a Google-Docs-style \"Insert > Template\" control.\n *\n * Deliberately generic: it knows nothing about \"legal\" or Sri Lanka. It just\n * renders a searchable, category-grouped list of `{ id, title, category,\n * description }` items and calls `onSelect(id)` when the user picks one.\n * Wire it up to any template source (e.g. `@shashimadushan/docx-editor-legal-templates`)\n * from the host app — see `Toolbar`'s `templates` / `onInsertTemplate` props.\n *\n * This lets users manually browse and insert a template into the document\n * at any time, independent of the AI agent (which can also insert templates\n * via the `insert_legal_template` tool in `@shashimadushan/docx-editor-agent/legal`) —\n * both paths end up calling the same insertion logic.\n */\nimport * as React from 'react';\nimport { TemplateIcon, ChevronDownIcon } from './icons';\nimport { FloatingPanel } from './FloatingPanel';\n\nexport interface TemplatePickerItem {\n  id: string;\n  title: string;\n  /** Group label shown as a section header (e.g. \"Notarial\", \"Agreements\"). */\n  category: string;\n  description?: string;\n}\n\nexport interface TemplatePickerProps {\n  templates: TemplatePickerItem[];\n  onSelect: (id: string) => void;\n  /** Tooltip/aria-label for the trigger button and the popover's `aria-label`. */\n  title?: string;\n  /**\n   * Visible text on the trigger button, e.g. \"Templates\" or \"Clauses\". Was\n   * previously hardcoded to \"Templates\" regardless of `title` — meaning\n   * every consumer of this component (Templates *and* Clauses dropdowns)\n   * showed the same label. Defaults to `title` so existing callers that\n   * only set `title` still get a sensible label.\n   */\n  buttonLabel?: string;\n  /** Icon shown on the trigger button. Defaults to `TemplateIcon`. */\n  icon?: React.ReactNode;\n  /** Placeholder for the search box. */\n  searchPlaceholder?: string;\n}\n\nexport function TemplatePicker({\n  templates,\n  onSelect,\n  title = 'Insert template',\n  buttonLabel = 'Templates',\n  icon,\n  searchPlaceholder = 'Search templates…',\n}: TemplatePickerProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const [query, setQuery] = React.useState('');\n  const ref = React.useRef<HTMLButtonElement>(null);\n  const searchRef = React.useRef<HTMLInputElement>(null);\n  const panelWidth = 320;\n\n  const close = React.useCallback(() => {\n    setOpen(false);\n    setQuery('');\n  }, []);\n\n  React.useEffect(() => {\n    if (open) searchRef.current?.focus();\n  }, [open]);\n\n  const q = query.trim().toLowerCase();\n  const filtered = q\n    ? templates.filter(\n        (t) =>\n          t.title.toLowerCase().includes(q) ||\n          t.category.toLowerCase().includes(q) ||\n          (t.description ?? '').toLowerCase().includes(q),\n      )\n    : templates;\n\n  const groups = new Map<string, TemplatePickerItem[]>();\n  for (const t of filtered) {\n    const list = groups.get(t.category) ?? [];\n    list.push(t);\n    groups.set(t.category, list);\n  }\n\n  const pick = (id: string) => {\n    onSelect(id);\n    close();\n  };\n\n  return (\n    <div style={{ position: 'relative', display: 'inline-flex' }}>\n      <button\n        ref={ref}\n        type=\"button\"\n        className=\"docx-editor-toolbar-button docx-editor-toolbar-button--with-text\"\n        title={title}\n        data-open={open ? 'true' : undefined}\n        onClick={() => setOpen((v) => !v)}\n      >\n        {icon ?? <TemplateIcon />}\n        <span>{buttonLabel}</span>\n        <ChevronDownIcon size={12} />\n      </button>\n      <FloatingPanel\n        anchorRef={ref}\n        open={open}\n        onClose={close}\n        role=\"dialog\"\n        aria-label=\"Insert template\"\n        style={{\n          background: '#fff',\n          border: '1px solid #d0d7de',\n          borderRadius: 8,\n          boxShadow: '0 4px 12px rgba(0,0,0,0.12)',\n          width: panelWidth,\n          maxWidth: 'calc(100vw - 24px)',\n          maxHeight: 420,\n          overflow: 'hidden',\n          display: 'flex',\n          flexDirection: 'column',\n        }}\n      >\n          <div style={{ flexShrink: 0, padding: 8, borderBottom: '1px solid #eaeef2' }}>\n            <input\n              ref={searchRef}\n              type=\"text\"\n              value={query}\n              onChange={(e) => setQuery(e.target.value)}\n              placeholder={searchPlaceholder}\n              style={{\n                width: '100%',\n                boxSizing: 'border-box',\n                padding: '6px 8px',\n                border: '1px solid #d0d7de',\n                borderRadius: 6,\n                fontSize: 13,\n              }}\n            />\n          </div>\n          {/* `flex: 1` + `minHeight: 0` is what actually makes this respect\n              the panel's `maxHeight` and scroll internally — without both,\n              a flex column's child sizes to its content and pushes the\n              panel taller than `maxHeight` instead of scrolling, which is\n              what let the list balloon past the visible toolbar area. */}\n          <div style={{ flex: 1, minHeight: 0, overflowY: 'auto', padding: 4 }}>\n            {filtered.length === 0 && (\n              <div style={{ padding: '16px 8px', fontSize: 13, color: '#59636e', textAlign: 'center' }}>\n                No templates match &ldquo;{query}&rdquo;.\n              </div>\n            )}\n            {Array.from(groups.entries()).map(([category, items]) => (\n              <div key={category}>\n                <div\n                  style={{\n                    fontSize: 11,\n                    fontWeight: 700,\n                    textTransform: 'uppercase',\n                    letterSpacing: '0.04em',\n                    color: '#59636e',\n                    padding: '8px 8px 4px',\n                  }}\n                >\n                  {category}\n                </div>\n                {items.map((t) => (\n                  <button\n                    key={t.id}\n                    type=\"button\"\n                    onClick={() => pick(t.id)}\n                    style={{\n                      display: 'block',\n                      width: '100%',\n                      textAlign: 'left',\n                      padding: '6px 8px',\n                      border: 'none',\n                      background: 'transparent',\n                      borderRadius: 6,\n                      cursor: 'pointer',\n                      fontSize: 13,\n                    }}\n                    onMouseEnter={(e) => (e.currentTarget.style.background = '#f6f8fa')}\n                    onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n                  >\n                    <div style={{ fontWeight: 600, color: '#1f2328' }}>{t.title}</div>\n                    {t.description && (\n                      <div style={{ color: '#59636e', fontSize: 12, marginTop: 1 }}>{t.description}</div>\n                    )}\n                  </button>\n                ))}\n              </div>\n            ))}\n          </div>\n      </FloatingPanel>\n    </div>\n  );\n}\n","/**\n * Toolbar — the formatting toolbar with grouped buttons.\n *\n * Exported so consumers can:\n *   1. Use the default <Toolbar /> directly in custom layouts\n *   2. Append custom items via the `extraItems` prop\n *   3. Replace specific groups via render-props\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport {\n  COMMON_FONT_FAMILIES,\n  COMMON_FONT_SIZES,\n} from '../extensions/builtins/tiptap-defaults';\nimport { Dropdown } from './Dropdown';\nimport {\n  ToolbarGroup,\n  ToolbarIconButton,\n  ToolbarIconMenu,\n  ColorButton,\n  PALETTE,\n} from './ToolbarPrimitives';\nimport { TableSizePicker } from './TableSizePicker';\nimport { TemplatePicker, type TemplatePickerItem } from './TemplatePicker';\nimport { insertTableFitted } from '../extensions/builtins/table-enhancements';\nimport {\n  UndoIcon, RedoIcon, LinkIcon, ImageIcon, UploadIcon,\n  PageBreakIcon, HorizontalRuleIcon, QuoteIcon, CodeIcon,\n  AlignLeftIcon, AlignCenterIcon, AlignRightIcon, AlignJustifyIcon,\n  BulletListIcon, OrderedListIcon, OutdentIcon, IndentIcon,\n  ClauseIcon, CheckIcon, CloseIcon,\n} from './icons';\nimport {\n  currentParagraphStyle,\n  applyParagraphStyle,\n  currentFontSize,\n  currentLineHeight,\n  currentTextTransform,\n} from './helpers';\n\nexport interface ToolbarProps {\n  editor: DocxEditor;\n  /** Extra items to append to the end of the toolbar (after Clear formatting). */\n  extraItems?: React.ReactNode;\n  /** Extra groups to prepend to the beginning of the toolbar (before dropdowns). */\n  extraGroups?: React.ReactNode;\n  /**\n   * Templates the user can manually browse and insert, shown as a\n   * \"Templates\" dropdown right after the History (Undo/Redo) group. Pass template\n   * summaries from any source (e.g. `builtinLegalTemplates` from\n   * `@shashimadushan/docx-editor-legal-templates`) plus `onInsertTemplate` to handle the\n   * selection. Omit both to hide the group entirely (default).\n   */\n  templates?: TemplatePickerItem[];\n  /** Called with the chosen template's `id` when the user picks one from the Templates dropdown. */\n  onInsertTemplate?: (templateId: string) => void;\n  /**\n   * Reusable boilerplate clauses the user can manually browse and insert,\n   * shown as a \"Clauses\" dropdown right after Templates. Pass clause\n   * summaries from any source (e.g. `builtinLegalClauses` from\n   * `@shashimadushan/docx-editor-legal-templates`, mapped to\n   * `{ id, title, category: applicableTo[0], description }`) plus\n   * `onInsertClause` to handle the selection. Same insertion mechanism the\n   * AI agent's `insert_legal_clause` tool uses — this is the manual,\n   * agent-free path to the same clause library. Omit both to hide the\n   * group entirely (default).\n   */\n  clauses?: TemplatePickerItem[];\n  /** Called with the chosen clause's `id` when the user picks one from the Clauses dropdown. */\n  onInsertClause?: (clauseId: string) => void;\n}\n\nexport function Toolbar({ editor, extraItems, extraGroups, templates, onInsertTemplate, clauses, onInsertClause }: ToolbarProps): React.ReactElement {\n  const ed = editor.editor;\n  const inTable = ed.isActive('table');\n  const mode = editor.getMode();\n  const viewOnly = mode === 'viewing';\n  const suggesting = mode === 'suggesting';\n  const hasSuggestions = suggesting && editor.hasPendingSuggestions();\n\n  return (\n    <div className=\"docx-editor-toolbar-row\">\n      <div className=\"docx-editor-toolbar\" role=\"toolbar\" aria-label=\"Formatting\">\n      <div className=\"docx-editor-toolbar__tools\" data-view-only={viewOnly ? 'true' : undefined} aria-disabled={viewOnly}>\n      {extraGroups}\n\n      {/* History — kept first/left-most, the way most word processors and\n          IDEs place undo/redo, so it's always in the same predictable spot\n          regardless of how many other groups are visible. */}\n      <ToolbarGroup label=\"History\">\n        <ToolbarIconButton title=\"Undo (Ctrl+Z)\" disabled={!ed.can().undo?.()} onClick={() => ed.chain().focus().undo().run()}>\n          <UndoIcon />\n        </ToolbarIconButton>\n        <ToolbarIconButton title=\"Redo (Ctrl+Y)\" disabled={!ed.can().redo?.()} onClick={() => ed.chain().focus().redo().run()}>\n          <RedoIcon />\n        </ToolbarIconButton>\n      </ToolbarGroup>\n\n      {/* Templates — manual template insertion, right after History (conditional on templates being provided) */}\n      {templates && templates.length > 0 && onInsertTemplate && (\n        <ToolbarGroup label=\"Templates\">\n          <TemplatePicker templates={templates} onSelect={onInsertTemplate} title=\"Insert template\" buttonLabel=\"Templates\" />\n        </ToolbarGroup>\n      )}\n\n      {/* Clauses — manual boilerplate-clause insertion, right after Templates (conditional on clauses being provided) */}\n      {clauses && clauses.length > 0 && onInsertClause && (\n        <ToolbarGroup label=\"Clauses\">\n          <TemplatePicker\n            templates={clauses}\n            onSelect={onInsertClause}\n            title=\"Insert clause\"\n            buttonLabel=\"Clauses\"\n            icon={<ClauseIcon />}\n            searchPlaceholder=\"Search clauses…\"\n          />\n        </ToolbarGroup>\n      )}\n\n      {/* Style picker */}\n      <ToolbarGroup label=\"Style\">\n        <Dropdown\n          title=\"Paragraph style\"\n          width=\"medium\"\n          value={currentParagraphStyle(ed)}\n          options={[\n            { value: 'paragraph', label: 'Normal' },\n            { value: 'h1', label: 'Heading 1' },\n            { value: 'h2', label: 'Heading 2' },\n            { value: 'h3', label: 'Heading 3' },\n            { value: 'h4', label: 'Heading 4' },\n            { value: 'h5', label: 'Heading 5' },\n            { value: 'h6', label: 'Heading 6' },\n            { value: 'blockquote', label: 'Quote' },\n            { value: 'codeBlock', label: 'Code Block' },\n          ]}\n          onChange={(v) => applyParagraphStyle(ed, v)}\n        />\n      </ToolbarGroup>\n\n      {/* Font family + size */}\n      <ToolbarGroup label=\"Font\">\n        <Dropdown\n          title=\"Font family\"\n          width=\"medium\"\n          value={(ed.getAttributes('textStyle').fontFamily as string) ?? ''}\n          options={COMMON_FONT_FAMILIES.map((f) => ({\n            value: f.value,\n            label: f.label,\n            style: f.value ? { fontFamily: f.value } : undefined,\n          }))}\n          onChange={(v) => {\n            if (v) ed.chain().focus().setFontFamily(v).run();\n            else ed.chain().focus().unsetFontFamily().run();\n          }}\n        />\n        <Dropdown\n          title=\"Font size\"\n          width=\"narrow\"\n          value={currentFontSize(ed)}\n          options={COMMON_FONT_SIZES.map((pt) => ({\n            value: String(pt * 1.333),\n            label: String(pt),\n          }))}\n          onChange={(v) => {\n            const px = Number(v);\n            if (px) ed.chain().focus().setMark('textStyle', { fontSize: `${px}px` }).run();\n          }}\n        />\n      </ToolbarGroup>\n\n      {/* Line height + text transform */}\n      <ToolbarGroup label=\"Spacing\">\n        <Dropdown\n          title=\"Line spacing\"\n          width=\"narrow\"\n          value={currentLineHeight(ed)}\n          options={[\n            { value: '1', label: '1.0×' },\n            { value: '1.15', label: '1.15×' },\n            { value: '1.5', label: '1.5×' },\n            { value: '2', label: '2.0×' },\n          ]}\n          onChange={(v) => { if (v) ed.chain().focus().setLineHeight(v).run(); }}\n        />\n        <Dropdown\n          title=\"Text case\"\n          width=\"narrow\"\n          value={currentTextTransform(ed)}\n          options={[\n            { value: 'none', label: 'Aa' },\n            { value: 'uppercase', label: 'AB' },\n            { value: 'lowercase', label: 'ab' },\n            { value: 'capitalize', label: 'Ab' },\n          ]}\n          onChange={(v) => ed.chain().focus().setTextTransform(v as any).run()}\n        />\n      </ToolbarGroup>\n\n      {/* Text formatting */}\n      <ToolbarGroup label=\"Format\">\n        <ToolbarIconButton title=\"Bold (Ctrl+B)\" active={ed.isActive('bold')} onClick={() => ed.chain().focus().toggleBold().run()} style={{ fontWeight: 800 }}>B</ToolbarIconButton>\n        <ToolbarIconButton title=\"Italic (Ctrl+I)\" active={ed.isActive('italic')} onClick={() => ed.chain().focus().toggleItalic().run()} style={{ fontStyle: 'italic' }}>I</ToolbarIconButton>\n        <ToolbarIconButton title=\"Underline (Ctrl+U)\" active={ed.isActive('underline')} onClick={() => ed.chain().focus().toggleUnderline().run()} style={{ textDecoration: 'underline' }}>U</ToolbarIconButton>\n        <ToolbarIconButton title=\"Strikethrough\" active={ed.isActive('strike')} onClick={() => ed.chain().focus().toggleStrike().run()} style={{ textDecoration: 'line-through' }}>S</ToolbarIconButton>\n        <ToolbarIconButton title=\"Subscript\" active={ed.isActive('subscript')} onClick={() => ed.chain().focus().toggleSubscript().run()} style={{ fontSize: '0.7em' }}>x₂</ToolbarIconButton>\n        <ToolbarIconButton title=\"Superscript\" active={ed.isActive('superscript')} onClick={() => ed.chain().focus().toggleSuperscript().run()} style={{ fontSize: '0.7em' }}>x²</ToolbarIconButton>\n        <ColorButton title=\"Text color\" currentColor={(ed.getAttributes('textStyle').color as string) ?? '#1f2328'} onPick={(c) => ed.chain().focus().setColor(c).run()} onClear={() => ed.chain().focus().unsetColor().run()} />\n        <ColorButton title=\"Highlight color\" mode=\"highlight\" currentColor={(ed.getAttributes('highlight').color as string) ?? '#fff3a0'} onPick={(c) => ed.chain().focus().toggleHighlight({ color: c }).run()} onClear={() => ed.chain().focus().unsetHighlight().run()} />\n      </ToolbarGroup>\n\n      {/* Alignment — collapsed into a dropdown that shows only the active\n          alignment, matching Google Docs' compact single-button control. */}\n      <ToolbarGroup label=\"Align\">\n        <ToolbarIconMenu\n          title=\"Alignment\"\n          options={[\n            { value: 'left', label: 'Align left', icon: <AlignLeftIcon />, active: ed.isActive({ textAlign: 'left' }), onSelect: () => ed.chain().focus().setTextAlign('left').run() },\n            { value: 'center', label: 'Align center', icon: <AlignCenterIcon />, active: ed.isActive({ textAlign: 'center' }), onSelect: () => ed.chain().focus().setTextAlign('center').run() },\n            { value: 'right', label: 'Align right', icon: <AlignRightIcon />, active: ed.isActive({ textAlign: 'right' }), onSelect: () => ed.chain().focus().setTextAlign('right').run() },\n            { value: 'justify', label: 'Justify', icon: <AlignJustifyIcon />, active: ed.isActive({ textAlign: 'justify' }), onSelect: () => ed.chain().focus().setTextAlign('justify').run() },\n          ]}\n        />\n      </ToolbarGroup>\n\n      {/* Lists — bullet/numbered collapsed the same way as Align; indent\n          controls stay as separate action buttons since they aren't a\n          mutually-exclusive choice. */}\n      <ToolbarGroup label=\"List\">\n        <ToolbarIconMenu\n          title=\"List type\"\n          options={[\n            { value: 'bullet', label: 'Bulleted list', icon: <BulletListIcon />, active: ed.isActive('bulletList'), onSelect: () => ed.chain().focus().toggleBulletList().run() },\n            { value: 'ordered', label: 'Numbered list', icon: <OrderedListIcon />, active: ed.isActive('orderedList'), onSelect: () => ed.chain().focus().toggleOrderedList().run() },\n          ]}\n        />\n        <ToolbarIconButton title=\"Decrease indent\" onClick={() => ed.chain().focus().liftListItem('listItem').run()}><OutdentIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Increase indent\" onClick={() => ed.chain().focus().sinkListItem('listItem').run()}><IndentIcon /></ToolbarIconButton>\n      </ToolbarGroup>\n\n      {/* Insert */}\n      <ToolbarGroup label=\"Insert\">\n        <ToolbarIconButton title=\"Insert link (Ctrl+K)\" active={ed.isActive('link')} onClick={() => {\n          const prev = ed.getAttributes('link').href;\n          const url = window.prompt('Link URL', prev ?? 'https://');\n          if (url === null) return;\n          if (url === '') ed.chain().focus().extendMarkRange('link').unsetLink().run();\n          else ed.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n        }}><LinkIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Insert image from URL\" onClick={() => {\n          const url = window.prompt('Image URL');\n          if (url) ed.chain().focus().setImage({ src: url }).run();\n        }}><ImageIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Upload image from file\" onClick={() => {\n          const input = document.createElement('input');\n          input.type = 'file';\n          input.accept = 'image/*';\n          input.onchange = async () => {\n            const file = input.files?.[0];\n            if (!file) return;\n            const reader = new FileReader();\n            reader.onload = () => ed.chain().focus().setImage({ src: reader.result as string }).run();\n            reader.readAsDataURL(file);\n          };\n          input.click();\n        }}><UploadIcon /></ToolbarIconButton>\n        <TableSizePicker\n          title=\"Insert table\"\n          onInsert={(rows, cols) => insertTableFitted(ed, { rows, cols, withHeaderRow: true })}\n        />\n        <ToolbarIconButton title=\"Page break (Ctrl+Enter)\" onClick={() => ed.chain().focus().insertPageBreak().run()}><PageBreakIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Horizontal rule\" onClick={() => ed.chain().focus().setHorizontalRule().run()}><HorizontalRuleIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Blockquote\" active={ed.isActive('blockquote')} onClick={() => ed.chain().focus().toggleBlockquote().run()}><QuoteIcon /></ToolbarIconButton>\n        <ToolbarIconButton title=\"Code block\" active={ed.isActive('codeBlock')} onClick={() => ed.chain().focus().toggleCodeBlock().run()}><CodeIcon /></ToolbarIconButton>\n      </ToolbarGroup>\n\n      {/* Image tools (conditional) */}\n      {ed.isActive('image') && (\n        <ToolbarGroup label=\"Image\">\n          <ToolbarIconButton title=\"Align image left\" active={ed.getAttributes('image').alignment === 'left'} onClick={() => ed.chain().focus().setImageAlignment('left').run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Align image center\" active={ed.getAttributes('image').alignment === 'center'} onClick={() => ed.chain().focus().setImageAlignment('center').run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Align image right\" active={ed.getAttributes('image').alignment === 'right'} onClick={() => ed.chain().focus().setImageAlignment('right').run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"13\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Float image left\" active={ed.getAttributes('image').wrap === 'left'} onClick={() => {\n            const cur = ed.getAttributes('image').wrap;\n            ed.chain().focus().setImageWrap(cur === 'left' ? 'none' : 'left').run();\n          }}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"4\" width=\"8\" height=\"8\" /><line x1=\"13\" y1=\"5\" x2=\"21\" y2=\"5\" /><line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"17\" x2=\"21\" y2=\"17\" /><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"20\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Float image right\" active={ed.getAttributes('image').wrap === 'right'} onClick={() => {\n            const cur = ed.getAttributes('image').wrap;\n            ed.chain().focus().setImageWrap(cur === 'right' ? 'none' : 'right').run();\n          }}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"13\" y=\"4\" width=\"8\" height=\"8\" /><line x1=\"3\" y1=\"5\" x2=\"11\" y2=\"5\" /><line x1=\"3\" y1=\"8\" x2=\"11\" y2=\"8\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"17\" x2=\"21\" y2=\"17\" /><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"20\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Image size: small\" onClick={() => ed.chain().focus().setImageSize('25%').run()}><span style={{ fontSize: 10 }}>S</span></ToolbarIconButton>\n          <ToolbarIconButton title=\"Image size: medium\" onClick={() => ed.chain().focus().setImageSize('50%').run()}><span style={{ fontSize: 12 }}>M</span></ToolbarIconButton>\n          <ToolbarIconButton title=\"Image size: large\" onClick={() => ed.chain().focus().setImageSize('100%').run()}><span style={{ fontSize: 14 }}>L</span></ToolbarIconButton>\n        </ToolbarGroup>\n      )}\n\n      {/* Table tools (conditional) */}\n      {inTable && (\n        <ToolbarGroup label=\"Table\">\n          <ToolbarIconButton title=\"Add row above\" onClick={() => ed.chain().focus().addRowBefore().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"9\" width=\"18\" height=\"9\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"9\" y1=\"9\" x2=\"9\" y2=\"18\" /><line x1=\"15\" y1=\"9\" x2=\"15\" y2=\"18\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"7\" /><polyline points=\"9 4 12 7 15 4\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Add row below\" onClick={() => ed.chain().focus().addRowAfter().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"9\" /><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" /><line x1=\"9\" y1=\"6\" x2=\"9\" y2=\"15\" /><line x1=\"15\" y1=\"6\" x2=\"15\" y2=\"15\" /><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" /><polyline points=\"9 20 12 17 15 20\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Add column left\" onClick={() => ed.chain().focus().addColumnBefore().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"9\" y=\"3\" width=\"12\" height=\"18\" /><line x1=\"14\" y1=\"3\" x2=\"14\" y2=\"21\" /><line x1=\"9\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"9\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"3\" y1=\"12\" x2=\"7\" y2=\"12\" /><polyline points=\"4 9 7 12 4 15\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Add column right\" onClick={() => ed.chain().focus().addColumnAfter().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"12\" height=\"18\" /><line x1=\"10\" y1=\"3\" x2=\"10\" y2=\"21\" /><line x1=\"3\" y1=\"9\" x2=\"15\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"15\" y2=\"15\" /><line x1=\"17\" y1=\"12\" x2=\"21\" y2=\"12\" /><polyline points=\"20 9 17 12 20 15\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Delete row\" onClick={() => ed.chain().focus().deleteRow().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"9\" width=\"18\" height=\"6\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" stroke=\"red\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Delete column\" onClick={() => ed.chain().focus().deleteColumn().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"18\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" stroke=\"red\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Merge cells\" onClick={() => ed.chain().focus().mergeCells().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" strokeDasharray=\"2 2\" /><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" fill=\"currentColor\" fillOpacity=\"0.15\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Split cell\" onClick={() => ed.chain().focus().splitCell().run()}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" /></svg>\n          </ToolbarIconButton>\n          <ToolbarIconButton title=\"Delete table\" onClick={() => ed.chain().focus().deleteTable().run()} style={{ color: 'red' }}>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"21\" stroke=\"red\" /></svg>\n          </ToolbarIconButton>\n        </ToolbarGroup>\n      )}\n\n      {/* Clear formatting */}\n      <ToolbarGroup label=\"Clear\">\n        <ToolbarIconButton title=\"Clear formatting\" onClick={() => ed.chain().focus().unsetAllMarks().clearNodes().run()}>\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 7V4h16v3\" /><path d=\"M5 20h6\" /><line x1=\"13\" y1=\"4\" x2=\"8\" y2=\"20\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"21\" stroke=\"red\" /></svg>\n        </ToolbarIconButton>\n      </ToolbarGroup>\n\n      {extraItems}\n      </div>\n\n      {hasSuggestions && (\n        <div className=\"docx-editor-toolbar__right\">\n          <ToolbarGroup label=\"Suggestions\">\n            <ToolbarIconButton title=\"Accept all suggestions\" onClick={() => editor.acceptAllSuggestions()}>\n              <CheckIcon size={16} />\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Reject all suggestions\" onClick={() => editor.rejectAllSuggestions()}>\n              <CloseIcon size={16} />\n            </ToolbarIconButton>\n          </ToolbarGroup>\n        </div>\n      )}\n      </div>\n    </div>\n  );\n}\n","/**\n * MobileMoreSheet — the full-height sheet opened by `MobileHeader`'s \"⋯\"\n * button, holding File/View/Watermark/Header-Footer actions that don't\n * already have a dedicated `MobileToolbar` tab (Home/Insert cover the\n * everyday formatting + insert actions; this sheet is the mobile\n * equivalent of desktop's File/View menus).\n *\n * Presented as grouped iOS-Settings-style cards — each action is a row\n * with a leading icon + label (destructive actions tinted red), View is a\n * segmented Pageless/Paged toggle, and Watermark presets are quick chips.\n * This is a mobile-native pattern rather than a re-skin of the desktop\n * text-only dropdown, so it does NOT reuse `MenuBar`'s row components; the\n * rows are rendered from a local data model (`Row`/`Section`) below.\n */\nimport * as React from 'react';\nimport type { DocxEditor, EditorMode } from '../../editor';\nimport { WatermarkDialog, PageSetupDialog, PromptDialog } from '../document-structure';\nimport { savePageSetup } from '../page-setup-storage';\nimport {\n  CloseIcon, PlusIcon, FolderOpenIcon, SaveIcon, PdfExportIcon, HistoryIcon,\n  TrashIcon, TemplateIcon, ChevronRightIcon,\n} from '../icons';\n\n/**\n * Icons a host can name for a custom menu row. A name rather than a React\n * node because the React Native package delivers these rows across a WebView\n * RPC boundary, where only JSON survives — so the icon has to be something\n * both sides can spell. Web callers not crossing that boundary can pass a\n * `React.ReactNode` instead (see `MobileMenuItem.icon`).\n */\nexport type MobileMenuIconName =\n  | 'save'\n  | 'cloud'\n  | 'open'\n  | 'new'\n  | 'pdf'\n  | 'history'\n  | 'template'\n  | 'trash'\n  | 'settings'\n  | 'header'\n  | 'footer';\n\n/** One host-provided row in the \"⋯\" menu. */\nexport interface MobileMenuItem {\n  id: string;\n  label: string;\n  icon?: MobileMenuIconName | React.ReactNode;\n  /** Tint the row red (destructive action). */\n  danger?: boolean;\n  disabled?: boolean;\n  /** Show a trailing chevron — the row opens something further. */\n  chevron?: boolean;\n  /**\n   * Whether tapping closes the sheet. Defaults to `true`; pass `false` for a\n   * row whose own UI (a spinner, a toggled checkmark) should stay visible.\n   */\n  closeOnPress?: boolean;\n}\n\n/** A group of host-provided rows, rendered as one iOS-settings-style card. */\nexport interface MobileMenuSection {\n  id: string;\n  /** Card heading. Omit to render the rows with no section label. */\n  title?: string;\n  /**\n   * Where the section lands:\n   *   - `'file'`   — appended into the built-in **File** card, for actions\n   *                  that belong beside Save/Open/Export (e.g. \"Save to Drive\").\n   *   - `'top'`    — its own card above File, for app-level actions.\n   *   - `'bottom'` — its own card after everything (the default).\n   */\n  placement?: 'file' | 'top' | 'bottom';\n  items: MobileMenuItem[];\n}\n\n/** One tappable action row inside a card. */\ninterface Row {\n  key: string;\n  icon: React.ReactNode;\n  label: string;\n  onClick: () => void;\n  active?: boolean;\n  disabled?: boolean;\n  danger?: boolean;\n  /** Show a trailing chevron (row opens a further dialog/screen). */\n  chevron?: boolean;\n}\n\n/** Inline gear glyph — there's no gear in the shared icon set. */\nconst GearGlyph = (\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n    <circle cx=\"12\" cy=\"12\" r=\"3\" />\n    <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n  </svg>\n);\nconst HeaderGlyph = (\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" aria-hidden=\"true\">\n    <rect x=\"4\" y=\"4\" width=\"16\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.9\" stroke=\"none\" />\n    <line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\" /><line x1=\"6\" y1=\"16\" x2=\"14\" y2=\"16\" />\n  </svg>\n);\nconst FooterGlyph = (\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" aria-hidden=\"true\">\n    <line x1=\"6\" y1=\"8\" x2=\"18\" y2=\"8\" /><line x1=\"6\" y1=\"12\" x2=\"14\" y2=\"12\" />\n    <rect x=\"4\" y=\"16\" width=\"16\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.9\" stroke=\"none\" />\n  </svg>\n);\n\n/** Cloud-upload glyph — for host rows that push the document somewhere. */\nconst CloudGlyph = (\n  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n    <path d=\"M20 17.6A4 4 0 0 0 18 10h-1.3A7 7 0 1 0 5 16.3\" />\n    <path d=\"M12 12v9\" /><path d=\"m8.5 15.5 3.5-3.5 3.5 3.5\" />\n  </svg>\n);\n\nfunction SheetCard({ children }: { children: React.ReactNode }): React.ReactElement {\n  return <div className=\"docx-editor-mobile-sheet__card\">{children}</div>;\n}\n\nfunction SheetRow({ row }: { row: Row }): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"docx-editor-mobile-sheet__row\"\n      data-active={row.active ? 'true' : undefined}\n      data-danger={row.danger ? 'true' : undefined}\n      disabled={row.disabled}\n      onClick={row.onClick}\n    >\n      <span className=\"docx-editor-mobile-sheet__row-icon\">{row.icon}</span>\n      <span className=\"docx-editor-mobile-sheet__row-label\">{row.label}</span>\n      {row.active && <span className=\"docx-editor-mobile-sheet__row-check\">✓</span>}\n      {row.chevron && !row.active && (\n        <span className=\"docx-editor-mobile-sheet__row-chevron\"><ChevronRightIcon size={16} /></span>\n      )}\n    </button>\n  );\n}\n\n/** Named icon → the glyph actually rendered. */\nconst MENU_ICONS: Record<MobileMenuIconName, React.ReactNode> = {\n  save: <SaveIcon size={18} />,\n  cloud: CloudGlyph,\n  open: <FolderOpenIcon size={18} />,\n  new: <PlusIcon size={18} />,\n  pdf: <PdfExportIcon size={18} />,\n  history: <HistoryIcon size={18} />,\n  template: <TemplateIcon size={18} />,\n  trash: <TrashIcon size={18} />,\n  settings: GearGlyph,\n  header: HeaderGlyph,\n  footer: FooterGlyph,\n};\n\nfunction menuIcon(icon: MobileMenuItem['icon']): React.ReactNode {\n  if (typeof icon === 'string') return MENU_ICONS[icon as MobileMenuIconName] ?? <TemplateIcon size={18} />;\n  return icon ?? <TemplateIcon size={18} />;\n}\n\nexport interface MobileMoreSheetProps {\n  open: boolean;\n  onClose: () => void;\n  editor: DocxEditor;\n  name: string;\n  onNameChange: (name: string) => void;\n  mode?: EditorMode;\n  onExportPdf?: (editor: DocxEditor) => void;\n  onToggleHistory?: () => void;\n  /**\n   * Host-provided rows added to this sheet — the extension point for actions\n   * the editor itself knows nothing about (\"Save to Drive\", \"Send for\n   * signature\", …). Tapping one calls `onExtraItemPress` with its id; the\n   * sheet never interprets ids itself.\n   */\n  extraSections?: MobileMenuSection[];\n  /** Fired with the tapped `extraSections` item's id. */\n  onExtraItemPress?: (id: string) => void;\n}\n\nexport function MobileMoreSheet({\n  open,\n  onClose,\n  editor,\n  name,\n  onNameChange,\n  onExportPdf,\n  onToggleHistory,\n  extraSections,\n  onExtraItemPress,\n}: MobileMoreSheetProps): React.ReactElement | null {\n  const ed = editor.editor;\n  const [watermarkOpen, setWatermarkOpen] = React.useState(false);\n  const [pageSetupOpen, setPageSetupOpen] = React.useState(false);\n  const [headerPromptOpen, setHeaderPromptOpen] = React.useState(false);\n  const [footerPromptOpen, setFooterPromptOpen] = React.useState(false);\n  const [viewMode, setViewModeState] = React.useState(editor.getViewMode());\n\n  if (!open) return null;\n\n  const applyViewMode = (m: 'pageless' | 'paged') => {\n    editor.setViewMode(m);\n    setViewModeState(m);\n  };\n\n  const handleOpenFile = () => {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = '.docx';\n    input.onchange = async () => {\n      const file = input.files?.[0];\n      if (!file) return;\n      editor.setLoading(true, 'Loading .docx…');\n      try {\n        await editor.loadDocx(await file.arrayBuffer());\n        onNameChange(file.name);\n      } catch (err) {\n        alert('Failed to open: ' + (err as Error).message);\n      } finally {\n        editor.setLoading(false);\n      }\n    };\n    input.click();\n    onClose();\n  };\n\n  const handleSave = () => {\n    editor.downloadDocx(name || 'document.docx');\n    if (onToggleHistory) editor.recordCheckpoint({ source: 'user', label: 'Manual save' });\n    onClose();\n  };\n\n  const fileRows: Row[] = [\n    { key: 'new', icon: <PlusIcon size={18} />, label: 'New document', onClick: () => { if (confirm('Start a new document? Current content will be lost.')) ed.commands.setContent('<p></p>'); onClose(); } },\n    { key: 'open', icon: <FolderOpenIcon size={18} />, label: 'Open .docx…', onClick: handleOpenFile },\n    { key: 'save', icon: <SaveIcon size={18} />, label: 'Save .docx', onClick: handleSave },\n    { key: 'pdf', icon: <PdfExportIcon size={18} />, label: 'Export PDF…', onClick: () => { if (onExportPdf) onExportPdf(editor); else editor.printToPdf(); onClose(); } },\n  ];\n  if (onToggleHistory) {\n    fileRows.push({ key: 'history', icon: <HistoryIcon size={18} />, label: 'History', onClick: () => { onToggleHistory(); onClose(); }, chevron: true });\n  }\n\n  // Host rows share the built-in `Row` shape, so they get the same icon/\n  // disabled/danger/chevron treatment as everything else in the sheet — a\n  // \"Save to Drive\" row is indistinguishable from \"Save .docx\" by design.\n  const toRow = (item: MobileMenuItem): Row => ({\n    key: item.id,\n    icon: menuIcon(item.icon),\n    label: item.label,\n    disabled: item.disabled,\n    danger: item.danger,\n    chevron: item.chevron,\n    onClick: () => {\n      onExtraItemPress?.(item.id);\n      if (item.closeOnPress !== false) onClose();\n    },\n  });\n\n  const sectionsAt = (placement: MobileMenuSection['placement']) =>\n    (extraSections ?? []).filter((s) => (s.placement ?? 'bottom') === placement && s.items.length > 0);\n\n  // `placement: 'file'` merges into the built-in File card rather than\n  // adding a card of its own, so an app's own save action sits next to the\n  // editor's instead of stranded in a separate group.\n  for (const section of sectionsAt('file')) fileRows.push(...section.items.map(toRow));\n\n  const renderSections = (placement: MobileMenuSection['placement']) =>\n    sectionsAt(placement).map((section) => (\n      <React.Fragment key={section.id}>\n        {section.title && <div className=\"docx-editor-mobile-sheet__section\">{section.title}</div>}\n        <SheetCard>\n          {section.items.map((item) => <SheetRow key={item.id} row={toRow(item)} />)}\n        </SheetCard>\n      </React.Fragment>\n    ));\n\n  const hasWatermark = !!editor.getWatermark();\n\n  return (\n    <div className=\"docx-editor-mobile-sheet-overlay\" onClick={onClose}>\n      <div className=\"docx-editor-mobile-sheet\" onClick={(e) => e.stopPropagation()} role=\"dialog\" aria-label=\"Menu\">\n        <div className=\"docx-editor-mobile-sheet__grabber\" aria-hidden=\"true\" />\n        <div className=\"docx-editor-mobile-sheet__header\">\n          <span className=\"docx-editor-mobile-sheet__title\">Menu</span>\n          <button type=\"button\" className=\"docx-editor-mobile-sheet__close\" onClick={onClose} aria-label=\"Close menu\">\n            <CloseIcon size={18} />\n          </button>\n        </div>\n\n        <div className=\"docx-editor-mobile-sheet__body\">\n          {renderSections('top')}\n\n          <div className=\"docx-editor-mobile-sheet__section\">File</div>\n          <SheetCard>\n            {fileRows.map((r) => <SheetRow key={r.key} row={r} />)}\n          </SheetCard>\n\n          <div className=\"docx-editor-mobile-sheet__section\">View</div>\n          <SheetCard>\n            <div className=\"docx-editor-mobile-sheet__segmented\" role=\"tablist\" aria-label=\"Page view mode\">\n              <button\n                type=\"button\"\n                role=\"tab\"\n                aria-selected={viewMode === 'pageless'}\n                data-active={viewMode === 'pageless' ? 'true' : undefined}\n                onClick={() => applyViewMode('pageless')}\n              >\n                Pageless\n              </button>\n              <button\n                type=\"button\"\n                role=\"tab\"\n                aria-selected={viewMode === 'paged'}\n                data-active={viewMode === 'paged' ? 'true' : undefined}\n                onClick={() => applyViewMode('paged')}\n              >\n                Paged\n              </button>\n            </div>\n            <SheetRow row={{ key: 'page-setup', icon: GearGlyph, label: 'Page setup…', onClick: () => setPageSetupOpen(true), chevron: true }} />\n          </SheetCard>\n\n          <div className=\"docx-editor-mobile-sheet__section\">Watermark</div>\n          <div className=\"docx-editor-mobile-sheet__chips\">\n            <button type=\"button\" className=\"docx-editor-mobile-sheet__chip\" onClick={() => { editor.setWatermark({ text: 'CONFIDENTIAL' }); onClose(); }}>CONFIDENTIAL</button>\n            <button type=\"button\" className=\"docx-editor-mobile-sheet__chip\" onClick={() => { editor.setWatermark({ text: 'DRAFT' }); onClose(); }}>DRAFT</button>\n            <button type=\"button\" className=\"docx-editor-mobile-sheet__chip\" onClick={() => setWatermarkOpen(true)}>Custom…</button>\n          </div>\n          <SheetCard>\n            <SheetRow row={{ key: 'wm-custom', icon: <TemplateIcon size={18} />, label: 'Custom watermark…', onClick: () => setWatermarkOpen(true), chevron: true }} />\n            <SheetRow row={{ key: 'wm-remove', icon: <TrashIcon size={18} />, label: 'Remove watermark', onClick: () => { editor.setWatermark(null); onClose(); }, disabled: !hasWatermark, danger: true }} />\n          </SheetCard>\n\n          <div className=\"docx-editor-mobile-sheet__section\">Header &amp; Footer</div>\n          <SheetCard>\n            <SheetRow row={{ key: 'header', icon: HeaderGlyph, label: 'Add header…', onClick: () => setHeaderPromptOpen(true), chevron: true }} />\n            <SheetRow row={{ key: 'footer', icon: FooterGlyph, label: 'Add footer…', onClick: () => setFooterPromptOpen(true), chevron: true }} />\n          </SheetCard>\n\n          <div className=\"docx-editor-mobile-sheet__section\">Document</div>\n          <SheetCard>\n            <SheetRow row={{ key: 'clear', icon: <TrashIcon size={18} />, label: 'Clear document', onClick: () => { if (confirm('Clear all content?')) ed.commands.setContent('<p></p>'); onClose(); }, danger: true }} />\n          </SheetCard>\n\n          {renderSections('bottom')}\n        </div>\n      </div>\n\n      <WatermarkDialog\n        open={watermarkOpen}\n        onClose={() => setWatermarkOpen(false)}\n        current={editor.getWatermark()}\n        onApply={(config) => editor.setWatermark(config)}\n      />\n      <PageSetupDialog\n        open={pageSetupOpen}\n        onClose={() => setPageSetupOpen(false)}\n        current={editor.getPageSetup()}\n        onApply={(setup) => {\n          editor.setPageSetup(setup);\n          savePageSetup(setup);\n        }}\n      />\n      <PromptDialog\n        open={headerPromptOpen}\n        label=\"Header HTML\"\n        defaultValue=\"<p>Header</p>\"\n        onCancel={() => setHeaderPromptOpen(false)}\n        onSubmit={(html) => {\n          editor.setHeaderHTML(html);\n          setHeaderPromptOpen(false);\n        }}\n      />\n      <PromptDialog\n        open={footerPromptOpen}\n        label=\"Footer HTML\"\n        defaultValue='<p style=\"text-align:center\">Page 1</p>'\n        onCancel={() => setFooterPromptOpen(false)}\n        onSubmit={(html) => {\n          editor.setFooterHTML(html);\n          setFooterPromptOpen(false);\n        }}\n      />\n    </div>\n  );\n}\n","/**\n * MobileHeader — replaces the desktop `TitleBar` + `HeaderActions` row\n * (and the `MenuBar` above it) when `layout === 'mobile'`. Kept to a\n * simple identity row — document icon, folded filename input, a \"⋯\"\n * button that opens `MobileMoreSheet` — so it reads as \"what document is\n * this\" rather than competing with the toolbar for attention. The zoom\n * control lives one row down, in `MobileToolbar`'s tabs row, alongside\n * the Home/Insert section tabs.\n */\nimport * as React from 'react';\nimport type { DocxEditor, EditorMode } from '../../editor';\nimport { DocumentLogoIcon } from '../icons';\nimport { ModeSwitcher } from '../ModeSwitcher';\nimport { MobileMoreSheet, type MobileMenuSection } from './MobileMoreSheet';\n\nexport interface MobileHeaderProps {\n  editor: DocxEditor;\n  name: string;\n  onNameChange: (name: string) => void;\n  /** See `ReactDocxEditorProps.mode`. */\n  mode?: EditorMode;\n  /** See `ReactDocxEditorProps.onExportPdf`. */\n  onExportPdf?: (editor: DocxEditor) => void;\n  /** Presence shows the \"History\" row in the more sheet. See `HeaderActionsProps.onToggleHistory`. */\n  onToggleHistory?: () => void;\n  /** Host-provided rows for the \"⋯\" sheet. See `MobileMoreSheetProps.extraSections`. */\n  menuSections?: MobileMenuSection[];\n  /** Fired with the tapped `menuSections` item's id. */\n  onMenuItemPress?: (id: string) => void;\n}\n\nexport function MobileHeader({\n  editor,\n  name,\n  onNameChange,\n  mode,\n  onExportPdf,\n  onToggleHistory,\n  menuSections,\n  onMenuItemPress,\n}: MobileHeaderProps): React.ReactElement {\n  const [sheetOpen, setSheetOpen] = React.useState(false);\n  const viewOnly = mode === 'viewing';\n\n  return (\n    <div className=\"docx-editor-mobile-header\">\n      <DocumentLogoIcon size={22} className=\"docx-editor-mobile-header__logo\" />\n      <input\n        className=\"docx-editor-mobile-header__filename-input\"\n        type=\"text\"\n        value={name}\n        onChange={(e) => onNameChange(e.target.value)}\n        spellCheck={false}\n        disabled={viewOnly}\n      />\n      <ModeSwitcher editor={editor} mode={mode} />\n      <button\n        type=\"button\"\n        className=\"docx-editor-mobile-header__more-btn\"\n        title=\"More\"\n        aria-label=\"More options\"\n        onClick={() => setSheetOpen(true)}\n      >\n        &#8942;\n      </button>\n\n      <MobileMoreSheet\n        open={sheetOpen}\n        onClose={() => setSheetOpen(false)}\n        editor={editor}\n        name={name}\n        onNameChange={onNameChange}\n        onExportPdf={onExportPdf}\n        onToggleHistory={onToggleHistory}\n        extraSections={menuSections}\n        onExtraItemPress={onMenuItemPress}\n      />\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { resolvePageDimensions } from '../../page-setup';\nimport { loadZoom, saveZoom } from '../page-setup-storage';\n\n/**\n * usePageZoom — real page scaling, fixing the blank-space bug in the\n * unwired `useWheelZoom.ts` (same folder): that hook applies `transform:\n * scale()` directly to `.docx-editor-page`, but `transform` never shrinks\n * an element's reserved layout box, so \"zooming out\" just leaves dead\n * space around a still-full-size page instead of visually fitting more of\n * the document into the same viewport.\n *\n * Fix: wrap `.docx-editor-page` in a sizing wrapper whose width/height are\n * the *scaled* dimensions (`pageWidth * zoom`, `pageHeight * zoom`) — the\n * wrapper is what participates in the surface's flow/scroll sizing — while\n * the page itself keeps its natural size and gets `transform: scale(zoom);\n * transform-origin: top left`.\n *\n * Call this only where zoom is actually wanted (currently `MobileToolbar`,\n * mounted only when `layout === 'mobile'`) — mounting the hook is what\n * creates the wrapper and starts observing/resizing, so simply not calling\n * it (as desktop doesn't) is what keeps desktop's DOM/zoom behavior\n * completely unchanged.\n */\n\nconst MIN_ZOOM = 0.25; // matches MobileZoomControl's MIN/PRESETS (25%-200%)\nconst MAX_ZOOM = 2.0;\nconst WRAPPER_CLASS = 'docx-editor-page-zoom-wrapper';\n\nexport interface UsePageZoomOptions {\n  /**\n   * When 'mobile', a default fit-to-width zoom is computed from the\n   * surface's width (via ResizeObserver) and applied automatically as\n   * long as the user hasn't picked an explicit zoom yet (this session or\n   * a persisted one from a previous session). Desktop never gets an\n   * automatic default — zoom stays 1 unless the host explicitly calls\n   * `setZoom`.\n   */\n  layout?: 'desktop' | 'mobile';\n}\n\nexport interface UsePageZoomResult {\n  zoom: number;\n  setZoom: (zoom: number) => void;\n}\n\nfunction clamp(z: number): number {\n  return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, z));\n}\n\nexport function usePageZoom(editor: DocxEditor | null, options: UsePageZoomOptions = {}): UsePageZoomResult {\n  const { layout = 'desktop' } = options;\n\n  const persisted = React.useRef<number | null>(null);\n  if (persisted.current === null) persisted.current = loadZoom() ?? 1;\n\n  const [zoom, setZoomState] = React.useState<number>(persisted.current);\n  const explicitRef = React.useRef<boolean>(loadZoom() !== null);\n  const wrapperRef = React.useRef<HTMLElement | null>(null);\n\n  const setZoom = React.useCallback((z: number) => {\n    const c = clamp(z);\n    explicitRef.current = true;\n    setZoomState(c);\n    saveZoom(c);\n  }, []);\n\n  // 1. Create (or find) the sizing wrapper around `.docx-editor-page`.\n  React.useEffect(() => {\n    if (!editor) return;\n    const page = editor.getPage();\n    if (!page) return;\n    const parent = page.parentElement;\n    if (!parent) return;\n\n    if (parent.classList.contains(WRAPPER_CLASS)) {\n      wrapperRef.current = parent;\n      return;\n    }\n\n    const wrapper = document.createElement('div');\n    wrapper.className = WRAPPER_CLASS;\n    parent.insertBefore(wrapper, page);\n    wrapper.appendChild(page);\n    wrapperRef.current = wrapper;\n  }, [editor]);\n\n  // 2. Apply the current zoom to the wrapper + page whenever it changes\n  //    (or the page setup's dimensions change, e.g. a different page size).\n  //\n  //    The wrapper's HEIGHT must follow the page element's *rendered* height,\n  //    not one page's nominal height: `.docx-editor-page` grows past a single\n  //    page whenever the document does — in 'paged' mode `_layoutPagination`\n  //    grows its min-height to fit `pageBreaks + 1` pages, and in 'pageless'\n  //    mode content simply flows past the one-page min-height. Since the\n  //    wrapper is `overflow: hidden` (mobile/layout.css), pinning its height\n  //    to `heightPx * zoom` clipped every document to its first page — which\n  //    is what made an inserted template or clause look like it \"shrank\" and\n  //    only partly appeared. `offsetHeight` is the pre-transform layout\n  //    height, so scaling it by `zoom` gives the on-screen size exactly.\n  const pageSetupKey = editor ? JSON.stringify(editor.getPageSetup()) : '';\n  const syncWrapperSize = React.useCallback(\n    (z: number) => {\n      if (!editor) return;\n      const wrapper = wrapperRef.current;\n      const page = editor.getPage();\n      if (!wrapper || !page) return;\n      const { widthPx, heightPx } = resolvePageDimensions(editor.getPageSetup());\n      // Fall back to the nominal page height only before first layout, when\n      // `offsetHeight` is still 0 (detached/hidden), so the wrapper never\n      // collapses to nothing.\n      const renderedHeight = page.offsetHeight || heightPx;\n      wrapper.style.width = `${widthPx * z}px`;\n      wrapper.style.height = `${renderedHeight * z}px`;\n      page.style.transform = `scale(${z})`;\n      page.style.transformOrigin = 'top left';\n      // Belt-and-braces for engines that don't support `overflow: clip` and\n      // so fall back to `overflow: hidden` (see mobile/layout.css): a hidden\n      // box is still programmatically scrollable, and ProseMirror's caret\n      // `scrollIntoView` will scroll it — stranding the document at an offset\n      // the user has no way to scroll back from, since a hidden box accepts\n      // no touch or wheel input. Nothing should ever scroll this wrapper, so\n      // pinning it to 0 on every sync is safe and costs nothing.\n      if (wrapper.scrollTop !== 0) wrapper.scrollTop = 0;\n      if (wrapper.scrollLeft !== 0) wrapper.scrollLeft = 0;\n    },\n    [editor]\n  );\n\n  React.useEffect(() => {\n    syncWrapperSize(zoom);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [editor, zoom, pageSetupKey, syncWrapperSize]);\n\n  // 2b. Keep the wrapper in step with the page as the document itself grows\n  //     or shrinks — inserting a template/clause, typing, adding or deleting\n  //     a page break, an image finishing loading, or a pagination pass all\n  //     change `.docx-editor-page`'s height without changing `zoom`, so the\n  //     effect above would never re-run on its own.\n  React.useEffect(() => {\n    if (!editor) return;\n    if (typeof ResizeObserver === 'undefined') return;\n    const page = editor.getPage();\n    if (!page) return;\n    const ro = new ResizeObserver(() => syncWrapperSize(zoom));\n    ro.observe(page);\n    return () => ro.disconnect();\n  }, [editor, zoom, syncWrapperSize]);\n\n  // 3. Mobile-only default fit-to-width zoom, recomputed on container resize,\n  //    but only until the user (or a previous session) sets an explicit zoom.\n  React.useEffect(() => {\n    if (!editor || layout !== 'mobile') return;\n    if (typeof ResizeObserver === 'undefined') return;\n    const surface = editor.getSurface();\n    if (!surface) return;\n\n    const HORIZONTAL_PADDING = 32; // matches mobile/layout.css surface padding\n    // A real-world page (A4/Letter, ~794-816px) is wider than most phones\n    // even at MIN_ZOOM (0.5) — clamping the auto-fit to that floor (as the\n    // manual zoom slider does) leaves the scaled page wider than the\n    // surface, forcing an unexpected horizontal scroll the very first time\n    // the editor opens. The auto-fit computation gets its own, lower floor\n    // so the page always starts fully within the viewport's width; the\n    // slider's own MIN_ZOOM still applies once the user takes over.\n    const AUTO_FIT_MIN_ZOOM = 0.3;\n\n    const computeFit = () => {\n      if (explicitRef.current) return;\n      const { widthPx } = resolvePageDimensions(editor.getPageSetup());\n      const containerWidth = surface.clientWidth;\n      if (containerWidth <= 0 || widthPx <= 0) return;\n      const fit = Math.max(AUTO_FIT_MIN_ZOOM, Math.min(1, (containerWidth - HORIZONTAL_PADDING) / widthPx));\n      setZoomState(fit);\n    };\n\n    computeFit();\n    const ro = new ResizeObserver(computeFit);\n    ro.observe(surface);\n    // Fallback for native WebView hosts (see packages/react-native): on\n    // some Android WebView versions the surface's initial layout can race\n    // with mount (clientWidth briefly 0 or stale on first paint), and an\n    // orientation change doesn't always reflow in time for ResizeObserver\n    // to have already caught the correct post-rotation width. A `resize`\n    // listener plus a short delayed re-check covers both without changing\n    // behavior in a normal browser tab, where ResizeObserver alone already\n    // handles it (this just becomes a harmless extra no-op recompute).\n    window.addEventListener('resize', computeFit);\n    const raceTimer = setTimeout(computeFit, 300);\n    return () => {\n      ro.disconnect();\n      window.removeEventListener('resize', computeFit);\n      clearTimeout(raceTimer);\n    };\n  }, [editor, layout]);\n\n  // 4. Two-finger touch pinch-to-zoom on the surface.\n  React.useEffect(() => {\n    if (!editor) return;\n    const surface = editor.getSurface();\n    if (!surface) return;\n\n    let startDist: number | null = null;\n    let startZoom = zoom;\n\n    const distance = (touches: TouchList): number => {\n      const a = touches[0];\n      const b = touches[1];\n      return Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n    };\n\n    const onTouchStart = (e: TouchEvent) => {\n      if (e.touches.length === 2) {\n        startDist = distance(e.touches);\n        startZoom = zoom;\n      }\n    };\n    const onTouchMove = (e: TouchEvent) => {\n      if (e.touches.length === 2 && startDist) {\n        e.preventDefault();\n        const ratio = distance(e.touches) / startDist;\n        setZoom(startZoom * ratio);\n      }\n    };\n    const onTouchEnd = (e: TouchEvent) => {\n      if (e.touches.length < 2) startDist = null;\n    };\n\n    surface.addEventListener('touchstart', onTouchStart, { passive: true });\n    surface.addEventListener('touchmove', onTouchMove, { passive: false });\n    surface.addEventListener('touchend', onTouchEnd, { passive: true });\n    surface.addEventListener('touchcancel', onTouchEnd, { passive: true });\n    return () => {\n      surface.removeEventListener('touchstart', onTouchStart);\n      surface.removeEventListener('touchmove', onTouchMove);\n      surface.removeEventListener('touchend', onTouchEnd);\n      surface.removeEventListener('touchcancel', onTouchEnd);\n    };\n  }, [editor, zoom, setZoom]);\n\n  return { zoom, setZoom };\n}\n","/**\n * MobileZoomControl — replaces the desktop `ZoomControl` (tiny +/- buttons\n * flanking a `<select>`), rendered in `MobileStatusBar` rather than the\n * tabs row (it used to live there — crammed next to Home/Insert, three\n * mouse-sized targets read as clutter and had nothing to do with which\n * tool section was showing). This is a single \"100%\"-style chip; tapping\n * it opens a small popover with a full-width slider — one big, easy drag\n * target instead of three small taps.\n *\n * Deliberately does NOT use the shared `FloatingPanel` primitive (the\n * `Dropdown`/color-picker popover base): that renders through a\n * `document.body` portal, which drops out of `.docx-editor-react\n * [data-de-layout=\"mobile\"]`'s DOM subtree — every mobile CSS partial\n * scopes its rules under that ancestor selector (see `styles/mobile/*.css`\n * header comments), so a portaled panel would silently lose all of its\n * theme variables. Positioning the panel as a plain absolutely-positioned\n * child of this component instead keeps it in the mobile-scoped subtree,\n * so it inherits `--de-*` tokens normally — no portal, no fallback-value\n * hacks needed.\n */\nimport * as React from 'react';\nimport { ChevronDownIcon } from '../icons';\n\nexport interface MobileZoomControlProps {\n  zoom: number; // 0.5 - 2.0\n  onChange: (zoom: number) => void;\n}\n\nconst MIN = 25;\nconst MAX = 200;\nconst STEP = 5;\nconst PRESETS = [25, 50, 75, 100, 125, 150, 200];\n\nexport function MobileZoomControl({ zoom, onChange }: MobileZoomControlProps): React.ReactElement {\n  const [open, setOpen] = React.useState(false);\n  const wrapRef = React.useRef<HTMLDivElement>(null);\n  const percent = Math.round(zoom * 100);\n\n  const setPercent = (p: number) => onChange(Math.max(MIN, Math.min(MAX, p)) / 100);\n\n  React.useEffect(() => {\n    if (!open) return;\n    const onPointerDown = (e: PointerEvent) => {\n      if (!wrapRef.current?.contains(e.target as Node)) setOpen(false);\n    };\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') setOpen(false);\n    };\n    document.addEventListener('pointerdown', onPointerDown);\n    document.addEventListener('keydown', onKey);\n    return () => {\n      document.removeEventListener('pointerdown', onPointerDown);\n      document.removeEventListener('keydown', onKey);\n    };\n  }, [open]);\n\n  return (\n    <div className=\"docx-editor-mobile-zoom\" ref={wrapRef}>\n      <button\n        type=\"button\"\n        className=\"docx-editor-mobile-zoom__trigger\"\n        title=\"Zoom\"\n        aria-haspopup=\"dialog\"\n        aria-expanded={open}\n        onClick={() => setOpen((v) => !v)}\n      >\n        <span>{percent}%</span>\n        <ChevronDownIcon size={11} />\n      </button>\n\n      {open && (\n        <div className=\"docx-editor-mobile-zoom__panel\" role=\"dialog\" aria-label=\"Zoom\">\n          <div className=\"docx-editor-mobile-zoom__row\">\n            <button\n              type=\"button\"\n              className=\"docx-editor-mobile-zoom__step\"\n              disabled={percent <= MIN}\n              onClick={() => setPercent(percent - STEP)}\n              aria-label=\"Zoom out\"\n            >\n              −\n            </button>\n            <input\n              type=\"range\"\n              className=\"docx-editor-mobile-zoom__slider\"\n              min={MIN}\n              max={MAX}\n              step={STEP}\n              value={percent}\n              onChange={(e) => setPercent(Number(e.target.value))}\n              aria-label=\"Zoom level\"\n            />\n            <button\n              type=\"button\"\n              className=\"docx-editor-mobile-zoom__step\"\n              disabled={percent >= MAX}\n              onClick={() => setPercent(percent + STEP)}\n              aria-label=\"Zoom in\"\n            >\n              +\n            </button>\n          </div>\n          <div className=\"docx-editor-mobile-zoom__presets\">\n            {PRESETS.map((p) => (\n              <button\n                key={p}\n                type=\"button\"\n                className=\"docx-editor-mobile-zoom__preset\"\n                data-active={percent === p ? 'true' : undefined}\n                onClick={() => setPercent(p)}\n              >\n                {p}%\n              </button>\n            ))}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n","/**\n * MobileStatusBar — replaces the desktop `StatusBar` when `layout ===\n * 'mobile'`. Same word count + page count stats as `StatusBar.tsx`\n * (re-derived here rather than shared — a small, focused duplication, the\n * same call `MobileMoreSheet.tsx`'s header comment makes for its own\n * File/View items), plus the zoom control, which now lives here instead of\n * the tabs row (see `MobileToolbar.tsx` and `styles/mobile/zoom.css`) —\n * that row's only job is switching Home/Insert/Table/Image, and \"how big\n * is the page\" pairs more naturally with \"how long is the page\" than with\n * a section switcher.\n *\n * Owns the `usePageZoom` hook itself (previously `MobileToolbar` did) —\n * mounting it here is exactly as safe as mounting it there: both render\n * for the whole lifetime of mobile layout, as siblings under the same\n * parent, so which one owns the hook doesn't change its behavior (see\n * `usePageZoom.ts`'s own doc comment).\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { usePageZoom } from '../ui-widgets/usePageZoom';\nimport { MobileZoomControl } from './MobileZoomControl';\n\nexport interface MobileStatusBarProps {\n  editor: DocxEditor;\n}\n\nexport function MobileStatusBar({ editor }: MobileStatusBarProps): React.ReactElement {\n  const [stats, setStats] = React.useState({ words: 0, pages: 1 });\n  const { zoom, setZoom } = usePageZoom(editor, { layout: 'mobile' });\n\n  React.useEffect(() => {\n    // Measured on the next frame because the page-height half of the count\n    // below is only correct after the editor's own pagination pass (also a\n    // rAF — see `DocxEditor._scheduleLayoutPagination`) has run for this\n    // change; reading synchronously inside the transaction handler would\n    // always report the previous layout.\n    let raf: number | null = null;\n    const update = () => {\n      raf = null;\n      const text = editor.getText();\n      const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n\n      // Count pages: each pageBreak node starts a new page (same logic as\n      // desktop StatusBar.tsx) — but that alone only counts EXPLICIT breaks,\n      // so a document that simply runs long reported \"Page 1 of 1\" no matter\n      // how many pages of text it held. That's most visible in 'pageless'\n      // mode (the mobile default), where there are no simulated page boxes to\n      // contradict the number, and it's a good part of what makes the\n      // pageless/paged pair look like two different documents.\n      let pageBreaks = 0;\n      const json = editor.getJSON();\n      if (json?.content && Array.isArray(json.content)) {\n        for (const block of json.content) {\n          if (block.type === 'pageBreak') pageBreaks++;\n        }\n      }\n\n      // Natural overflow has to be measured, and the measurement differs by\n      // mode, so it can't be one shared formula:\n      //\n      //  - 'pageless' has no simulated page boxes and no break spacers, so\n      //    the flowing content maps straight onto page-sized slices.\n      //  - 'paged' pads each break out to the next page boundary, so the\n      //    rendered height is mostly spacer, not text. There the whole-page\n      //    grid `_layoutPagination` built IS the page count; only content\n      //    that overran the last page adds more.\n      //\n      // Both use `offsetHeight`, the pre-transform layout height, so neither\n      // is affected by the mobile zoom scale on `.docx-editor-page`.\n      let pages = pageBreaks + 1;\n      const host = editor.getHost();\n      const page = editor.getPage();\n      const pm = page?.querySelector<HTMLElement>('.docx-editor-content .ProseMirror') ?? null;\n      if (host && page) {\n        const hostStyles = getComputedStyle(host);\n        const pageHeight = parseInt(hostStyles.getPropertyValue('--de-page-height')) || 0;\n        const marginY = parseInt(hostStyles.getPropertyValue('--de-page-margin-y')) || 0;\n        const pageGap = parseInt(hostStyles.getPropertyValue('--de-page-gap')) || 0;\n        const usablePerPage = pageHeight - 2 * marginY;\n\n        if (editor.getViewMode() === 'pageless') {\n          if (usablePerPage > 0 && pm && pm.offsetHeight > 0) {\n            pages = Math.max(pages, Math.ceil(pm.offsetHeight / usablePerPage));\n          }\n        } else if (pageHeight > 0 && page.offsetHeight > 0) {\n          const gridHeight = (pageBreaks + 1) * pageHeight + pageBreaks * pageGap;\n          // Ignore overflow too small to be a real page. A page that actually\n          // holds something carries a top margin plus at least one line, so\n          // anything under a tenth of a page is layout slop (trailing margins,\n          // sub-pixel rounding in the break spacers) rather than content.\n          const slop = pageHeight * 0.1;\n          const overflow = page.offsetHeight - gridHeight;\n          if (overflow > slop) {\n            pages = pageBreaks + 1 + Math.ceil(overflow / (pageHeight + pageGap));\n          }\n        }\n      }\n      setStats({ words, pages });\n    };\n    const schedule = () => {\n      if (raf !== null) return; // coalesce bursts of transactions into one pass\n      // Two frames deep, not one: the editor's pagination pass is itself a\n      // rAF scheduled from this same transaction, and callback order within\n      // a frame isn't guaranteed — waiting a second frame means the layout it\n      // produced is always already applied when the measurement runs.\n      raf = requestAnimationFrame(() => {\n        raf = requestAnimationFrame(update);\n      });\n    };\n    update();\n    editor.editor.on('update', schedule);\n    editor.editor.on('transaction', schedule);\n    return () => {\n      if (raf !== null) cancelAnimationFrame(raf);\n      editor.editor.off('update', schedule);\n      editor.editor.off('transaction', schedule);\n    };\n  }, [editor]);\n\n  return (\n    <div className=\"docx-editor-mobile-status-bar\">\n      {/* Char count dropped (present on desktop) — this bar already shares\n          its space with the zoom chip, and word/page count is what a\n          writer actually glances at while editing on a phone. */}\n      <span className=\"docx-editor-mobile-status-bar__stats\">\n        {stats.words} words · Page 1 of {stats.pages}\n      </span>\n      <MobileZoomControl zoom={zoom} onChange={setZoom} />\n    </div>\n  );\n}\n","import * as React from 'react';\n\nexport interface ScrollEdges {\n  ref: React.RefObject<HTMLDivElement>;\n  canScrollLeft: boolean;\n  canScrollRight: boolean;\n}\n\n/**\n * Tracks whether a horizontally scrollable row has more content off to the\n * left/right of its current scroll position. A plain `overflow-x: auto`\n * gives no visual cue that a row (the tool row, or the section-tabs row —\n * see MobileToolbar.tsx) holds more than fits on screen, so callers use\n * this to show a fade/chevron hint only on the edge(s) that actually have\n * more content, rather than always or never.\n *\n * Purely an observer — it does not scroll the row itself (no \"reset to\n * start\" or \"scroll active item into view\" behavior). Callers that need\n * that add their own effect against the same `ref`, since what counts as\n * \"reset\" differs (the tool row resets to the start on every tab switch;\n * the tab row instead scrolls the active tab into view — see\n * MobileToolbar.tsx).\n */\nexport function useScrollEdges(): ScrollEdges {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [canScrollLeft, setCanScrollLeft] = React.useState(false);\n  const [canScrollRight, setCanScrollRight] = React.useState(false);\n\n  const update = React.useCallback(() => {\n    const el = ref.current;\n    if (!el) return;\n    setCanScrollLeft(el.scrollLeft > 2);\n    setCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 2);\n  }, []);\n\n  React.useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    update();\n    el.addEventListener('scroll', update, { passive: true });\n    const ro = new ResizeObserver(update);\n    ro.observe(el);\n    return () => {\n      el.removeEventListener('scroll', update);\n      ro.disconnect();\n    };\n  }, [update]);\n\n  // Re-check after every render too — a row's contents can change size\n  // (buttons becoming active/disabled, a contextual tab appearing) without\n  // a scroll or resize event firing.\n  React.useEffect(() => {\n    update();\n  });\n\n  return { ref, canScrollLeft, canScrollRight };\n}\n","/**\n * MobileToolbar — replaces the desktop `Toolbar` when `layout === 'mobile'`.\n *\n * A tabbed layout instead of one long always-visible row: **Home**\n * (History, Style, Font, Format, Align, List — everyday formatting),\n * **Insert** (link, image, table, page break, hr, quote, code), plus two\n * contextual tabs that only appear when relevant — **Table** (only when\n * `ed.isActive('table')`) and **Image** (only when `ed.isActive('image')`)\n * — mirroring the conditional `inTable`/`ed.isActive('image')` groups in\n * desktop `Toolbar.tsx` exactly, just moved into a tab instead of an\n * always-visible row (see that file for the same button set).\n *\n * Every button is built from the same `ToolbarPrimitives`/`Dropdown`/\n * `ColorButton`/`TableSizePicker` desktop already uses — reused, not\n * reimplemented. Sizing to 44×44px touch targets happens entirely in CSS\n * (`styles/mobile/toolbar.css`, scoped under `[data-de-layout=\"mobile\"]`),\n * not via prop overrides here.\n *\n * Link insert and \"Insert image from URL\" route through `PromptDialog`\n * instead of `window.prompt` (RN WebView compatibility — see\n * `document-structure/PromptDialog.tsx`). Desktop `Toolbar.tsx` keeps using\n * `window.prompt` unchanged.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport {\n  COMMON_FONT_FAMILIES,\n  COMMON_FONT_SIZES,\n} from '../../extensions/builtins/tiptap-defaults';\nimport { Dropdown } from '../Dropdown';\nimport {\n  ToolbarGroup,\n  ToolbarIconButton,\n  ToolbarIconMenu,\n  ColorButton,\n} from '../ToolbarPrimitives';\nimport { TableSizePicker } from '../TableSizePicker';\nimport { insertTableFitted } from '../../extensions/builtins/table-enhancements';\nimport {\n  LinkIcon, ImageIcon, UploadIcon,\n  PageBreakIcon, HorizontalRuleIcon, QuoteIcon, CodeIcon,\n  UndoIcon, RedoIcon,\n  AlignLeftIcon, AlignCenterIcon, AlignRightIcon, AlignJustifyIcon,\n  BulletListIcon, OrderedListIcon, OutdentIcon, IndentIcon,\n  PencilIcon, PlusIcon, TableIcon,\n} from '../icons';\nimport {\n  currentParagraphStyle,\n  applyParagraphStyle,\n  currentFontSize,\n} from '../helpers';\nimport { PromptDialog } from '../document-structure/PromptDialog';\nimport { TemplatePicker, type TemplatePickerItem } from '../TemplatePicker';\nimport { useScrollEdges } from './useScrollEdges';\n\nexport interface MobileToolbarProps {\n  editor: DocxEditor;\n  /**\n   * Manual template insertion in the Insert tab — same `templates`/\n   * `onInsertTemplate` contract as desktop `Toolbar`, reusing the same\n   * `TemplatePicker` component (already viewport-clamped via `FloatingPanel`,\n   * so no mobile-specific popover was needed).\n   */\n  templates?: TemplatePickerItem[];\n  onInsertTemplate?: (id: string) => void;\n  /** Manual boilerplate-clause insertion — same contract as desktop `Toolbar`. */\n  clauses?: TemplatePickerItem[];\n  onInsertClause?: (id: string) => void;\n  /**\n   * Host-supplied buttons appended after the built-in Insert-tab group —\n   * the mobile equivalent of desktop `Toolbar`'s `extraItems`/`extraGroups`\n   * (which don't reach this component; see `ReactDocxEditorProps.layout`'s\n   * doc comment). Data-only (id + label, no arbitrary `ReactNode`, unlike\n   * desktop's slot) so a non-React host — `@shashimadushan/docx-editor-react-native`'s\n   * config channel — can describe them too; rendered as plain text buttons,\n   * same as the Bold/Italic/Underline buttons in the Home tab.\n   */\n  extraItems?: Array<{ id: string; label: string }>;\n  /** Fired when an `extraItems` entry is tapped, with that item's `id`. */\n  onExtraItemPress?: (id: string) => void;\n}\n\ntype MobileTab = 'home' | 'insert' | 'table' | 'image';\n\nexport function MobileToolbar({ editor, templates, onInsertTemplate, clauses, onInsertClause, extraItems, onExtraItemPress }: MobileToolbarProps): React.ReactElement {\n  const ed = editor.editor;\n  const inTable = ed.isActive('table');\n  const inImage = ed.isActive('image');\n  const mode = editor.getMode();\n  const viewOnly = mode === 'viewing';\n\n  const [tab, setTab] = React.useState<MobileTab>('home');\n  const [linkPromptOpen, setLinkPromptOpen] = React.useState(false);\n  const [imagePromptOpen, setImagePromptOpen] = React.useState(false);\n\n  // If the active tab's condition stops holding (selection left the table/\n  // image), fall back to Home rather than showing an empty tab panel.\n  React.useEffect(() => {\n    if (tab === 'table' && !inTable) setTab('home');\n    if (tab === 'image' && !inImage) setTab('home');\n  }, [tab, inTable, inImage]);\n\n  // The tool row scrolls horizontally (more groups than a phone width can\n  // hold) but a plain overflow-x has no visual cue that there's more off\n  // to the side — users would just never discover Bold/Italic/lists past\n  // the fold. `useScrollEdges` tracks scroll position so left/right edge\n  // hints only show up when there's actually more content in that direction\n  // (shared with the section-tabs row below, which has the same problem\n  // once more than ~2-3 tabs are on screen at once).\n  const { ref: scrollRef, canScrollLeft, canScrollRight } = useScrollEdges();\n\n  // Reset the tool row's scroll to the start whenever the tab (or table/\n  // image context) changes, so switching tabs doesn't leave a stale scroll\n  // offset from the previous tab's content.\n  React.useEffect(() => {\n    if (scrollRef.current) scrollRef.current.scrollLeft = 0;\n  }, [tab, scrollRef]);\n\n  const tabs: Array<{ id: MobileTab; label: string; icon: React.ReactNode }> = [\n    { id: 'home', label: 'Home', icon: <PencilIcon size={13} /> },\n    { id: 'insert', label: 'Insert', icon: <PlusIcon size={13} /> },\n  ];\n  if (inTable) tabs.push({ id: 'table', label: 'Table', icon: <TableIcon size={13} /> });\n  if (inImage) tabs.push({ id: 'image', label: 'Image', icon: <ImageIcon size={13} /> });\n\n  // Section-tabs row: same \"more than fits on screen\" problem as the tool\n  // row above, except here the fix isn't \"always reset to the start\" (the\n  // tab that was just selected — e.g. a newly-appeared Table/Image tab off\n  // to the right — should stay in view, not get scrolled away from), so it\n  // scrolls the active tab into view instead.\n  const { ref: tabsScrollRef, canScrollLeft: tabsCanScrollLeft, canScrollRight: tabsCanScrollRight } = useScrollEdges();\n  React.useEffect(() => {\n    const active = tabsScrollRef.current?.querySelector('[data-active=\"true\"]');\n    active?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n  }, [tab, tabs.length, tabsScrollRef]);\n\n  const submitLink = (url: string) => {\n    setLinkPromptOpen(false);\n    if (url === '') ed.chain().focus().extendMarkRange('link').unsetLink().run();\n    else ed.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n  };\n\n  const submitImageUrl = (url: string) => {\n    setImagePromptOpen(false);\n    if (url) ed.chain().focus().setImage({ src: url }).run();\n  };\n\n  return (\n    <div className=\"docx-editor-mobile-toolbar-row\">\n      <div className=\"docx-editor-mobile-toolbar-tabs-row\">\n        <div className=\"docx-editor-mobile-toolbar-tabs-scroll-wrap\">\n          <div\n            className=\"docx-editor-mobile-toolbar-tabs\"\n            role=\"tablist\"\n            aria-label=\"Toolbar sections\"\n            ref={tabsScrollRef}\n          >\n            {tabs.map((t) => (\n              <button\n                key={t.id}\n                type=\"button\"\n                role=\"tab\"\n                aria-selected={tab === t.id}\n                className=\"docx-editor-mobile-toolbar-tab\"\n                data-active={tab === t.id ? 'true' : undefined}\n                onClick={() => setTab(t.id)}\n              >\n                <span className=\"docx-editor-mobile-toolbar-tab__icon\">{t.icon}</span>\n                {t.label}\n              </button>\n            ))}\n          </div>\n\n          {tabsCanScrollLeft && (\n            <div className=\"docx-editor-mobile-toolbar-tabs-scroll-hint docx-editor-mobile-toolbar-tabs-scroll-hint--left\" aria-hidden=\"true\" />\n          )}\n          {tabsCanScrollRight && (\n            <div className=\"docx-editor-mobile-toolbar-tabs-scroll-hint docx-editor-mobile-toolbar-tabs-scroll-hint--right\" aria-hidden=\"true\" />\n          )}\n        </div>\n      </div>\n\n      <div className=\"docx-editor-mobile-toolbar-scroll-wrap\">\n        <div\n          className=\"docx-editor-mobile-toolbar\"\n          role=\"toolbar\"\n          aria-label=\"Formatting\"\n          data-view-only={viewOnly ? 'true' : undefined}\n          aria-disabled={viewOnly}\n          ref={scrollRef}\n        >\n          {tab === 'home' && (\n            <>\n              {/* Reverse of the old Format-first order: History/Font/Style\n                  come first, Format/List/Align last. Nothing here is more\n                  \"important\" than another group — this just matches how the\n                  user wants the row laid out. */}\n              <ToolbarGroup label=\"History\">\n                <ToolbarIconButton title=\"Undo\" disabled={!ed.can().undo?.()} onClick={() => ed.chain().focus().undo().run()}>\n                  <UndoIcon />\n                </ToolbarIconButton>\n                <ToolbarIconButton title=\"Redo\" disabled={!ed.can().redo?.()} onClick={() => ed.chain().focus().redo().run()}>\n                  <RedoIcon />\n                </ToolbarIconButton>\n              </ToolbarGroup>\n\n              <ToolbarGroup label=\"Font\">\n                <Dropdown\n                  title=\"Font family\"\n                  width=\"medium\"\n                  value={(ed.getAttributes('textStyle').fontFamily as string) ?? ''}\n                  options={COMMON_FONT_FAMILIES.map((f) => ({\n                    value: f.value,\n                    label: f.label,\n                    style: f.value ? { fontFamily: f.value } : undefined,\n                  }))}\n                  onChange={(v) => {\n                    if (v) ed.chain().focus().setFontFamily(v).run();\n                    else ed.chain().focus().unsetFontFamily().run();\n                  }}\n                />\n                <Dropdown\n                  title=\"Font size\"\n                  width=\"narrow\"\n                  value={currentFontSize(ed)}\n                  options={COMMON_FONT_SIZES.map((pt) => ({ value: String(pt * 1.333), label: String(pt) }))}\n                  onChange={(v) => {\n                    const px = Number(v);\n                    if (px) ed.chain().focus().setMark('textStyle', { fontSize: `${px}px` }).run();\n                  }}\n                />\n              </ToolbarGroup>\n\n              <ToolbarGroup label=\"Style\">\n                <Dropdown\n                  title=\"Paragraph style\"\n                  width=\"medium\"\n                  value={currentParagraphStyle(ed)}\n                  options={[\n                    { value: 'paragraph', label: 'Normal' },\n                    { value: 'h1', label: 'Heading 1' },\n                    { value: 'h2', label: 'Heading 2' },\n                    { value: 'h3', label: 'Heading 3' },\n                    { value: 'blockquote', label: 'Quote' },\n                    { value: 'codeBlock', label: 'Code Block' },\n                  ]}\n                  onChange={(v) => applyParagraphStyle(ed, v)}\n                />\n              </ToolbarGroup>\n\n              <ToolbarGroup label=\"Align\">\n                <ToolbarIconMenu\n                  title=\"Alignment\"\n                  options={[\n                    { value: 'left', label: 'Align left', icon: <AlignLeftIcon />, active: ed.isActive({ textAlign: 'left' }), onSelect: () => ed.chain().focus().setTextAlign('left').run() },\n                    { value: 'center', label: 'Align center', icon: <AlignCenterIcon />, active: ed.isActive({ textAlign: 'center' }), onSelect: () => ed.chain().focus().setTextAlign('center').run() },\n                    { value: 'right', label: 'Align right', icon: <AlignRightIcon />, active: ed.isActive({ textAlign: 'right' }), onSelect: () => ed.chain().focus().setTextAlign('right').run() },\n                    { value: 'justify', label: 'Justify', icon: <AlignJustifyIcon />, active: ed.isActive({ textAlign: 'justify' }), onSelect: () => ed.chain().focus().setTextAlign('justify').run() },\n                  ]}\n                />\n              </ToolbarGroup>\n\n              <ToolbarGroup label=\"List\">\n                <ToolbarIconMenu\n                  title=\"List type\"\n                  options={[\n                    { value: 'bullet', label: 'Bulleted list', icon: <BulletListIcon />, active: ed.isActive('bulletList'), onSelect: () => ed.chain().focus().toggleBulletList().run() },\n                    { value: 'ordered', label: 'Numbered list', icon: <OrderedListIcon />, active: ed.isActive('orderedList'), onSelect: () => ed.chain().focus().toggleOrderedList().run() },\n                  ]}\n                />\n                <ToolbarIconButton title=\"Decrease indent\" onClick={() => ed.chain().focus().liftListItem('listItem').run()}><OutdentIcon /></ToolbarIconButton>\n                <ToolbarIconButton title=\"Increase indent\" onClick={() => ed.chain().focus().sinkListItem('listItem').run()}><IndentIcon /></ToolbarIconButton>\n              </ToolbarGroup>\n\n              <ToolbarGroup label=\"Format\">\n                <ToolbarIconButton title=\"Bold\" active={ed.isActive('bold')} onClick={() => ed.chain().focus().toggleBold().run()} style={{ fontWeight: 800 }}>B</ToolbarIconButton>\n                <ToolbarIconButton title=\"Italic\" active={ed.isActive('italic')} onClick={() => ed.chain().focus().toggleItalic().run()} style={{ fontStyle: 'italic' }}>I</ToolbarIconButton>\n                <ToolbarIconButton title=\"Underline\" active={ed.isActive('underline')} onClick={() => ed.chain().focus().toggleUnderline().run()} style={{ textDecoration: 'underline' }}>U</ToolbarIconButton>\n                <ColorButton\n                  title=\"Text color\"\n                  currentColor={(ed.getAttributes('textStyle').color as string) ?? '#1f2328'}\n                  onPick={(c) => ed.chain().focus().setColor(c).run()}\n                  onClear={() => ed.chain().focus().unsetColor().run()}\n                />\n                <ColorButton\n                  title=\"Highlight color\"\n                  mode=\"highlight\"\n                  currentColor={(ed.getAttributes('highlight').color as string) ?? '#fff3a0'}\n                  onPick={(c) => ed.chain().focus().toggleHighlight({ color: c }).run()}\n                  onClear={() => ed.chain().focus().unsetHighlight().run()}\n                />\n              </ToolbarGroup>\n            </>\n          )}\n\n          {tab === 'insert' && (\n          <ToolbarGroup label=\"Insert\">\n            {templates && templates.length > 0 && onInsertTemplate && (\n              <TemplatePicker templates={templates} onSelect={onInsertTemplate} title=\"Insert template\" buttonLabel=\"Templates\" />\n            )}\n            {clauses && clauses.length > 0 && onInsertClause && (\n              <TemplatePicker\n                templates={clauses}\n                onSelect={onInsertClause}\n                title=\"Insert clause\"\n                buttonLabel=\"Clauses\"\n                searchPlaceholder=\"Search clauses…\"\n              />\n            )}\n            <ToolbarIconButton title=\"Insert link\" active={ed.isActive('link')} onClick={() => setLinkPromptOpen(true)}>\n              <LinkIcon />\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Insert image from URL\" onClick={() => setImagePromptOpen(true)}>\n              <ImageIcon />\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Upload image from file\" onClick={() => {\n              const input = document.createElement('input');\n              input.type = 'file';\n              input.accept = 'image/*';\n              input.onchange = async () => {\n                const file = input.files?.[0];\n                if (!file) return;\n                const reader = new FileReader();\n                reader.onload = () => ed.chain().focus().setImage({ src: reader.result as string }).run();\n                reader.readAsDataURL(file);\n              };\n              input.click();\n            }}>\n              <UploadIcon />\n            </ToolbarIconButton>\n            <TableSizePicker\n              title=\"Insert table\"\n              onInsert={(rows, cols) => insertTableFitted(ed, { rows, cols, withHeaderRow: true })}\n            />\n            <ToolbarIconButton title=\"Page break\" onClick={() => ed.chain().focus().insertPageBreak().run()}><PageBreakIcon /></ToolbarIconButton>\n            <ToolbarIconButton title=\"Horizontal rule\" onClick={() => ed.chain().focus().setHorizontalRule().run()}><HorizontalRuleIcon /></ToolbarIconButton>\n            <ToolbarIconButton title=\"Blockquote\" active={ed.isActive('blockquote')} onClick={() => ed.chain().focus().toggleBlockquote().run()}><QuoteIcon /></ToolbarIconButton>\n            <ToolbarIconButton title=\"Code block\" active={ed.isActive('codeBlock')} onClick={() => ed.chain().focus().toggleCodeBlock().run()}><CodeIcon /></ToolbarIconButton>\n            {extraItems?.map((item) => (\n              <ToolbarIconButton key={item.id} title={item.label} onClick={() => onExtraItemPress?.(item.id)}>\n                <span style={{ fontSize: 11, padding: '0 4px', whiteSpace: 'nowrap' }}>{item.label}</span>\n              </ToolbarIconButton>\n            ))}\n          </ToolbarGroup>\n        )}\n\n        {tab === 'table' && inTable && (\n          <ToolbarGroup label=\"Table\">\n            <ToolbarIconButton title=\"Add row above\" onClick={() => ed.chain().focus().addRowBefore().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"9\" width=\"18\" height=\"9\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"9\" y1=\"9\" x2=\"9\" y2=\"18\" /><line x1=\"15\" y1=\"9\" x2=\"15\" y2=\"18\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"7\" /><polyline points=\"9 4 12 7 15 4\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Add row below\" onClick={() => ed.chain().focus().addRowAfter().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"9\" /><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" /><line x1=\"9\" y1=\"6\" x2=\"9\" y2=\"15\" /><line x1=\"15\" y1=\"6\" x2=\"15\" y2=\"15\" /><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" /><polyline points=\"9 20 12 17 15 20\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Add column left\" onClick={() => ed.chain().focus().addColumnBefore().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"9\" y=\"3\" width=\"12\" height=\"18\" /><line x1=\"14\" y1=\"3\" x2=\"14\" y2=\"21\" /><line x1=\"9\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"9\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"3\" y1=\"12\" x2=\"7\" y2=\"12\" /><polyline points=\"4 9 7 12 4 15\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Add column right\" onClick={() => ed.chain().focus().addColumnAfter().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"12\" height=\"18\" /><line x1=\"10\" y1=\"3\" x2=\"10\" y2=\"21\" /><line x1=\"3\" y1=\"9\" x2=\"15\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"15\" y2=\"15\" /><line x1=\"17\" y1=\"12\" x2=\"21\" y2=\"12\" /><polyline points=\"20 9 17 12 20 15\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Delete row\" onClick={() => ed.chain().focus().deleteRow().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"9\" width=\"18\" height=\"6\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" stroke=\"red\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Delete column\" onClick={() => ed.chain().focus().deleteColumn().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"18\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" stroke=\"red\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Merge cells\" onClick={() => ed.chain().focus().mergeCells().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" strokeDasharray=\"2 2\" /><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" fill=\"currentColor\" fillOpacity=\"0.15\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Split cell\" onClick={() => ed.chain().focus().splitCell().run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Delete table\" onClick={() => ed.chain().focus().deleteTable().run()} style={{ color: 'red' }}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" /><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"21\" stroke=\"red\" /></svg>\n            </ToolbarIconButton>\n          </ToolbarGroup>\n        )}\n\n        {tab === 'image' && inImage && (\n          <ToolbarGroup label=\"Image\">\n            <ToolbarIconButton title=\"Align image left\" active={ed.getAttributes('image').alignment === 'left'} onClick={() => ed.chain().focus().setImageAlignment('left').run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Align image center\" active={ed.getAttributes('image').alignment === 'center'} onClick={() => ed.chain().focus().setImageAlignment('center').run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"8\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Align image right\" active={ed.getAttributes('image').alignment === 'right'} onClick={() => ed.chain().focus().setImageAlignment('right').run()}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"13\" y=\"4\" width=\"8\" height=\"6\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Float image left\" active={ed.getAttributes('image').wrap === 'left'} onClick={() => {\n              const cur = ed.getAttributes('image').wrap;\n              ed.chain().focus().setImageWrap(cur === 'left' ? 'none' : 'left').run();\n            }}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"4\" width=\"8\" height=\"8\" /><line x1=\"13\" y1=\"5\" x2=\"21\" y2=\"5\" /><line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"17\" x2=\"21\" y2=\"17\" /><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"20\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Float image right\" active={ed.getAttributes('image').wrap === 'right'} onClick={() => {\n              const cur = ed.getAttributes('image').wrap;\n              ed.chain().focus().setImageWrap(cur === 'right' ? 'none' : 'right').run();\n            }}>\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"13\" y=\"4\" width=\"8\" height=\"8\" /><line x1=\"3\" y1=\"5\" x2=\"11\" y2=\"5\" /><line x1=\"3\" y1=\"8\" x2=\"11\" y2=\"8\" /><line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" /><line x1=\"3\" y1=\"17\" x2=\"21\" y2=\"17\" /><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"20\" /></svg>\n            </ToolbarIconButton>\n            <ToolbarIconButton title=\"Image size: small\" onClick={() => ed.chain().focus().setImageSize('25%').run()}><span style={{ fontSize: 10 }}>S</span></ToolbarIconButton>\n            <ToolbarIconButton title=\"Image size: medium\" onClick={() => ed.chain().focus().setImageSize('50%').run()}><span style={{ fontSize: 12 }}>M</span></ToolbarIconButton>\n            <ToolbarIconButton title=\"Image size: large\" onClick={() => ed.chain().focus().setImageSize('100%').run()}><span style={{ fontSize: 14 }}>L</span></ToolbarIconButton>\n          </ToolbarGroup>\n        )}\n        </div>\n\n        {canScrollLeft && (\n          <div className=\"docx-editor-mobile-toolbar-scroll-hint docx-editor-mobile-toolbar-scroll-hint--left\" aria-hidden=\"true\" />\n        )}\n        {canScrollRight && (\n          <div className=\"docx-editor-mobile-toolbar-scroll-hint docx-editor-mobile-toolbar-scroll-hint--right\" aria-hidden=\"true\" />\n        )}\n      </div>\n\n      <PromptDialog\n        open={linkPromptOpen}\n        label=\"Link URL\"\n        defaultValue={(ed.getAttributes('link').href as string) ?? 'https://'}\n        onCancel={() => setLinkPromptOpen(false)}\n        onSubmit={submitLink}\n      />\n      <PromptDialog\n        open={imagePromptOpen}\n        label=\"Image URL\"\n        defaultValue=\"\"\n        onCancel={() => setImagePromptOpen(false)}\n        onSubmit={submitImageUrl}\n      />\n    </div>\n  );\n}\n","import * as React from 'react';\n\n/**\n * Tracks how much of the viewport is covered by an on-screen keyboard, via\n * `window.visualViewport`'s `resize`/`scroll` events — the gap between\n * `window.innerHeight` and `visualViewport.height` (plus any vertical\n * offset the viewport has scrolled) is roughly the keyboard's height.\n *\n * Used by `MobileToolbar`/`SelectionFormatBar` so they can stay pinned\n * above the keyboard instead of being covered by it — `visualViewport`\n * (not plain `resize`) is what actually reports keyboard overlays on\n * mobile Safari/Chrome and inside a React Native WebView.\n *\n * Returns 0 when no keyboard is showing, or when `visualViewport` isn't\n * available (SSR, older browsers) — callers should treat 0 as \"no inset,\n * lay out normally.\"\n */\nexport function useKeyboardInset(): number {\n  const [inset, setInset] = React.useState(0);\n\n  React.useEffect(() => {\n    if (typeof window === 'undefined' || !window.visualViewport) return;\n    const vv = window.visualViewport;\n\n    const update = () => {\n      const covered = window.innerHeight - vv.height - vv.offsetTop;\n      setInset(Math.max(0, Math.round(covered)));\n    };\n\n    update();\n    vv.addEventListener('resize', update);\n    vv.addEventListener('scroll', update);\n    return () => {\n      vv.removeEventListener('resize', update);\n      vv.removeEventListener('scroll', update);\n    };\n  }, []);\n\n  return inset;\n}\n","/**\n * SelectionFormatBar — a small floating Bold/Italic/Underline/color/link\n * bar that appears above the current text selection on mobile, the touch\n * replacement for \"select text, right-click to format\" (right-click has\n * no touch equivalent).\n *\n * Position is computed the same way `EditorContextMenuLayer` computes\n * selection-anchored menu/bubble positions: `editor.editor.view.coordsAtPos`\n * on the selection, wrapped in try/catch since coords can fail to resolve\n * mid-transaction.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { ToolbarIconButton, ColorButton } from '../ToolbarPrimitives';\nimport { LinkIcon, CommentIcon } from '../icons';\nimport { PromptDialog } from '../document-structure/PromptDialog';\nimport { useKeyboardInset } from './useKeyboardInset';\nimport type { SelectionContextInfo } from '../context-menu/EditorContextMenuLayer';\n\nexport interface SelectionFormatBarProps {\n  editor: DocxEditor;\n  /**\n   * Shows an \"Edit with AI\" (✨) button that opens the agent bubble scoped\n   * to the current selection — the mobile equivalent of desktop's\n   * right-click \"Edit with AI\" row (there's no right-click on touch).\n   * Omit to hide the button entirely — `ReactDocxEditor` only passes this\n   * when an `agent` adapter is configured.\n   */\n  onEditWithAI?: (info: SelectionContextInfo & { left: number; top: number }) => void;\n  /**\n   * Shows a \"Comment\" button that starts a new thread on the current\n   * selection. This is mobile's *only* selection-anchored comment\n   * affordance — `CommentsLayer`'s `CommentAddTrigger` is not rendered on\n   * mobile (see §2.3 \"one selection affordance\") so two floating buttons\n   * don't compete over the same selection on a small screen. Omit to hide\n   * the button — `ReactDocxEditor` only passes this when comments are\n   * enabled.\n   */\n  onAddComment?: () => void;\n}\n\nconst BAR_HEIGHT = 44;\nconst GAP = 8;\n\nexport function SelectionFormatBar({ editor, onEditWithAI, onAddComment }: SelectionFormatBarProps): React.ReactElement | null {\n  const ed = editor.editor;\n  const [, forceTick] = React.useState(0);\n  const [pos, setPos] = React.useState<{ left: number; top: number } | null>(null);\n  const [linkPromptOpen, setLinkPromptOpen] = React.useState(false);\n  const keyboardInset = useKeyboardInset();\n  const barRef = React.useRef<HTMLDivElement>(null);\n\n  React.useEffect(() => {\n    const update = () => {\n      const { selection } = ed.state;\n      if (selection.empty) {\n        setPos(null);\n        return;\n      }\n      try {\n        const coords = ed.view.coordsAtPos(selection.from);\n        setPos({ left: coords.left, top: coords.top });\n      } catch {\n        // Selection coords can fail to resolve mid-transaction (e.g. a\n        // selection spanning a node boundary) — just hide the bar rather\n        // than showing it somewhere wrong.\n        setPos(null);\n      }\n      forceTick((t) => t + 1);\n    };\n    ed.on('selectionUpdate', update);\n    ed.on('transaction', update);\n    update();\n    return () => {\n      ed.off('selectionUpdate', update);\n      ed.off('transaction', update);\n    };\n  }, [ed]);\n\n  if (!pos) return null;\n\n  const submitLink = (url: string) => {\n    setLinkPromptOpen(false);\n    if (url === '') ed.chain().focus().extendMarkRange('link').unsetLink().run();\n    else ed.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n  };\n\n  const handleEditWithAI = () => {\n    if (!onEditWithAI) return;\n    const { from, to } = ed.state.selection;\n    const text = ed.state.doc.textBetween(from, to, ' ');\n    const ctx = editor.getCursorContext();\n    try {\n      const coords = ed.view.coordsAtPos(to);\n      onEditWithAI({ text, page: ctx.page, totalPages: ctx.totalPages, line: ctx.line, totalLines: ctx.totalLines, left: coords.left, top: coords.bottom + 6 });\n    } catch {\n      onEditWithAI({ text, page: ctx.page, totalPages: ctx.totalPages, line: ctx.line, totalLines: ctx.totalLines, left: pos.left, top: pos.top });\n    }\n  };\n\n  // Clamp above the on-screen keyboard (if any) and never above the\n  // viewport's top edge.\n  const maxTop = window.innerHeight - keyboardInset - BAR_HEIGHT - GAP;\n  const top = Math.max(GAP, Math.min(pos.top - BAR_HEIGHT - GAP, maxTop));\n  // Clamp horizontally so the bar (its width varies with how many buttons\n  // are shown, e.g. the \"Edit with AI\" button only appearing when an agent\n  // is configured) never runs off the right edge of a narrow phone screen.\n  const barWidth = barRef.current?.offsetWidth ?? 0;\n  const left = Math.max(GAP, Math.min(pos.left, window.innerWidth - barWidth - GAP));\n\n  return (\n    <>\n      <div\n        ref={barRef}\n        className=\"docx-editor-selection-format-bar\"\n        style={{ position: 'fixed', left, top }}\n        role=\"toolbar\"\n        aria-label=\"Selection formatting\"\n      >\n        <ToolbarIconButton title=\"Bold\" active={ed.isActive('bold')} onClick={() => ed.chain().focus().toggleBold().run()} style={{ fontWeight: 800 }}>B</ToolbarIconButton>\n        <ToolbarIconButton title=\"Italic\" active={ed.isActive('italic')} onClick={() => ed.chain().focus().toggleItalic().run()} style={{ fontStyle: 'italic' }}>I</ToolbarIconButton>\n        <ToolbarIconButton title=\"Underline\" active={ed.isActive('underline')} onClick={() => ed.chain().focus().toggleUnderline().run()} style={{ textDecoration: 'underline' }}>U</ToolbarIconButton>\n        <ColorButton\n          title=\"Text color\"\n          currentColor={(ed.getAttributes('textStyle').color as string) ?? '#1f2328'}\n          onPick={(c) => ed.chain().focus().setColor(c).run()}\n          onClear={() => ed.chain().focus().unsetColor().run()}\n        />\n        <ToolbarIconButton title=\"Link\" active={ed.isActive('link')} onClick={() => setLinkPromptOpen(true)}>\n          <LinkIcon size={16} />\n        </ToolbarIconButton>\n        {onAddComment && (\n          <ToolbarIconButton title=\"Comment\" onClick={onAddComment}>\n            <CommentIcon size={16} />\n          </ToolbarIconButton>\n        )}\n        {onEditWithAI && (\n          <ToolbarIconButton title=\"Edit with AI\" onClick={handleEditWithAI}>\n            ✨\n          </ToolbarIconButton>\n        )}\n      </div>\n      <PromptDialog\n        open={linkPromptOpen}\n        label=\"Link URL\"\n        defaultValue={(ed.getAttributes('link').href as string) ?? 'https://'}\n        onCancel={() => setLinkPromptOpen(false)}\n        onSubmit={submitLink}\n      />\n    </>\n  );\n}\n","/**\n * StatusBar — the bottom bar showing word count, char count, and page info.\n *\n * Page count is calculated based on the number of pageBreak nodes in the\n * document (each pageBreak starts a new page, so page count = pageBreaks + 1).\n *\n * Exported so consumers can use it in custom layouts.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\n\nexport interface StatusBarProps {\n  editor: DocxEditor;\n}\n\nexport function StatusBar({ editor }: StatusBarProps): React.ReactElement {\n  const [stats, setStats] = React.useState({ words: 0, chars: 0, pages: 1 });\n\n  React.useEffect(() => {\n    const update = () => {\n      const text = editor.getText();\n      const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n\n      // Count pages: each pageBreak node starts a new page\n      let pageBreaks = 0;\n      const json = editor.getJSON();\n      if (json?.content && Array.isArray(json.content)) {\n        for (const block of json.content) {\n          if (block.type === 'pageBreak') pageBreaks++;\n        }\n      }\n      const pages = pageBreaks + 1;\n\n      setStats({ words, chars: text.length, pages });\n    };\n    update();\n    // Listen to both 'update' (user typing) and 'transaction' (programmatic changes from agent)\n    editor.editor.on('update', update);\n    editor.editor.on('transaction', update);\n    return () => {\n      editor.editor.off('update', update);\n      editor.editor.off('transaction', update);\n    };\n  }, [editor]);\n\n  return (\n    <div className=\"docx-editor-status-bar\">\n      <span>{stats.words} words · {stats.chars} chars</span>\n      <span>Page 1 of {stats.pages}</span>\n    </div>\n  );\n}\n","/**\n * table-attr-sync — re-applies the table-level attributes added in\n * `table-enhancements.ts` (`tableStyleId`, `borderStyle`, `tableAlign`,\n * `tableWidth`) onto the live `<table>` DOM element after every transaction,\n * and likewise re-applies the row-level `rowHeight` attribute onto each live\n * `<tr>` element.\n *\n * Why this is needed: with `resizable: true`, TipTap's `Table` node renders\n * through a custom ProseMirror `NodeView` (`TableView`) that builds the\n * `<table>`/`<colgroup>`/`<tbody>`/`<tr>`/`<td>` DOM itself and never calls\n * the node's `renderHTML` — so attributes added via the normal TipTap\n * `addAttributes().renderHTML()` mechanism are silently dropped from the\n * live editable view (they still round-trip correctly through\n * `getHTML()`/copy-paste, which does use the schema's DOM serializer).\n * `TableView.ignoreMutation` already tells ProseMirror to disregard\n * attribute changes on the `<table>` element (and its descendants), so this\n * can't fight with the editor's own reconciliation.\n *\n * Column width doesn't need this treatment because `colwidth` is a\n * prosemirror-tables *built-in* cell attribute — `TableView` itself reads it\n * to build the `<colgroup>`. `rowHeight` is a custom attribute added in\n * `table-enhancements.ts`, so — exactly like the table-level attributes\n * above — it needs to be synced onto the live `<tr>` by hand.\n */\nimport type { Editor } from '@tiptap/core';\n\nexport function attachTableAttrSync(editorEl: HTMLElement, ed: Editor): () => void {\n  let rafId: number | null = null;\n\n  function syncTableAttrs(): void {\n    const tables = editorEl.querySelectorAll('table');\n    tables.forEach((table) => {\n      const pos = ed.view.posAtDOM(table, 0);\n      if (pos == null || pos < 0) return;\n      let attrs: Record<string, any> | null = null;\n      try {\n        const $pos = ed.state.doc.resolve(pos);\n        for (let d = $pos.depth; d >= 0; d--) {\n          if ($pos.node(d).type.name === 'table') {\n            attrs = $pos.node(d).attrs as Record<string, any>;\n            break;\n          }\n        }\n      } catch {\n        // Position no longer valid mid-transaction; skip this pass.\n        return;\n      }\n      if (!attrs) return;\n\n      if (attrs.tableStyleId) table.setAttribute('data-table-style', attrs.tableStyleId);\n      else table.removeAttribute('data-table-style');\n\n      if (attrs.borderStyle) table.setAttribute('data-border-style', attrs.borderStyle);\n      else table.removeAttribute('data-border-style');\n\n      const align = attrs.tableAlign || 'left';\n      table.setAttribute('data-table-align', align);\n      table.style.marginLeft = align === 'left' ? '0' : 'auto';\n      table.style.marginRight = align === 'right' ? '0' : 'auto';\n\n      if (attrs.tableWidth) {\n        table.style.width = attrs.tableWidth;\n        table.style.minWidth = '';\n      }\n    });\n\n    syncRowHeights();\n  }\n\n  function syncRowHeights(): void {\n    const rows = editorEl.querySelectorAll('tr');\n    rows.forEach((row) => {\n      const rowHeight = getRowHeightForDomRow(row as HTMLTableRowElement);\n\n      applyRowHeight(row as HTMLTableRowElement, rowHeight ?? '');\n    });\n  }\n\n  function getRowHeightForDomRow(row: HTMLTableRowElement): string | null {\n    const table = row.closest('table');\n    if (!table) return null;\n\n    const rowIndex = Array.from(table.rows).indexOf(row);\n    if (rowIndex < 0) return null;\n\n    const pos = ed.view.posAtDOM(table, 0);\n    if (pos == null || pos < 0) return null;\n\n    try {\n      const $pos = ed.state.doc.resolve(pos);\n      for (let d = $pos.depth; d >= 0; d--) {\n        if ($pos.node(d).type.name !== 'table') continue;\n        if (rowIndex >= $pos.node(d).childCount) return null;\n        const rowNode = $pos.node(d).child(rowIndex);\n        return rowNode?.type.name === 'tableRow'\n          ? ((rowNode.attrs as Record<string, any>).rowHeight ?? null)\n          : null;\n      }\n    } catch {\n      // Position no longer valid mid-transaction; skip this row.\n    }\n    return null;\n  }\n\n  function applyRowHeight(row: HTMLTableRowElement, height: string): void {\n    const targetHeight = parseFloat(height) || 0;\n    const currentHeight = row.getBoundingClientRect().height;\n    const extra = targetHeight > 0 ? Math.max(0, targetHeight - currentHeight) : 0;\n\n    row.style.height = height;\n    row.style.minHeight = height;\n    for (const cell of Array.from(row.cells)) {\n      cell.style.height = height;\n      cell.style.minHeight = height;\n      if (height) {\n        const padding = getBaseCellPadding(cell);\n        cell.style.paddingTop = `${padding.top}px`;\n        cell.style.paddingBottom = `${padding.bottom + extra}px`;\n      } else {\n        delete cell.dataset.docxRowResizePaddingTop;\n        delete cell.dataset.docxRowResizePaddingBottom;\n        cell.style.paddingTop = '';\n        cell.style.paddingBottom = '';\n      }\n    }\n  }\n\n  function getBaseCellPadding(cell: HTMLTableCellElement): { top: number; bottom: number } {\n    const styles = getComputedStyle(cell);\n    const top = cell.dataset.docxRowResizePaddingTop ?? styles.paddingTop;\n    const bottom = cell.dataset.docxRowResizePaddingBottom ?? styles.paddingBottom;\n    cell.dataset.docxRowResizePaddingTop = top;\n    cell.dataset.docxRowResizePaddingBottom = bottom;\n    return {\n      top: parseFloat(top) || 0,\n      bottom: parseFloat(bottom) || 0,\n    };\n  }\n\n  function scheduleSync(): void {\n    if (rafId !== null) return;\n    rafId = requestAnimationFrame(() => {\n      rafId = null;\n      syncTableAttrs();\n    });\n  }\n\n  ed.on('transaction', scheduleSync);\n  scheduleSync(); // initial pass for tables present when content first loads\n\n  return () => {\n    ed.off('transaction', scheduleSync);\n    if (rafId !== null) cancelAnimationFrame(rafId);\n  };\n}\n","/**\n * table-hover-utils — shared helpers for the table interaction overlays\n * (`table-row-resize.ts`, `table-insert-buttons.ts`, `table-move-handle.ts`,\n * `table-selector-handles.ts`).\n *\n * All of these overlays render their handle/button elements as siblings of\n * the table (absolutely positioned on `.docx-editor-content`), often\n * slightly outside the table's own bounding box (e.g. the row-select handle\n * sits ~18px to the left of the table, the move grip ~8-26px above/left).\n * A plain `event.target.closest('table')` check goes cold the instant the\n * cursor leaves the table element on its way to one of those handles,\n * which hides the handle out from under the cursor before it can be\n * clicked/dragged — the exact \"can't reach it\" / \"hover and it disappears\"\n * bug this file exists to prevent.\n *\n * `findTableNear` fixes this two ways: it also treats the cursor as \"on the\n * table\" when it's within `margin` px of the table's rect (covering the gap\n * between the table edge and an outside handle), and callers additionally\n * special-case \"cursor is over our own handle element\" so the handle never\n * hides itself while being approached or held.\n */\n\n/** How far outside a table's bounding box the cursor can be while still\n * counting as \"hovering that table\" — must comfortably cover the largest\n * handle offset used by any of the overlays (the move grip sits ~26px\n * above the table). */\nexport const TABLE_HOVER_MARGIN = 36;\n\nexport function findTableNear(\n  editorEl: HTMLElement,\n  target: HTMLElement,\n  clientX: number,\n  clientY: number,\n  margin: number = TABLE_HOVER_MARGIN,\n): HTMLTableElement | null {\n  const direct = target.closest('table') as HTMLTableElement | null;\n  if (direct && editorEl.contains(direct)) return direct;\n\n  const tables = editorEl.querySelectorAll('table');\n  for (const table of Array.from(tables)) {\n    const r = table.getBoundingClientRect();\n    if (\n      clientX >= r.left - margin &&\n      clientX <= r.right + margin &&\n      clientY >= r.top - margin &&\n      clientY <= r.bottom + margin\n    ) {\n      return table;\n    }\n  }\n  return null;\n}\n","/**\n * table-row-resize — drag a row's bottom border to change its height.\n * prosemirror-tables only supports column resize natively; this adds the\n * row equivalent using the `rowHeight` attribute from table-enhancements.ts.\n */\nimport type { Editor } from '@tiptap/core';\nimport { findTableNear } from './table-hover-utils';\n\nexport function attachTableRowResize(editorEl: HTMLElement, ed: Editor): () => void {\n  const parent = editorEl.parentElement;\n  if (!parent) return () => {};\n\n  let bar: HTMLElement | null = null;\n  let target: HTMLTableRowElement | null = null;\n  let dragging = false;\n\n  function ensureBar(): HTMLElement {\n    if (bar) return bar;\n    bar = document.createElement('div');\n    bar.className = 'docx-table-row-resize-handle';\n    bar.style.cssText = 'position:absolute; display:none; z-index:15; cursor:row-resize; pointer-events:auto;';\n    bar.addEventListener('mousedown', onMouseDown, true);\n    parent!.appendChild(bar);\n    return bar;\n  }\n\n  function onMouseMove(e: MouseEvent): void {\n    if (dragging) return;\n    const targetEl = e.target as HTMLElement;\n    // Without this check, moving the cursor onto the bar itself (to click\n    // it) makes `closest('table')` return null (the bar is a sibling of\n    // the table, not a descendant), which used to call hide() right as the\n    // cursor arrived — hiding the bar out from under the pointer so the\n    // subsequent mousedown landed on the table cell instead of the bar,\n    // and dragging never engaged. See table-hover-utils.ts for the general\n    // version of this bug across all the table overlay handles.\n    if (bar && bar.contains(targetEl)) return;\n\n    const hovered = findTableNear(editorEl, targetEl, e.clientX, e.clientY);\n    if (!hovered) {\n      hide();\n      return;\n    }\n\n    const tableRect = hovered.getBoundingClientRect();\n    let bestRow: HTMLTableRowElement | null = null;\n    let bestDist = Infinity;\n    for (const row of Array.from(hovered.rows)) {\n      const r = row.getBoundingClientRect();\n      const dist = Math.abs(e.clientY - r.bottom);\n      if (dist < bestDist) {\n        bestDist = dist;\n        bestRow = row;\n      }\n    }\n\n    if (bestRow && bestDist <= 10 && e.clientX >= tableRect.left && e.clientX <= tableRect.right) {\n      const el2 = ensureBar();\n      const parentRect = parent!.getBoundingClientRect();\n      const r = bestRow.getBoundingClientRect();\n      target = bestRow;\n      el2.style.display = 'block';\n      el2.style.left = `${r.left - parentRect.left}px`;\n      el2.style.top = `${r.bottom - parentRect.top - 6}px`;\n      el2.style.width = `${r.width}px`;\n      el2.style.height = '12px';\n    } else {\n      hide();\n    }\n  }\n\n  function hide(): void {\n    target = null;\n    if (bar) bar.style.display = 'none';\n  }\n\n  function onMouseDown(e: MouseEvent): void {\n    const handleTarget = e.target as HTMLElement;\n    const table = findTableNear(editorEl, handleTarget, e.clientX, e.clientY);\n    if (!table) return;\n\n    let row: HTMLTableRowElement | null = target;\n    let rowPos: number | null = row ? findRowPos(ed, row) : null;\n    let bestDist = Infinity;\n    if (!row || rowPos == null) {\n      for (const candidate of Array.from(table.rows)) {\n        const r = candidate.getBoundingClientRect();\n        const dist = Math.abs(e.clientY - r.bottom);\n        if (dist < bestDist) {\n          bestDist = dist;\n          row = candidate;\n          rowPos = findRowPos(ed, candidate);\n        }\n      }\n    }\n    if (!row || rowPos == null) return;\n\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    e.stopPropagation();\n    dragging = true;\n    const startY = e.clientY;\n    const currentRow = getRowDom(ed, rowPos) ?? row;\n    const startHeight = currentRow.getBoundingClientRect().height;\n    const startCellPadding = getRowCellPadding(currentRow);\n\n    const onMove = (ev: MouseEvent) => {\n      const newHeight = Math.max(20, startHeight + (ev.clientY - startY));\n      const liveRow = getRowDom(ed, rowPos) ?? currentRow;\n      applyRowHeight(liveRow, newHeight, startCellPadding);\n      const parentRect = parent!.getBoundingClientRect();\n      const r = liveRow.getBoundingClientRect();\n      bar!.style.top = `${r.bottom - parentRect.top - 6}px`;\n      bar!.style.left = `${r.left - parentRect.left}px`;\n      bar!.style.width = `${r.width}px`;\n    };\n    const onUp = () => {\n      document.removeEventListener('mousemove', onMove);\n      document.removeEventListener('mouseup', onUp);\n      dragging = false;\n      const liveRow = getRowDom(ed, rowPos) ?? currentRow;\n      const height = `${Math.max(20, Math.round(liveRow.getBoundingClientRect().height))}px`;\n      applyRowHeight(liveRow, parseFloat(height), startCellPadding);\n      commitRowHeight(ed, rowPos, height);\n    };\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', onUp);\n  }\n\n  parent.addEventListener('mousemove', onMouseMove);\n  parent.addEventListener('mouseleave', hide);\n\n  return () => {\n    parent.removeEventListener('mousemove', onMouseMove);\n    parent.removeEventListener('mouseleave', hide);\n    bar?.remove();\n  };\n}\n\nfunction findRowPos(ed: Editor, row: HTMLTableRowElement): number | null {\n  const table = row.closest('table');\n  if (!table) return null;\n\n  const rowIndex = Array.from(table.rows).indexOf(row);\n  if (rowIndex < 0) return null;\n\n  const pos = ed.view.posAtDOM(table, 0);\n  if (pos == null || pos < 0) return null;\n\n  const $pos = ed.state.doc.resolve(pos);\n  for (let d = $pos.depth; d >= 0; d--) {\n    if ($pos.node(d).type.name === 'tableRow') {\n      return $pos.before(d);\n    }\n    if ($pos.node(d).type.name === 'table') {\n      let foundPos: number | null = null;\n      $pos.node(d).forEach((child, childOffset, index) => {\n        if (foundPos === null && child.type.name === 'tableRow' && index === rowIndex) {\n          foundPos = $pos.before(d) + 1 + childOffset;\n        }\n      });\n      return foundPos;\n    }\n  }\n  return null;\n}\n\nfunction getRowDom(ed: Editor, rowPos: number): HTMLTableRowElement | null {\n  const dom = ed.view.nodeDOM(rowPos);\n  return dom instanceof HTMLTableRowElement ? dom : null;\n}\n\nfunction commitRowHeight(ed: Editor, rowPos: number, height: string): void {\n  if (!height) return;\n  const node = ed.state.doc.nodeAt(rowPos);\n  if (!node || node.type.name !== 'tableRow') return;\n  const tr = ed.state.tr.setNodeMarkup(rowPos, undefined, { ...node.attrs, rowHeight: height });\n  ed.view.dispatch(tr);\n}\n\nfunction applyRowHeight(\n  row: HTMLTableRowElement,\n  heightPx: number,\n  originalPadding: Array<{ top: number; bottom: number }>,\n): void {\n  const height = `${heightPx}px`;\n  const currentHeight = row.getBoundingClientRect().height;\n  const extra = Math.max(0, heightPx - currentHeight);\n  row.style.height = height;\n  row.style.minHeight = height;\n  for (const cell of Array.from(row.cells)) {\n    cell.style.height = height;\n    cell.style.minHeight = height;\n    const index = cell.cellIndex;\n    const padding = originalPadding[index] ?? originalPadding[0] ?? { top: 0, bottom: 0 };\n    cell.style.paddingTop = `${padding.top}px`;\n    cell.style.paddingBottom = `${padding.bottom + extra}px`;\n  }\n}\n\nfunction getRowCellPadding(row: HTMLTableRowElement): Array<{ top: number; bottom: number }> {\n  return Array.from(row.cells).map((cell) => {\n    const styles = getComputedStyle(cell);\n    const top = cell.dataset.docxRowResizePaddingTop ?? styles.paddingTop;\n    const bottom = cell.dataset.docxRowResizePaddingBottom ?? styles.paddingBottom;\n    cell.dataset.docxRowResizePaddingTop = top;\n    cell.dataset.docxRowResizePaddingBottom = bottom;\n    return {\n      top: parseFloat(top) || 0,\n      bottom: parseFloat(bottom) || 0,\n    };\n  });\n}\n","/**\n * table-insert-buttons — Google-Docs-style hover \"+\" buttons to insert a\n * row above/below or a column left/right, positioned at the row/column\n * boundary nearest the cursor.\n */\nimport type { Editor } from '@tiptap/core';\nimport { findTableNear } from './table-hover-utils';\n\ninterface RowBoundary {\n  row: HTMLTableRowElement;\n  before: boolean;\n}\ninterface ColBoundary {\n  cell: HTMLTableCellElement;\n  before: boolean;\n}\n\nexport function attachTableInsertButtons(editorEl: HTMLElement, ed: Editor): () => void {\n  const parent = editorEl.parentElement;\n  if (!parent) return () => {};\n\n  let rowBtn: HTMLButtonElement | null = null;\n  let colBtn: HTMLButtonElement | null = null;\n  let rowBoundary: RowBoundary | null = null;\n  let colBoundary: ColBoundary | null = null;\n\n  function ensureButtons(): void {\n    if (rowBtn && colBtn) return;\n    rowBtn = document.createElement('button');\n    rowBtn.type = 'button';\n    rowBtn.className = 'docx-table-insert-btn docx-table-insert-row-btn';\n    rowBtn.textContent = '+';\n    rowBtn.title = 'Insert row';\n    rowBtn.style.display = 'none';\n    rowBtn.addEventListener('mousedown', (e) => e.preventDefault());\n    rowBtn.addEventListener('click', onInsertRow);\n    parent!.appendChild(rowBtn);\n\n    colBtn = document.createElement('button');\n    colBtn.type = 'button';\n    colBtn.className = 'docx-table-insert-btn docx-table-insert-col-btn';\n    colBtn.textContent = '+';\n    colBtn.title = 'Insert column';\n    colBtn.style.display = 'none';\n    colBtn.addEventListener('mousedown', (e) => e.preventDefault());\n    colBtn.addEventListener('click', onInsertCol);\n    parent!.appendChild(colBtn);\n  }\n\n  function onMouseMove(e: MouseEvent): void {\n    const target = e.target as HTMLElement;\n    if ((rowBtn && rowBtn.contains(target)) || (colBtn && colBtn.contains(target))) return;\n\n    // Margin-aware lookup: the +buttons sit ~22px outside the table, so a\n    // plain closest('table') check goes cold in that gap and hides the\n    // button right as the cursor tries to reach it.\n    const table = findTableNear(editorEl, target, e.clientX, e.clientY);\n    if (!table) {\n      hide();\n      return;\n    }\n    ensureButtons();\n    const parentRect = parent!.getBoundingClientRect();\n    const tableRect = table.getBoundingClientRect();\n    const rows = Array.from(table.rows);\n\n    let bestRow: HTMLTableRowElement | null = null;\n    let bestDist = Infinity;\n    for (const row of rows) {\n      const r = row.getBoundingClientRect();\n      const dist = Math.abs(e.clientY - r.bottom);\n      if (dist < bestDist) {\n        bestDist = dist;\n        bestRow = row;\n      }\n    }\n    if (bestRow) {\n      const r = bestRow.getBoundingClientRect();\n      const nearTop = Math.abs(e.clientY - r.top) < Math.abs(e.clientY - r.bottom);\n      rowBoundary = { row: bestRow, before: nearTop };\n      rowBtn!.style.display = 'flex';\n      rowBtn!.style.left = `${tableRect.left - parentRect.left - 22}px`;\n      rowBtn!.style.top = `${(nearTop ? r.top : r.bottom) - parentRect.top - 9}px`;\n    }\n\n    const firstRow = rows[0];\n    if (firstRow) {\n      let bestCell: HTMLTableCellElement | null = null;\n      let bestCDist = Infinity;\n      let nearLeftEdge = false;\n      for (const cell of Array.from(firstRow.cells)) {\n        const r = cell.getBoundingClientRect();\n        const dLeft = Math.abs(e.clientX - r.left);\n        const dRight = Math.abs(e.clientX - r.right);\n        if (dLeft < bestCDist) {\n          bestCDist = dLeft;\n          bestCell = cell;\n          nearLeftEdge = true;\n        }\n        if (dRight < bestCDist) {\n          bestCDist = dRight;\n          bestCell = cell;\n          nearLeftEdge = false;\n        }\n      }\n      if (bestCell) {\n        const r = bestCell.getBoundingClientRect();\n        colBoundary = { cell: bestCell, before: nearLeftEdge };\n        colBtn!.style.display = 'flex';\n        colBtn!.style.left = `${(nearLeftEdge ? r.left : r.right) - parentRect.left - 9}px`;\n        colBtn!.style.top = `${tableRect.top - parentRect.top - 22}px`;\n      }\n    }\n  }\n\n  function hide(): void {\n    rowBoundary = null;\n    colBoundary = null;\n    if (rowBtn) rowBtn.style.display = 'none';\n    if (colBtn) colBtn.style.display = 'none';\n  }\n\n  function onInsertRow(e: MouseEvent): void {\n    e.preventDefault();\n    e.stopPropagation();\n    if (!rowBoundary) return;\n    const pos = ed.view.posAtDOM(rowBoundary.row, 0);\n    if (pos == null || pos < 0) return;\n    const chain = ed.chain().focus().setTextSelection(pos);\n    (rowBoundary.before ? chain.addRowBefore() : chain.addRowAfter()).run();\n  }\n\n  function onInsertCol(e: MouseEvent): void {\n    e.preventDefault();\n    e.stopPropagation();\n    if (!colBoundary) return;\n    const pos = ed.view.posAtDOM(colBoundary.cell, 0);\n    if (pos == null || pos < 0) return;\n    const chain = ed.chain().focus().setTextSelection(pos);\n    (colBoundary.before ? chain.addColumnBefore() : chain.addColumnAfter()).run();\n  }\n\n  parent.addEventListener('mousemove', onMouseMove);\n  parent.addEventListener('mouseleave', hide);\n\n  return () => {\n    parent.removeEventListener('mousemove', onMouseMove);\n    parent.removeEventListener('mouseleave', hide);\n    rowBtn?.remove();\n    colBtn?.remove();\n  };\n}\n","/**\n * table-move-handle — the small \"⠿ Move table\" grip that appears above the\n * top-left corner of a table on hover (Google-Docs-style). Dragging it\n * relocates the whole table to a different position among its sibling\n * top-level blocks (paragraphs, headings, other tables, ...).\n */\nimport type { Editor } from '@tiptap/core';\nimport { findTableNear } from './table-hover-utils';\n\nexport function attachTableMoveHandle(editorEl: HTMLElement, ed: Editor): () => void {\n  const parent = editorEl.parentElement;\n  if (!parent) return () => {};\n\n  let grip: HTMLButtonElement | null = null;\n  let dropLine: HTMLElement | null = null;\n  let hoveredTable: HTMLTableElement | null = null;\n  let dragging = false;\n\n  function ensureUI(): void {\n    if (grip) return;\n    grip = document.createElement('button');\n    grip.type = 'button';\n    grip.className = 'docx-table-move-handle';\n    grip.title = 'Move table';\n    grip.textContent = '⠿';\n    grip.style.display = 'none';\n    grip.addEventListener('mousedown', onDragStart);\n    parent!.appendChild(grip);\n\n    dropLine = document.createElement('div');\n    dropLine.className = 'docx-table-drop-line';\n    dropLine.style.display = 'none';\n    parent!.appendChild(dropLine);\n  }\n\n  function positionGrip(table: HTMLTableElement): void {\n    ensureUI();\n    const parentRect = parent!.getBoundingClientRect();\n    const r = table.getBoundingClientRect();\n    grip!.style.display = 'flex';\n    grip!.style.left = `${r.left - parentRect.left - 8}px`;\n    grip!.style.top = `${r.top - parentRect.top - 26}px`;\n  }\n\n  function onMouseMove(e: MouseEvent): void {\n    if (dragging) return;\n    const target = e.target as HTMLElement;\n    if (grip && grip.contains(target)) return;\n\n    // Use a margin-aware lookup (not a plain closest('table')) so the grip\n    // stays visible while the cursor crosses the gap between the table's\n    // edge and the grip itself (positioned ~8-26px outside the table) —\n    // otherwise it vanishes right as the user tries to reach it.\n    const table = findTableNear(editorEl, target, e.clientX, e.clientY);\n    if (!table) {\n      hoveredTable = null;\n      if (grip) grip.style.display = 'none';\n      return;\n    }\n    hoveredTable = table;\n    positionGrip(table);\n  }\n\n  function onMouseLeave(): void {\n    if (dragging) return;\n    hoveredTable = null;\n    if (grip) grip.style.display = 'none';\n  }\n\n  function findTableRange(table: HTMLTableElement): { from: number; to: number; depth: number } | null {\n    const domPos = ed.view.posAtDOM(table, 0);\n    if (domPos == null || domPos < 0) return null;\n    const $pos = ed.state.doc.resolve(domPos);\n    for (let d = $pos.depth; d >= 0; d--) {\n      if ($pos.node(d).type.name === 'table') {\n        const from = $pos.before(d);\n        const to = from + $pos.node(d).nodeSize;\n        return { from, to, depth: d };\n      }\n    }\n    return null;\n  }\n\n  /** Find the top-level (depth-1, direct child of doc) boundary nearest to\n   * `clientY`, returning a document position to insert at. */\n  function nearestTopLevelBoundary(clientY: number): number {\n    const doc = ed.state.doc;\n    const candidates: Array<{ pos: number; y: number }> = [];\n    let offset = 0;\n    doc.forEach((node, off) => {\n      const dom = ed.view.nodeDOM(off) as HTMLElement | null;\n      if (dom && dom.getBoundingClientRect) {\n        const r = dom.getBoundingClientRect();\n        candidates.push({ pos: off, y: r.top });\n        candidates.push({ pos: off + node.nodeSize, y: r.bottom });\n      }\n      offset = off + node.nodeSize;\n    });\n    candidates.push({ pos: doc.content.size, y: offset > 0 ? Infinity : 0 });\n\n    let best = candidates[0] ?? { pos: doc.content.size, y: 0 };\n    let bestDist = Infinity;\n    for (const c of candidates) {\n      const dist = Math.abs(c.y - clientY);\n      if (dist < bestDist) {\n        bestDist = dist;\n        best = c;\n      }\n    }\n    return best.pos;\n  }\n\n  function showDropLine(pos: number): void {\n    if (!dropLine) return;\n    const coords = ed.view.coordsAtPos(Math.min(pos, ed.state.doc.content.size));\n    const parentRect = parent!.getBoundingClientRect();\n    dropLine.style.display = 'block';\n    dropLine.style.left = '0';\n    dropLine.style.right = '0';\n    dropLine.style.top = `${coords.top - parentRect.top}px`;\n  }\n\n  function onDragStart(e: MouseEvent): void {\n    if (!hoveredTable) return;\n    e.preventDefault();\n    e.stopPropagation();\n    const range = findTableRange(hoveredTable);\n    if (!range) return;\n    dragging = true;\n    let dropPos = range.from;\n\n    const onMove = (ev: MouseEvent) => {\n      dropPos = nearestTopLevelBoundary(ev.clientY);\n      showDropLine(dropPos);\n    };\n    const onUp = () => {\n      document.removeEventListener('mousemove', onMove);\n      document.removeEventListener('mouseup', onUp);\n      dragging = false;\n      if (dropLine) dropLine.style.display = 'none';\n      if (grip) grip.style.display = 'none';\n\n      // Dropping inside (or at the edges of) the table's own range is a no-op.\n      if (dropPos > range.from && dropPos < range.to) return;\n      if (dropPos === range.from || dropPos === range.to) return;\n\n      const slice = ed.state.doc.slice(range.from, range.to);\n      let tr = ed.state.tr.delete(range.from, range.to);\n      const mapped = tr.mapping.map(dropPos);\n      tr = tr.insert(mapped, slice.content);\n      ed.view.dispatch(tr);\n    };\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', onUp);\n  }\n\n  parent.addEventListener('mousemove', onMouseMove);\n  parent.addEventListener('mouseleave', onMouseLeave);\n\n  return () => {\n    parent.removeEventListener('mousemove', onMouseMove);\n    parent.removeEventListener('mouseleave', onMouseLeave);\n    grip?.remove();\n    dropLine?.remove();\n  };\n}\n","/**\n * table-selector-handles — Google-Docs-style row/column grip bars: hovering\n * the left edge of a row (or the top edge of a column) reveals a small bar;\n * clicking it selects the whole row/column (a prosemirror-tables\n * `CellSelection`). From there, the user can format the selection directly\n * (bold/color/etc. all apply across a `CellSelection`) or right-click for\n * the full row/column options in `TableContextMenu`.\n */\nimport type { Editor } from '@tiptap/core';\nimport { CellSelection } from '@tiptap/pm/tables';\nimport { findTableNear } from './table-hover-utils';\n\nexport function attachTableSelectorHandles(editorEl: HTMLElement, ed: Editor): () => void {\n  const parent = editorEl.parentElement;\n  if (!parent) return () => {};\n\n  let rowHandle: HTMLButtonElement | null = null;\n  let colHandle: HTMLButtonElement | null = null;\n  let hoveredRow: HTMLTableRowElement | null = null;\n  let hoveredCell: HTMLTableCellElement | null = null;\n\n  function ensureHandles(): void {\n    if (rowHandle && colHandle) return;\n    rowHandle = document.createElement('button');\n    rowHandle.type = 'button';\n    rowHandle.className = 'docx-table-row-handle';\n    rowHandle.title = 'Select row (right-click for row options)';\n    rowHandle.style.display = 'none';\n    rowHandle.addEventListener('mousedown', (e) => e.preventDefault());\n    rowHandle.addEventListener('click', onSelectRow);\n    parent!.appendChild(rowHandle);\n\n    colHandle = document.createElement('button');\n    colHandle.type = 'button';\n    colHandle.className = 'docx-table-col-handle';\n    colHandle.title = 'Select column (right-click for column options)';\n    colHandle.style.display = 'none';\n    colHandle.addEventListener('mousedown', (e) => e.preventDefault());\n    colHandle.addEventListener('click', onSelectColumn);\n    parent!.appendChild(colHandle);\n  }\n\n  function onMouseMove(e: MouseEvent): void {\n    const target = e.target as HTMLElement;\n    if ((rowHandle && rowHandle.contains(target)) || (colHandle && colHandle.contains(target))) return;\n\n    // Margin-aware lookup: the row/col handles sit ~14-18px outside the\n    // table, so a plain closest('table') check goes cold in that gap and\n    // hides the handle right as the cursor tries to reach it.\n    const table = findTableNear(editorEl, target, e.clientX, e.clientY);\n    if (!table) {\n      hide();\n      return;\n    }\n    ensureHandles();\n    const parentRect = parent!.getBoundingClientRect();\n    const tableRect = table.getBoundingClientRect();\n\n    // Row handle: shown when hovering near the table's left edge, aligned\n    // to the row under the cursor.\n    if (e.clientX - tableRect.left < 28) {\n      const row = (target.closest('tr') as HTMLTableRowElement | null) ?? nearestRowAtY(table, e.clientY);\n      if (row) {\n        hoveredRow = row;\n        const r = row.getBoundingClientRect();\n        rowHandle!.style.display = 'block';\n        rowHandle!.style.left = `${tableRect.left - parentRect.left - 18}px`;\n        rowHandle!.style.top = `${r.top - parentRect.top}px`;\n        rowHandle!.style.height = `${r.height}px`;\n      }\n    } else if (hoveredRow && !table.contains(hoveredRow)) {\n      hoveredRow = null;\n      rowHandle!.style.display = 'none';\n    }\n\n    // Column handle: shown when hovering near the table's top edge, aligned\n    // to the column under the cursor (using the first row's cells).\n    if (e.clientY - tableRect.top < 20) {\n      const firstRow = table.rows[0];\n      const cell = firstRow ? nearestCellAtX(firstRow, e.clientX) : null;\n      if (cell) {\n        hoveredCell = cell;\n        const r = cell.getBoundingClientRect();\n        colHandle!.style.display = 'block';\n        colHandle!.style.left = `${r.left - parentRect.left}px`;\n        colHandle!.style.top = `${tableRect.top - parentRect.top - 14}px`;\n        colHandle!.style.width = `${r.width}px`;\n      }\n    } else if (hoveredCell && !table.contains(hoveredCell)) {\n      hoveredCell = null;\n      colHandle!.style.display = 'none';\n    }\n  }\n\n  function nearestRowAtY(table: HTMLTableElement, y: number): HTMLTableRowElement | null {\n    let best: HTMLTableRowElement | null = null;\n    let bestDist = Infinity;\n    for (const row of Array.from(table.rows)) {\n      const r = row.getBoundingClientRect();\n      if (y >= r.top && y <= r.bottom) return row;\n      const dist = Math.min(Math.abs(y - r.top), Math.abs(y - r.bottom));\n      if (dist < bestDist) {\n        bestDist = dist;\n        best = row;\n      }\n    }\n    return best;\n  }\n\n  function nearestCellAtX(row: HTMLTableRowElement, x: number): HTMLTableCellElement | null {\n    let best: HTMLTableCellElement | null = null;\n    let bestDist = Infinity;\n    for (const cell of Array.from(row.cells)) {\n      const r = cell.getBoundingClientRect();\n      if (x >= r.left && x <= r.right) return cell;\n      const dist = Math.min(Math.abs(x - r.left), Math.abs(x - r.right));\n      if (dist < bestDist) {\n        bestDist = dist;\n        best = cell;\n      }\n    }\n    return best;\n  }\n\n  function hide(): void {\n    hoveredRow = null;\n    hoveredCell = null;\n    if (rowHandle) rowHandle.style.display = 'none';\n    if (colHandle) colHandle.style.display = 'none';\n  }\n\n  /**\n   * `CellSelection.rowSelection`/`colSelection` expect a `$anchorCell`\n   * resolved position whose `.pos` points AT the cell node itself (i.e. the\n   * position immediately before the cell's opening token, matching\n   * prosemirror-tables' internal `cellAround()` convention), so that\n   * `$anchorCell.node(-1)` is the `table` node and `$anchorCell.pos -\n   * tableStart` lines up with `TableMap`'s cell-offset bookkeeping.\n   * `posAtDOM(cell, 0)` gives the position just *inside* the cell (at the\n   * start of its content, one level too deep) — subtract 1 to land on the\n   * cell's own position instead.\n   */\n  function resolveCellAnchor(cell: HTMLTableCellElement) {\n    const pos = ed.view.posAtDOM(cell, 0);\n    if (pos == null || pos < 1) return null;\n    return ed.state.doc.resolve(pos - 1);\n  }\n\n  function onSelectRow(e: MouseEvent): void {\n    e.preventDefault();\n    if (!hoveredRow) return;\n    const firstCell = hoveredRow.cells[0];\n    if (!firstCell) return;\n    const $pos = resolveCellAnchor(firstCell);\n    if (!$pos) return;\n    const selection = CellSelection.rowSelection($pos);\n    ed.view.dispatch(ed.state.tr.setSelection(selection));\n    ed.view.focus();\n  }\n\n  function onSelectColumn(e: MouseEvent): void {\n    e.preventDefault();\n    if (!hoveredCell) return;\n    const $pos = resolveCellAnchor(hoveredCell);\n    if (!$pos) return;\n    const selection = CellSelection.colSelection($pos);\n    ed.view.dispatch(ed.state.tr.setSelection(selection));\n    ed.view.focus();\n  }\n\n  parent.addEventListener('mousemove', onMouseMove);\n  parent.addEventListener('mouseleave', hide);\n\n  return () => {\n    parent.removeEventListener('mousemove', onMouseMove);\n    parent.removeEventListener('mouseleave', hide);\n    rowHandle?.remove();\n    colHandle?.remove();\n  };\n}\n","/**\n * table-interactions — composes the small, focused table interaction\n * modules into a single attach/detach call for `ReactDocxEditor`:\n *\n *  - `table-attr-sync.ts` — re-applies table-level style/border/align/width\n *    attributes onto the live DOM (needed because of a Table NodeView quirk\n *    when `resizable: true` — see that file's header for details).\n *  - `table-row-resize.ts` — drag a row's bottom border to resize it\n *    (prosemirror-tables only supports column resize natively).\n *  - `table-insert-buttons.ts` — hover \"+\" buttons to insert a row/column\n *    at the boundary nearest the cursor.\n *  - `table-move-handle.ts` — the \"⠿ Move table\" grip to drag a whole table\n *    to a different position in the document.\n *  - `table-selector-handles.ts` — row/column grip bars that select the\n *    whole row/column on click (a `CellSelection`), Google-Docs-style.\n *\n * Column resizing itself needs no custom code — it's native\n * (prosemirror-tables' `columnResizing` plugin, enabled via\n * `resizable: true`). Cell drag-selection is also native (`tableEditing()`,\n * bundled inside the `Table` extension) — see the `.selectedCell` CSS rule.\n */\nimport type { Editor } from '@tiptap/core';\nimport { attachTableAttrSync } from './table-attr-sync';\nimport { attachTableRowResize } from './table-row-resize';\nimport { attachTableInsertButtons } from './table-insert-buttons';\nimport { attachTableMoveHandle } from './table-move-handle';\nimport { attachTableSelectorHandles } from './table-selector-handles';\n\n/**\n * Attach all table interactions to a mounted editor.\n *\n * @param editorEl The `.ProseMirror` element (same element passed to\n *   `attachImageResizeHandles`).\n * @param ed The underlying TipTap `Editor` instance (`docxEditor.editor`).\n * @returns Cleanup function.\n */\nexport function attachTableInteractions(editorEl: HTMLElement, ed: Editor): () => void {\n  const detachers = [\n    attachTableAttrSync(editorEl, ed),\n    attachTableRowResize(editorEl, ed),\n    attachTableInsertButtons(editorEl, ed),\n    attachTableMoveHandle(editorEl, ed),\n    attachTableSelectorHandles(editorEl, ed),\n  ];\n  return () => {\n    for (const detach of detachers) detach();\n  };\n}\n","import * as React from 'react';\n\nexport interface ZoomControlProps {\n  zoom: number; // 0.5 - 2.0\n  onChange: (zoom: number) => void;\n}\n\nexport function ZoomControl({ zoom, onChange }: ZoomControlProps): React.ReactElement {\n  const percent = Math.round(zoom * 100);\n  return (\n    <div style={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n      <button\n        type=\"button\"\n        onClick={() => onChange(Math.max(0.5, zoom - 0.1))}\n        disabled={zoom <= 0.5}\n        style={zoomBtnStyle}\n        title=\"Zoom out\"\n      >−</button>\n      <select\n        value={percent}\n        onChange={(e) => onChange(Number(e.target.value) / 100)}\n        style={{ ...zoomSelectStyle, minWidth: 60 }}\n      >\n        {[50, 75, 90, 100, 110, 125, 150, 175, 200].map((p) => (\n          <option key={p} value={p}>{p}%</option>\n        ))}\n      </select>\n      <button\n        type=\"button\"\n        onClick={() => onChange(Math.min(2.0, zoom + 0.1))}\n        disabled={zoom >= 2.0}\n        style={zoomBtnStyle}\n        title=\"Zoom in\"\n      >+</button>\n    </div>\n  );\n}\n\nconst zoomBtnStyle: React.CSSProperties = {\n  width: 24, height: 24, border: '1px solid #e5e7eb', background: '#fff',\n  borderRadius: 4, cursor: 'pointer', fontSize: 14, lineHeight: 1, color: '#57606a',\n};\nconst zoomSelectStyle: React.CSSProperties = {\n  height: 24, border: '1px solid #e5e7eb', background: '#fff', borderRadius: 4,\n  fontSize: 12, color: '#1f2328', outline: 'none', textAlign: 'center',\n};\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\n\n/** Floating \"Page X of Y\" badge shown briefly while scrolling. */\nexport interface PageIndicatorProps {\n  editor: DocxEditor;\n}\n\nexport function PageIndicator({ editor }: PageIndicatorProps): React.ReactElement {\n  const [visible, setVisible] = React.useState(false);\n  const [pageNum, setPageNum] = React.useState(1);\n  const [totalPages, setTotalPages] = React.useState(1);\n  const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  React.useEffect(() => {\n    const surface = editor.getSurface();\n    if (!surface) return;\n\n    const onScroll = () => {\n      // Calculate current page based on scroll position + page breaks\n      const json = editor.getJSON();\n      let pageBreaks = 0;\n      if (json?.content) {\n        for (const block of json.content) {\n          if (block.type === 'pageBreak') pageBreaks++;\n        }\n      }\n      setTotalPages(pageBreaks + 1);\n\n      // Approximate current page from scroll position\n      const pageHeight = parseInt(getComputedStyle(editor.getHost()!).getPropertyValue('--de-page-height') || '1056');\n      const scrollTop = surface.scrollTop;\n      const currentPage = Math.min(pageBreaks + 1, Math.floor(scrollTop / pageHeight) + 1);\n      setPageNum(currentPage);\n      setVisible(true);\n\n      if (timeoutRef.current) clearTimeout(timeoutRef.current);\n      timeoutRef.current = setTimeout(() => setVisible(false), 1500);\n    };\n\n    surface.addEventListener('scroll', onScroll);\n    return () => surface.removeEventListener('scroll', onScroll);\n  }, [editor]);\n\n  if (!visible) return <></>;\n\n  return (\n    <div style={{\n      position: 'absolute',\n      bottom: 16,\n      right: 16,\n      background: 'rgba(31, 35, 40, 0.85)',\n      color: '#fff',\n      fontSize: 12,\n      fontWeight: 500,\n      padding: '4px 10px',\n      borderRadius: 12,\n      zIndex: 100,\n      pointerEvents: 'none',\n      transition: 'opacity 200ms ease',\n    }}>\n      Page {pageNum} of {totalPages}\n    </div>\n  );\n}\n","import * as React from 'react';\n\nexport interface UnsavedIndicatorProps {\n  /** Whether there are unsaved changes. */\n  hasChanges: boolean;\n  /** Called when the user navigates away with unsaved changes (beforeunload). */\n  warnOnUnload?: boolean;\n  /** Style variant: 'dot' | 'text' | 'badge'. */\n  variant?: 'dot' | 'text' | 'badge';\n}\n\nexport function UnsavedIndicator({\n  hasChanges,\n  warnOnUnload = true,\n  variant = 'dot',\n}: UnsavedIndicatorProps): React.ReactElement | null {\n  React.useEffect(() => {\n    if (!hasChanges || !warnOnUnload) return;\n    const handler = (e: BeforeUnloadEvent) => {\n      e.preventDefault();\n      e.returnValue = '';\n    };\n    window.addEventListener('beforeunload', handler);\n    return () => window.removeEventListener('beforeunload', handler);\n  }, [hasChanges, warnOnUnload]);\n\n  if (!hasChanges) return null;\n\n  if (variant === 'text') {\n    return <span style={{ fontSize: 11, color: '#f59e0b' }}>● Unsaved</span>;\n  }\n  if (variant === 'badge') {\n    return (\n      <span style={{\n        fontSize: 10, color: '#fff', background: '#f59e0b',\n        padding: '2px 8px', borderRadius: 8, fontWeight: 500,\n      }}>Unsaved</span>\n    );\n  }\n  // dot\n  return (\n    <span style={{\n      display: 'inline-block',\n      width: 8, height: 8, borderRadius: '50%',\n      background: '#f59e0b',\n      animation: 'docx-editor-pulse 2s infinite',\n    }} />\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\n\n/** Ctrl+scroll to zoom hook. */\nexport function useWheelZoom(editor: DocxEditor | null, onZoomChange?: (zoom: number) => void): void {\n  React.useEffect(() => {\n    if (!editor) return;\n    const surface = editor.getSurface();\n    if (!surface) return;\n\n    let zoom = 1;\n    const onWheel = (e: WheelEvent) => {\n      if (!(e.ctrlKey || e.metaKey)) return;\n      e.preventDefault();\n      zoom = Math.max(0.5, Math.min(2.0, zoom + (e.deltaY < 0 ? 0.1 : -0.1)));\n      const page = editor.getPage();\n      page.style.transform = `scale(${zoom})`;\n      page.style.transformOrigin = 'top center';\n      onZoomChange?.(zoom);\n    };\n\n    surface.addEventListener('wheel', onWheel, { passive: false });\n    return () => surface.removeEventListener('wheel', onWheel);\n  }, [editor, onZoomChange]);\n}\n","import * as React from 'react';\n\n/** Wraps the editor to catch render errors. */\nexport interface ErrorBoundaryProps {\n  children: React.ReactNode;\n  fallback?: React.ReactNode | ((error: Error) => React.ReactNode);\n}\n\nexport interface ErrorBoundaryState {\n  hasError: boolean;\n  error: Error | null;\n}\n\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null };\n  }\n\n  static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, info: React.ErrorInfo): void {\n    console.error('[docx-editor] Error caught:', error, info);\n  }\n\n  render(): React.ReactNode {\n    if (this.state.hasError) {\n      if (this.props.fallback) {\n        return typeof this.props.fallback === 'function'\n          ? this.props.fallback(this.state.error!)\n          : this.props.fallback;\n      }\n      return (\n        <div style={{ padding: 24, textAlign: 'center', color: '#991b1b' }}>\n          <p style={{ fontWeight: 600, marginBottom: 8 }}>Editor Error</p>\n          <p style={{ fontSize: 13, fontFamily: 'monospace' }}>{this.state.error?.message}</p>\n          <button\n            onClick={() => this.setState({ hasError: false, error: null })}\n            style={{ marginTop: 12, padding: '6px 16px', border: '1px solid #d0d7de', borderRadius: 4, cursor: 'pointer' }}\n          >\n            Retry\n          </button>\n        </div>\n      );\n    }\n    return this.props.children;\n  }\n}\n","import * as React from 'react';\n\nexport interface KeyboardShortcut {\n  keys: string;\n  description: string;\n  category: string;\n}\n\nexport const DEFAULT_SHORTCUTS: KeyboardShortcut[] = [\n  { keys: 'Ctrl+B', description: 'Bold', category: 'Formatting' },\n  { keys: 'Ctrl+I', description: 'Italic', category: 'Formatting' },\n  { keys: 'Ctrl+U', description: 'Underline', category: 'Formatting' },\n  { keys: 'Ctrl+Shift+S', description: 'Strikethrough', category: 'Formatting' },\n  { keys: 'Ctrl+L', description: 'Align left', category: 'Formatting' },\n  { keys: 'Ctrl+E', description: 'Align center', category: 'Formatting' },\n  { keys: 'Ctrl+R', description: 'Align right', category: 'Formatting' },\n  { keys: 'Ctrl+J', description: 'Justify', category: 'Formatting' },\n  { keys: 'Ctrl+K', description: 'Insert link', category: 'Insert' },\n  { keys: 'Ctrl+Enter', description: 'Page break', category: 'Insert' },\n  { keys: 'Ctrl+Z', description: 'Undo', category: 'Editing' },\n  { keys: 'Ctrl+Y', description: 'Redo', category: 'Editing' },\n  { keys: 'Ctrl+S', description: 'Save', category: 'File' },\n  { keys: 'Ctrl+P', description: 'Print', category: 'File' },\n  { keys: 'Ctrl+Scroll', description: 'Zoom in/out', category: 'View' },\n];\n\nexport interface KeyboardShortcutsDialogProps {\n  open: boolean;\n  onClose: () => void;\n  shortcuts?: KeyboardShortcut[];\n}\n\nexport function KeyboardShortcutsDialog({\n  open, onClose, shortcuts = DEFAULT_SHORTCUTS,\n}: KeyboardShortcutsDialogProps): React.ReactElement | null {\n  if (!open) return null;\n\n  // Group by category\n  const categories = new Map<string, KeyboardShortcut[]>();\n  for (const s of shortcuts) {\n    if (!categories.has(s.category)) categories.set(s.category, []);\n    categories.get(s.category)!.push(s);\n  }\n\n  return (\n    <div onClick={onClose} style={overlayStyle}>\n      <div onClick={(e) => e.stopPropagation()} style={dialogStyle}>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>\n          <h2 style={{ fontSize: 16, fontWeight: 600, margin: 0 }}>Keyboard Shortcuts</h2>\n          <button onClick={onClose} style={closeBtnStyle}>✕</button>\n        </div>\n        <div style={{ maxHeight: 400, overflow: 'auto' }}>\n          {Array.from(categories.entries()).map(([cat, items]) => (\n            <div key={cat} style={{ marginBottom: 16 }}>\n              <div style={{ fontSize: 11, fontWeight: 600, textTransform: 'uppercase', color: '#6b7280', marginBottom: 6 }}>{cat}</div>\n              {items.map((s, i) => (\n                <div key={i} style={{ display: 'flex', justifyContent: 'space-between', padding: '4px 0', borderBottom: '1px solid #f3f4f6' }}>\n                  <span style={{ fontSize: 13, color: '#1f2328' }}>{s.description}</span>\n                  <kbd style={kbdStyle}>{s.keys}</kbd>\n                </div>\n              ))}\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nconst overlayStyle: React.CSSProperties = {\n  position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.4)', zIndex: 1000,\n  display: 'grid', placeItems: 'center',\n};\nconst dialogStyle: React.CSSProperties = {\n  background: '#fff', borderRadius: 12, padding: 24, width: 460, maxWidth: '90vw',\n  boxShadow: '0 8px 32px rgba(0,0,0,0.2)',\n};\nconst closeBtnStyle: React.CSSProperties = {\n  border: 'none', background: 'transparent', fontSize: 18, cursor: 'pointer', color: '#6b7280',\n};\nconst kbdStyle: React.CSSProperties = {\n  fontFamily: 'monospace', fontSize: 11, background: '#f3f4f6', border: '1px solid #d0d7de',\n  borderRadius: 4, padding: '2px 6px', color: '#374151',\n};\n","import * as React from 'react';\n\n/** Floating card shown when clicking a link, to view/edit/remove it. */\nexport interface HyperlinkPopupProps {\n  href: string;\n  text: string;\n  onEdit: (href: string) => void;\n  onRemove: () => void;\n  onClose: () => void;\n  /** Position { left, top } in viewport coordinates. */\n  position: { left: number; top: number };\n}\n\nexport function HyperlinkPopup({\n  href, text, onEdit, onRemove, onClose, position,\n}: HyperlinkPopupProps): React.ReactElement {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [editing, setEditing] = React.useState(false);\n  const [url, setUrl] = React.useState(href);\n\n  React.useEffect(() => {\n    const onDoc = (e: MouseEvent) => {\n      if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n    };\n    document.addEventListener('mousedown', onDoc);\n    return () => document.removeEventListener('mousedown', onDoc);\n  }, [onClose]);\n\n  return (\n    <div ref={ref} style={{\n      position: 'fixed', left: position.left, top: position.top, zIndex: 1000,\n      background: '#fff', border: '1px solid #d0d7de', borderRadius: 8,\n      boxShadow: '0 4px 16px rgba(0,0,0,0.12)', padding: 8, minWidth: 240,\n    }}>\n      {editing ? (\n        <div style={{ display: 'flex', gap: 4 }}>\n          <input\n            type=\"text\" value={url} onChange={(e) => setUrl(e.target.value)}\n            style={{ flex: 1, fontSize: 13, border: '1px solid #d0d7de', borderRadius: 4, padding: '4px 8px', outline: 'none' }}\n            autoFocus\n          />\n          <button onClick={() => { onEdit(url); setEditing(false); onClose(); }}\n            style={{ padding: '4px 8px', fontSize: 12, background: '#2563eb', color: '#fff', border: 'none', borderRadius: 4, cursor: 'pointer' }}>\n            Save\n          </button>\n        </div>\n      ) : (\n        <>\n          <div style={{ fontSize: 12, color: '#2563eb', marginBottom: 6, wordBreak: 'break-all', fontFamily: 'monospace' }}>\n            {href}\n          </div>\n          <div style={{ display: 'flex', gap: 4 }}>\n            <a href={href} target=\"_blank\" rel=\"noopener noreferrer\"\n              style={popupBtnStyle}>\n              Open\n            </a>\n            <button onClick={() => navigator.clipboard?.writeText(href)}\n              style={popupBtnStyle}>\n              Copy\n            </button>\n            <button onClick={() => setEditing(true)}\n              style={popupBtnStyle}>\n              Edit\n            </button>\n            <button onClick={() => { onRemove(); onClose(); }}\n              style={{ ...popupBtnStyle, color: '#dc2626' }}>\n              Unlink\n            </button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n\nconst popupBtnStyle: React.CSSProperties = {\n  padding: '3px 8px', fontSize: 12, border: '1px solid #e5e7eb', background: '#fff',\n  borderRadius: 4, cursor: 'pointer', textDecoration: 'none', color: '#374151',\n  display: 'inline-block',\n};\n","import * as React from 'react';\n\n/** Generic right-click menu. */\nexport interface ContextMenuItem {\n  label: string;\n  icon?: React.ReactNode;\n  onClick: () => void;\n  disabled?: boolean;\n  separator?: boolean;\n}\n\nexport interface ContextMenuProps {\n  items: ContextMenuItem[];\n  position: { left: number; top: number };\n  onClose: () => void;\n}\n\nexport function ContextMenu({ items, position, onClose }: ContextMenuProps): React.ReactElement {\n  const ref = React.useRef<HTMLDivElement>(null);\n\n  React.useEffect(() => {\n    const onDoc = (e: MouseEvent) => {\n      if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n    };\n    document.addEventListener('mousedown', onDoc);\n    document.addEventListener('contextmenu', onDoc);\n    return () => {\n      document.removeEventListener('mousedown', onDoc);\n      document.removeEventListener('contextmenu', onDoc);\n    };\n  }, [onClose]);\n\n  return (\n    <div ref={ref} style={{\n      position: 'fixed', left: position.left, top: position.top, zIndex: 1000,\n      background: '#fff', border: '1px solid #d0d7de', borderRadius: 8,\n      boxShadow: '0 4px 16px rgba(0,0,0,0.12)', padding: 4, minWidth: 180,\n    }}>\n      {items.map((item, i) => (\n        item.separator ? (\n          <div key={i} style={{ height: 1, background: '#e5e7eb', margin: '4px 0' }} />\n        ) : (\n          <button key={i} onClick={() => { item.onClick(); onClose(); }} disabled={item.disabled}\n            style={{\n              display: 'flex', alignItems: 'center', gap: 8, width: '100%',\n              padding: '6px 10px', border: 'none', background: 'transparent',\n              fontSize: 13, color: item.disabled ? '#cbd5e1' : '#1f2328',\n              cursor: item.disabled ? 'default' : 'pointer', borderRadius: 4,\n              textAlign: 'left',\n            }}\n            onMouseEnter={(e) => { if (!item.disabled) e.currentTarget.style.background = '#f3f4f6'; }}\n            onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}\n          >\n            {item.icon} {item.label}\n          </button>\n        )\n      ))}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { ContextMenu, type ContextMenuItem } from './ContextMenu';\n\n/** Pre-built right-click menu for text selections. */\nexport interface TextContextMenuProps {\n  editor: DocxEditor;\n  position: { left: number; top: number };\n  onClose: () => void;\n}\n\nexport function TextContextMenu({ editor, position, onClose }: TextContextMenuProps): React.ReactElement {\n  const ed = editor.editor;\n  const inTable = ed.isActive('table');\n\n  const items: ContextMenuItem[] = [\n    { label: 'Cut', onClick: () => document.execCommand('cut') },\n    { label: 'Copy', onClick: () => document.execCommand('copy') },\n    { label: 'Paste', onClick: () => document.execCommand('paste') },\n    { separator: true, label: '', onClick: () => {} },\n    { label: 'Bold', onClick: () => ed.chain().focus().toggleBold().run() },\n    { label: 'Italic', onClick: () => ed.chain().focus().toggleItalic().run() },\n    { label: 'Underline', onClick: () => ed.chain().focus().toggleUnderline().run() },\n    { label: 'Strikethrough', onClick: () => ed.chain().focus().toggleStrike().run() },\n    { separator: true, label: '', onClick: () => {} },\n    { label: 'Insert Link', onClick: () => {\n      const url = window.prompt('Link URL');\n      if (url) ed.chain().focus().setLink({ href: url }).run();\n    }},\n  ];\n\n  if (inTable) {\n    items.push(\n      { separator: true, label: '', onClick: () => {} },\n      { label: 'Add Row Above', onClick: () => ed.chain().focus().addRowBefore().run() },\n      { label: 'Add Row Below', onClick: () => ed.chain().focus().addRowAfter().run() },\n      { label: 'Delete Row', onClick: () => ed.chain().focus().deleteRow().run() },\n      { label: 'Delete Table', onClick: () => ed.chain().focus().deleteTable().run() },\n    );\n  }\n\n  return <ContextMenu items={items} position={position} onClose={onClose} />;\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { ContextMenu, type ContextMenuItem } from './ContextMenu';\n\n/** Pre-built right-click menu for images. */\nexport interface ImageContextMenuProps {\n  editor: DocxEditor;\n  position: { left: number; top: number };\n  onClose: () => void;\n}\n\nexport function ImageContextMenu({ editor, position, onClose }: ImageContextMenuProps): React.ReactElement {\n  const ed = editor.editor;\n  const items: ContextMenuItem[] = [\n    { label: 'Align Left', onClick: () => ed.chain().focus().setImageAlignment('left').run() },\n    { label: 'Align Center', onClick: () => ed.chain().focus().setImageAlignment('center').run() },\n    { label: 'Align Right', onClick: () => ed.chain().focus().setImageAlignment('right').run() },\n    { separator: true, label: '', onClick: () => {} },\n    { label: 'Float Left', onClick: () => ed.chain().focus().setImageWrap('left').run() },\n    { label: 'Float Right', onClick: () => ed.chain().focus().setImageWrap('right').run() },\n    { label: 'No Wrap', onClick: () => ed.chain().focus().setImageWrap('none').run() },\n    { separator: true, label: '', onClick: () => {} },\n    { label: 'Size: Small', onClick: () => ed.chain().focus().setImageSize('25%').run() },\n    { label: 'Size: Medium', onClick: () => ed.chain().focus().setImageSize('50%').run() },\n    { label: 'Size: Large', onClick: () => ed.chain().focus().setImageSize('100%').run() },\n    { separator: true, label: '', onClick: () => {} },\n    { label: 'Delete Image', onClick: () => {\n      const { state } = ed.view;\n      const tr = state.tr.deleteSelection();\n      ed.view.dispatch(tr);\n    }},\n  ];\n  return <ContextMenu items={items} position={position} onClose={onClose} />;\n}\n","import * as React from 'react';\n\n/** Positions a floating panel at `raw`, then nudges it back on-screen once\n * its real size is known (so menus near the edge of the window don't get\n * clipped). */\nexport function useClampedPosition(raw: { left: number; top: number }) {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [pos, setPos] = React.useState(raw);\n\n  React.useLayoutEffect(() => {\n    setPos(raw);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [raw.left, raw.top]);\n\n  React.useLayoutEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const rect = el.getBoundingClientRect();\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n    let left = raw.left;\n    let top = raw.top;\n    if (left + rect.width > vw - 8) left = Math.max(8, vw - rect.width - 8);\n    if (top + rect.height > vh - 8) top = Math.max(8, vh - rect.height - 8);\n    if (left !== pos.left || top !== pos.top) setPos({ left, top });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  });\n\n  return { ref, pos };\n}\n","import * as React from 'react';\n\n/** Closes a floating panel on outside click, right-click elsewhere, or scroll. */\nexport function useCloseOnOutside(ref: React.RefObject<HTMLElement>, onClose: () => void) {\n  React.useEffect(() => {\n    const onDoc = (e: Event) => {\n      if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n    };\n    document.addEventListener('mousedown', onDoc);\n    document.addEventListener('contextmenu', onDoc);\n    document.addEventListener('scroll', onClose, true);\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose();\n    };\n    document.addEventListener('keydown', onKey);\n    return () => {\n      document.removeEventListener('mousedown', onDoc);\n      document.removeEventListener('contextmenu', onDoc);\n      document.removeEventListener('scroll', onClose, true);\n      document.removeEventListener('keydown', onKey);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [onClose]);\n}\n","import * as React from 'react';\n\nexport const menuStyle: React.CSSProperties = {\n  position: 'fixed',\n  zIndex: 1000,\n  background: '#fff',\n  border: '1px solid #d0d7de',\n  borderRadius: 8,\n  boxShadow: '0 8px 24px rgba(0,0,0,0.16)',\n  padding: 4,\n  minWidth: 220,\n  maxWidth: 260,\n  fontSize: 13,\n  color: '#1f2328',\n  userSelect: 'none',\n};\n","import * as React from 'react';\n\nexport interface MenuRowProps {\n  label: string;\n  icon?: React.ReactNode;\n  shortcut?: string;\n  active?: boolean;\n  disabled?: boolean;\n  danger?: boolean;\n  onClick: () => void;\n}\n\nexport function MenuRow({\n  label,\n  icon,\n  shortcut,\n  active,\n  disabled,\n  danger,\n  onClick,\n}: MenuRowProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      disabled={disabled}\n      onClick={onClick}\n      style={{\n        display: 'flex',\n        alignItems: 'center',\n        gap: 8,\n        width: '100%',\n        padding: '6px 10px',\n        border: 'none',\n        background: active ? '#eef2ff' : 'transparent',\n        fontSize: 13,\n        color: disabled ? '#cbd5e1' : danger ? '#dc2626' : '#1f2328',\n        cursor: disabled ? 'default' : 'pointer',\n        borderRadius: 4,\n        textAlign: 'left',\n      }}\n      onMouseEnter={(e) => {\n        if (!disabled) e.currentTarget.style.background = active ? '#e0e7ff' : '#f3f4f6';\n      }}\n      onMouseLeave={(e) => {\n        e.currentTarget.style.background = active ? '#eef2ff' : 'transparent';\n      }}\n    >\n      <span style={{ width: 16, display: 'inline-flex', justifyContent: 'center', flexShrink: 0 }}>{icon}</span>\n      <span style={{ flex: 1 }}>{label}</span>\n      {shortcut && <span style={{ fontSize: 11, color: '#9ca3af' }}>{shortcut}</span>}\n    </button>\n  );\n}\n","import * as React from 'react';\n\nexport function MenuDivider(): React.ReactElement {\n  return <div style={{ height: 1, background: '#e5e7eb', margin: '4px 0' }} />;\n}\n","import * as React from 'react';\nimport type { Editor } from '@tiptap/core';\n\n/** Inline bold/italic/underline/strike/sup/sub row. */\nexport function FormatIconRow({ ed }: { ed: Editor }): React.ReactElement {\n  const btn = (\n    key: string,\n    label: React.ReactNode,\n    active: boolean,\n    onClick: () => void,\n    title: string,\n    style?: React.CSSProperties,\n  ) => (\n    <button\n      key={key}\n      type=\"button\"\n      title={title}\n      onClick={onClick}\n      style={{\n        flex: 1,\n        height: 30,\n        border: 'none',\n        borderRadius: 4,\n        cursor: 'pointer',\n        background: active ? '#e0e7ff' : 'transparent',\n        fontSize: 13,\n        color: '#1f2328',\n        ...style,\n      }}\n      onMouseEnter={(e) => {\n        if (!active) e.currentTarget.style.background = '#f3f4f6';\n      }}\n      onMouseLeave={(e) => {\n        e.currentTarget.style.background = active ? '#e0e7ff' : 'transparent';\n      }}\n    >\n      {label}\n    </button>\n  );\n\n  return (\n    <div style={{ display: 'flex', gap: 2, padding: '2px 6px 6px' }}>\n      {btn('bold', 'B', ed.isActive('bold'), () => ed.chain().focus().toggleBold().run(), 'Bold (Ctrl+B)', { fontWeight: 700 })}\n      {btn('italic', 'I', ed.isActive('italic'), () => ed.chain().focus().toggleItalic().run(), 'Italic (Ctrl+I)', { fontStyle: 'italic' })}\n      {btn('underline', 'U', ed.isActive('underline'), () => ed.chain().focus().toggleUnderline().run(), 'Underline (Ctrl+U)', { textDecoration: 'underline' })}\n      {btn('strike', 'S', ed.isActive('strike'), () => ed.chain().focus().toggleStrike().run(), 'Strikethrough', { textDecoration: 'line-through' })}\n      {btn('sup', 'x²', ed.isActive('superscript'), () => ed.chain().focus().toggleSuperscript().run(), 'Superscript')}\n      {btn('sub', 'x₂', ed.isActive('subscript'), () => ed.chain().focus().toggleSubscript().run(), 'Subscript')}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { currentFontSize } from '../../helpers';\nimport { COMMON_FONT_SIZES } from '../../../extensions/builtins/tiptap-defaults';\n\nconst stepBtnStyle: React.CSSProperties = {\n  width: 22,\n  height: 22,\n  border: '1px solid #e5e7eb',\n  background: '#fff',\n  borderRadius: 4,\n  cursor: 'pointer',\n  fontSize: 14,\n  lineHeight: 1,\n  color: '#374151',\n};\n\nexport function FontSizeRow({ ed }: { ed: Editor }): React.ReactElement {\n  const px = parseFloat(currentFontSize(ed)) || 11 * 1.333;\n  const pt = Math.round(px / 1.333);\n\n  const setPt = (newPt: number) => {\n    const clamped = Math.max(6, Math.min(96, newPt));\n    ed.chain().focus().setMark('textStyle', { fontSize: `${(clamped * 1.333).toFixed(2)}px` }).run();\n  };\n\n  const dec = () => {\n    const smaller = [...COMMON_FONT_SIZES].reverse().find((s) => s < pt);\n    setPt(smaller ?? Math.max(6, pt - 1));\n  };\n  const inc = () => {\n    const larger = COMMON_FONT_SIZES.find((s) => s > pt);\n    setPt(larger ?? pt + 1);\n  };\n\n  return (\n    <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 10px 8px' }}>\n      <span style={{ fontSize: 11, color: '#6b7280', flex: 1 }}>Font size</span>\n      <button type=\"button\" onClick={dec} style={stepBtnStyle} title=\"Decrease font size\">\n        −\n      </button>\n      <span style={{ width: 26, textAlign: 'center', fontSize: 13 }}>{pt}</span>\n      <button type=\"button\" onClick={inc} style={stepBtnStyle} title=\"Increase font size\">\n        +\n      </button>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { Editor } from '@tiptap/core';\n\nexport const SWATCHES = [\n  '#000000', '#434343', '#666666', '#999999', '#cccccc', '#ffffff',\n  '#a61c00', '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e',\n  '#3c78d8', '#3d85c6', '#674ea7', '#a64d79', '#4a86e8', '#ff00ff',\n];\n\nexport function ColorRow({ ed, mode }: { ed: Editor; mode: 'text' | 'highlight' }): React.ReactElement {\n  const apply = (c: string) =>\n    mode === 'text'\n      ? ed.chain().focus().setColor(c).run()\n      : ed.chain().focus().toggleHighlight({ color: c }).run();\n  const clear = () =>\n    mode === 'text' ? ed.chain().focus().unsetColor().run() : ed.chain().focus().unsetHighlight().run();\n\n  return (\n    <div style={{ padding: '4px 10px 8px' }}>\n      <div style={{ fontSize: 11, color: '#6b7280', marginBottom: 4 }}>\n        {mode === 'text' ? 'Text color' : 'Highlight color'}\n      </div>\n      <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n        {SWATCHES.map((c) => (\n          <button\n            key={c}\n            type=\"button\"\n            title={c}\n            onClick={() => apply(c)}\n            style={{\n              width: 18,\n              height: 18,\n              borderRadius: '50%',\n              border: '1px solid #d0d7de',\n              background: c,\n              cursor: 'pointer',\n              padding: 0,\n            }}\n          />\n        ))}\n        <button\n          type=\"button\"\n          title=\"Clear\"\n          onClick={clear}\n          style={{\n            width: 18,\n            height: 18,\n            borderRadius: '50%',\n            border: '1px solid #d0d7de',\n            background: '#fff',\n            cursor: 'pointer',\n            fontSize: 11,\n            lineHeight: '16px',\n            color: '#6b7280',\n          }}\n        >\n          ×\n        </button>\n      </div>\n    </div>\n  );\n}\n","/**\n * SelectionContextMenu — right-click menu shown when the user has selected\n * text: lets them customize the selection (bold/italic/underline/strike/\n * sub/sup, font size, text/highlight color), add or edit a link, and clear\n * formatting.\n *\n * When the selection is inside a table, `EditorContextMenuLayer` shows\n * `TableContextMenu` instead of this one.\n */\nimport * as React from 'react';\nimport { getMarkRange } from '@tiptap/core';\nimport type { DocxEditor } from '../../editor';\nimport {\n  menuStyle,\n  MenuRow,\n  MenuDivider,\n  FormatIconRow,\n  FontSizeRow,\n  ColorRow,\n  useClampedPosition,\n  useCloseOnOutside,\n} from './menuPrimitives';\nimport type { LinkDialogRequest } from './LinkDialog';\n\nexport interface SelectionContextMenuProps {\n  editor: DocxEditor;\n  position: { left: number; top: number };\n  onClose: () => void;\n  onOpenLinkDialog: (request: LinkDialogRequest) => void;\n  /** Shows an \"Edit with AI\" row that opens the agent bubble scoped to the current selection. Omitted (row hidden) when no `agent` adapter is configured on `ReactDocxEditor`. */\n  onEditWithAI?: (selectedText: string) => void;\n  /** Shows an \"Add to agent\" row that hands the current selection to the host app's agent sidebar. Omitted (row hidden) when `onAddSelectionToAgent` isn't passed to `ReactDocxEditor`. */\n  onAddToAgent?: (selectedText: string) => void;\n}\n\nexport function SelectionContextMenu({ editor, position, onClose, onOpenLinkDialog, onEditWithAI, onAddToAgent }: SelectionContextMenuProps): React.ReactElement {\n  const ed = editor.editor;\n  const { ref, pos } = useClampedPosition(position);\n  useCloseOnOutside(ref, onClose);\n\n  const isLink = ed.isActive('link');\n  const { from, to } = ed.state.selection;\n  const selectedText = ed.state.doc.textBetween(from, to, ' ');\n\n  const handleLink = () => {\n    if (isLink) {\n      const range = getMarkRange(ed.state.selection.$from, ed.state.schema.marks.link);\n      const href = (ed.getAttributes('link').href as string) || '';\n      const linkRange = range ?? { from, to };\n      const text = ed.state.doc.textBetween(linkRange.from, linkRange.to) || selectedText;\n      onOpenLinkDialog({ range: linkRange, text, url: href, isEditing: true });\n    } else {\n      onOpenLinkDialog({ range: { from, to }, text: selectedText, url: '', isEditing: false });\n    }\n    onClose();\n  };\n\n  return (\n    <div ref={ref} style={{ ...menuStyle, left: pos.left, top: pos.top }}>\n      <MenuRow label=\"Cut\" icon=\"✂\" shortcut=\"Ctrl+X\" onClick={() => { document.execCommand('cut'); onClose(); }} />\n      <MenuRow label=\"Copy\" icon=\"⧉\" shortcut=\"Ctrl+C\" onClick={() => { document.execCommand('copy'); onClose(); }} />\n      <MenuRow label=\"Paste\" icon=\"📋\" shortcut=\"Ctrl+V\" onClick={() => { document.execCommand('paste'); onClose(); }} />\n      {(onEditWithAI || onAddToAgent) && (\n        <>\n          <MenuDivider />\n          {onEditWithAI && (\n            <MenuRow label=\"Edit with AI\" icon=\"✨\" onClick={() => { onEditWithAI(selectedText); onClose(); }} />\n          )}\n          {onAddToAgent && (\n            <MenuRow label=\"Add to agent\" icon=\"💬\" onClick={() => { onAddToAgent(selectedText); onClose(); }} />\n          )}\n        </>\n      )}\n      <MenuDivider />\n      <FormatIconRow ed={ed} />\n      <FontSizeRow ed={ed} />\n      <MenuDivider />\n      <ColorRow ed={ed} mode=\"text\" />\n      <ColorRow ed={ed} mode=\"highlight\" />\n      <MenuDivider />\n      <MenuRow label={isLink ? 'Edit link' : 'Add link'} icon=\"🔗\" shortcut=\"Ctrl+K\" onClick={handleLink} />\n      {isLink && (\n        <MenuRow\n          label=\"Remove link\"\n          icon=\"🚫\"\n          danger\n          onClick={() => { ed.chain().focus().extendMarkRange('link').unsetLink().run(); onClose(); }}\n        />\n      )}\n      <MenuDivider />\n      <MenuRow\n        label=\"Clear formatting\"\n        icon=\"⌫\"\n        onClick={() => { ed.chain().focus().unsetAllMarks().run(); onClose(); }}\n      />\n    </div>\n  );\n}\n","/**\n * PageContextMenu — right-click menu shown when there's no selection:\n * page-level actions (undo/redo, paste, select all) plus quick \"insert\"\n * shortcuts.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\nimport { menuStyle, MenuRow, MenuDivider, useClampedPosition, useCloseOnOutside } from './menuPrimitives';\nimport type { LinkDialogRequest } from './LinkDialog';\nimport { insertTableFitted } from '../../extensions/builtins/table-enhancements';\n\nexport interface PageContextMenuProps {\n  editor: DocxEditor;\n  position: { left: number; top: number };\n  onClose: () => void;\n  onOpenLinkDialog: (request: LinkDialogRequest) => void;\n}\n\nexport function PageContextMenu({ editor, position, onClose, onOpenLinkDialog }: PageContextMenuProps): React.ReactElement {\n  const ed = editor.editor;\n  const { ref, pos } = useClampedPosition(position);\n  useCloseOnOutside(ref, onClose);\n\n  return (\n    <div ref={ref} style={{ ...menuStyle, left: pos.left, top: pos.top }}>\n      <MenuRow label=\"Undo\" icon=\"↶\" shortcut=\"Ctrl+Z\" disabled={!ed.can().undo()} onClick={() => { ed.chain().focus().undo().run(); onClose(); }} />\n      <MenuRow label=\"Redo\" icon=\"↷\" shortcut=\"Ctrl+Y\" disabled={!ed.can().redo()} onClick={() => { ed.chain().focus().redo().run(); onClose(); }} />\n      <MenuDivider />\n      <MenuRow label=\"Paste\" icon=\"📋\" shortcut=\"Ctrl+V\" onClick={() => { document.execCommand('paste'); onClose(); }} />\n      <MenuRow label=\"Select all\" icon=\"▭\" shortcut=\"Ctrl+A\" onClick={() => { ed.chain().focus().selectAll().run(); onClose(); }} />\n      <MenuDivider />\n      <MenuRow\n        label=\"Insert link\"\n        icon=\"🔗\"\n        onClick={() => { onOpenLinkDialog({ range: null, text: '', url: '', isEditing: false }); onClose(); }}\n      />\n      <MenuRow\n        label=\"Insert table (3×3)\"\n        icon=\"▦\"\n        onClick={() => { insertTableFitted(ed, { rows: 3, cols: 3, withHeaderRow: true }); onClose(); }}\n      />\n      <MenuRow\n        label=\"Insert image\"\n        icon=\"🖼\"\n        onClick={() => {\n          const url = typeof window !== 'undefined' ? window.prompt('Image URL') : null;\n          if (url) ed.chain().focus().setImage({ src: url }).run();\n          onClose();\n        }}\n      />\n      <MenuRow\n        label=\"Insert page break\"\n        icon=\"⤓\"\n        shortcut=\"Ctrl+Enter\"\n        onClick={() => { ed.chain().focus().insertPageBreak().run(); onClose(); }}\n      />\n      <MenuDivider />\n      <MenuRow label=\"Align left\" onClick={() => { ed.chain().focus().setTextAlign('left').run(); onClose(); }} />\n      <MenuRow label=\"Align center\" onClick={() => { ed.chain().focus().setTextAlign('center').run(); onClose(); }} />\n      <MenuRow label=\"Align right\" onClick={() => { ed.chain().focus().setTextAlign('right').run(); onClose(); }} />\n      <MenuRow label=\"Justify\" onClick={() => { ed.chain().focus().setTextAlign('justify').run(); onClose(); }} />\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DocxEditor } from '../../../editor';\n\n/** Table properties dialog — width + alignment. */\nexport interface TablePropertiesDialogProps {\n  editor: DocxEditor;\n  onClose: () => void;\n}\n\nexport function TablePropertiesDialog({ editor, onClose }: TablePropertiesDialogProps): React.ReactElement {\n  const ed = editor.editor;\n  const attrs = ed.getAttributes('table');\n  const [width, setWidth] = React.useState<string>(attrs.tableWidth || '');\n  const [align, setAlign] = React.useState<'left' | 'center' | 'right'>(attrs.tableAlign || 'left');\n\n  const apply = () => {\n    ed.chain().focus().updateAttributes('table', { tableWidth: width.trim() || null, tableAlign: align }).run();\n    onClose();\n  };\n\n  const alignBtn = (value: 'left' | 'center' | 'right', label: string) => (\n    <button\n      type=\"button\"\n      onClick={() => setAlign(value)}\n      style={{\n        flex: 1,\n        padding: '7px 0',\n        fontSize: 13,\n        border: '1px solid #d0d7de',\n        background: align === value ? '#2563eb' : '#fff',\n        color: align === value ? '#fff' : '#374151',\n        cursor: 'pointer',\n      }}\n    >\n      {label}\n    </button>\n  );\n\n  return (\n    <div\n      onMouseDown={(e) => {\n        if (e.target === e.currentTarget) onClose();\n      }}\n      style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.35)', zIndex: 1100, display: 'grid', placeItems: 'center' }}\n    >\n      <div\n        onMouseDown={(e) => e.stopPropagation()}\n        style={{ background: '#fff', borderRadius: 10, padding: 20, width: 340, maxWidth: '90vw', boxShadow: '0 12px 40px rgba(0,0,0,0.25)' }}\n      >\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 14 }}>\n          <h3 style={{ fontSize: 15, fontWeight: 600, margin: 0 }}>Table properties</h3>\n          <button onClick={onClose} style={{ border: 'none', background: 'transparent', fontSize: 16, cursor: 'pointer', color: '#6b7280' }}>\n            ✕\n          </button>\n        </div>\n\n        <label style={{ fontSize: 12, color: '#374151', display: 'block', marginBottom: 4 }}>Width</label>\n        <input\n          type=\"text\"\n          value={width}\n          onChange={(e) => setWidth(e.target.value)}\n          placeholder=\"e.g. 100% or 600px\"\n          style={{ width: '100%', boxSizing: 'border-box', fontSize: 13, border: '1px solid #d0d7de', borderRadius: 6, padding: '7px 10px', outline: 'none', marginBottom: 14 }}\n        />\n\n        <label style={{ fontSize: 12, color: '#374151', display: 'block', marginBottom: 4 }}>Alignment</label>\n        <div style={{ display: 'flex', gap: 6, marginBottom: 18 }}>\n          {alignBtn('left', 'Left')}\n          {alignBtn('center', 'Center')}\n          {alignBtn('right', 'Right')}\n        </div>\n\n        <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n          <button onClick={onClose} style={{ padding: '7px 14px', fontSize: 13, border: '1px solid #d0d7de', background: '#fff', borderRadius: 6, cursor: 'pointer', color: '#374151' }}>\n            Cancel\n          </button>\n          <button onClick={apply} style={{ padding: '7px 14px', fontSize: 13, border: 'none', background: '#2563eb', color: '#fff', borderRadius: 6, cursor: 'pointer' }}>\n            Apply\n          </button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","/**\n * TableContextMenu — the right-click menu shown when the cursor/selection is\n * inside a table. Replaces `SelectionContextMenu`/`PageContextMenu` for that\n * case (see the routing logic in `EditorContextMenu.tsx`'s\n * `EditorContextMenuLayer`).\n *\n * Covers, in terms of what's native to TipTap/prosemirror-tables vs custom:\n *  - Insert/delete row/column, merge/split cells, header toggles: native\n *    commands (`addRowBefore`, `mergeCells`, `splitCell`, `toggleHeaderRow`,\n *    etc. from `@tiptap/extension-table`).\n *  - Cell drag-selection and column-border drag-resize: already native\n *    (prosemirror-tables), nothing to add — see table-interactions.ts's\n *    file header for details.\n *  - Row resize handles and hover \"+\" insert buttons: custom, implemented\n *    in `table-interactions.ts`.\n *  - Table style gallery, border presets, cell fill color, table\n *    properties (width/alignment): custom, backed by the attributes added\n *    in `table-enhancements.ts`.\n *\n * Note on \"split cell\": prosemirror-tables' `splitCell` only un-merges a\n * cell that was previously merged (colspan/rowspan > 1) — there's no way to\n * split an ordinary 1x1 cell into an arbitrary N-row/M-column grid, so this\n * menu only offers \"Split cell\" when the current cell is actually merged.\n */\nimport * as React from 'react';\nimport { CellSelection } from '@tiptap/pm/tables';\nimport type { Editor } from '@tiptap/core';\nimport { getMarkRange } from '@tiptap/core';\nimport type { DocxEditor } from '../../../editor';\nimport {\n  menuStyle,\n  MenuRow,\n  MenuDivider,\n  FormatIconRow,\n  FontSizeRow,\n  ColorRow,\n  SWATCHES,\n  useClampedPosition,\n  useCloseOnOutside,\n} from '../menuPrimitives';\nimport type { LinkDialogRequest } from '../LinkDialog';\nimport { TABLE_STYLE_PRESETS, TABLE_BORDER_PRESETS } from '../../../extensions/builtins/table-enhancements';\n\n/* ====================================================================== */\n/* Small visual previews for the style gallery / border picker              */\n/* ====================================================================== */\n\nconst STYLE_PREVIEWS: Record<string, { header: string; row1: string; row2: string; border: string }> = {\n  default: { header: '#f6f8fa', row1: '#ffffff', row2: '#ffffff', border: '#d0d7de' },\n  plain: { header: '#ffffff', row1: '#ffffff', row2: '#ffffff', border: '#eceef1' },\n  'light-shading': { header: '#dbeafe', row1: '#ffffff', row2: '#eff6ff', border: '#bfdbfe' },\n  'light-shading-accent': { header: '#dcfce7', row1: '#ffffff', row2: '#f0fdf4', border: '#bbf7d0' },\n  'medium-grid': { header: '#1f2937', row1: '#ffffff', row2: '#ffffff', border: '#1f2937' },\n  'grid-light': { header: '#f3f4f6', row1: '#ffffff', row2: '#ffffff', border: '#e5e7eb' },\n  'list-table': { header: '#e5e7eb', row1: '#ffffff', row2: '#ffffff', border: '#eceef1' },\n  'colorful-grid': { header: '#2563eb', row1: '#ffffff', row2: '#eff6ff', border: '#2563eb' },\n};\n\nfunction StylePreview({ id }: { id: string }): React.ReactElement {\n  const p = STYLE_PREVIEWS[id] || STYLE_PREVIEWS.default;\n  return (\n    <div\n      style={{\n        width: 32,\n        height: 22,\n        border: `1px solid ${p.border}`,\n        display: 'flex',\n        flexDirection: 'column',\n        flexShrink: 0,\n        borderRadius: 2,\n        overflow: 'hidden',\n      }}\n    >\n      <div style={{ flex: 1, background: p.header }} />\n      <div style={{ flex: 1, background: p.row1, borderTop: `1px solid ${p.border}` }} />\n      <div style={{ flex: 1, background: p.row2, borderTop: `1px solid ${p.border}` }} />\n    </div>\n  );\n}\n\nconst BORDER_EDGES: Record<string, { t?: boolean; r?: boolean; b?: boolean; l?: boolean; inside?: boolean }> = {\n  all: { t: true, r: true, b: true, l: true, inside: true },\n  outside: { t: true, r: true, b: true, l: true },\n  inside: { inside: true },\n  top: { t: true },\n  bottom: { b: true },\n  left: { l: true },\n  right: { r: true },\n  none: {},\n};\n\nfunction BorderIcon({ id }: { id: string }): React.ReactElement {\n  const e = BORDER_EDGES[id] || {};\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" style={{ flexShrink: 0 }}>\n      <rect x=\"1\" y=\"1\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"#e5e7eb\" strokeWidth=\"1\" />\n      {e.inside && (\n        <>\n          <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"19\" stroke=\"#374151\" strokeWidth=\"1.5\" />\n          <line x1=\"1\" y1=\"10\" x2=\"19\" y2=\"10\" stroke=\"#374151\" strokeWidth=\"1.5\" />\n        </>\n      )}\n      {e.t && <line x1=\"1\" y1=\"1.5\" x2=\"19\" y2=\"1.5\" stroke=\"#374151\" strokeWidth=\"1.5\" />}\n      {e.b && <line x1=\"1\" y1=\"18.5\" x2=\"19\" y2=\"18.5\" stroke=\"#374151\" strokeWidth=\"1.5\" />}\n      {e.l && <line x1=\"1.5\" y1=\"1\" x2=\"1.5\" y2=\"19\" stroke=\"#374151\" strokeWidth=\"1.5\" />}\n      {e.r && <line x1=\"18.5\" y1=\"1\" x2=\"18.5\" y2=\"19\" stroke=\"#374151\" strokeWidth=\"1.5\" />}\n    </svg>\n  );\n}\n\n/* ====================================================================== */\n/* Collapsible accordion section (used for style/border/color pickers)      */\n/* ====================================================================== */\n\nfunction AccordionSection({\n  label,\n  icon,\n  open,\n  onToggle,\n  children,\n}: {\n  label: string;\n  icon: React.ReactNode;\n  open: boolean;\n  onToggle: () => void;\n  children: React.ReactNode;\n}): React.ReactElement {\n  return (\n    <div>\n      <MenuRow label={label} icon={icon} shortcut={open ? '▴' : '▾'} onClick={onToggle} />\n      {open && <div style={{ padding: '2px 10px 8px' }}>{children}</div>}\n    </div>\n  );\n}\n\n/* ====================================================================== */\n/* TableContextMenu                                                         */\n/* ====================================================================== */\n\nexport interface TableContextMenuProps {\n  editor: DocxEditor;\n  position: { left: number; top: number };\n  onClose: () => void;\n  onOpenLinkDialog: (request: LinkDialogRequest) => void;\n  onOpenTableProperties: () => void;\n}\n\nexport function TableContextMenu({ editor, position, onClose, onOpenLinkDialog, onOpenTableProperties }: TableContextMenuProps): React.ReactElement {\n  const ed: Editor = editor.editor;\n  const { ref, pos } = useClampedPosition(position);\n  useCloseOnOutside(ref, onClose);\n\n  const [openSection, setOpenSection] = React.useState<null | 'style' | 'border' | 'color'>(null);\n  const toggle = (id: 'style' | 'border' | 'color') => setOpenSection((s) => (s === id ? null : id));\n\n  const isCellSelection = ed.state.selection instanceof CellSelection;\n  const hasTextSelection = !isCellSelection && !ed.state.selection.empty;\n  // Bold/italic/color etc. all work fine across a CellSelection (an entire\n  // selected row/column via the selector handles) too, not just a plain\n  // text range — so show the formatting controls for either. Link editing\n  // stays restricted to a plain text selection since it needs a single\n  // contiguous text range.\n  const showFormatControls = hasTextSelection || isCellSelection;\n  const isLink = hasTextSelection && ed.isActive('link');\n\n  const canMerge = ed.can().mergeCells();\n  const canSplit = ed.can().splitCell();\n\n  const applyBackground = (color: string | null) => {\n    ed.chain().focus().updateAttributes('tableCell', { backgroundColor: color }).updateAttributes('tableHeader', { backgroundColor: color }).run();\n  };\n  const applyBorder = (id: string) => {\n    ed.chain().focus().updateAttributes('table', { borderStyle: id }).run();\n  };\n  const applyStyle = (id: string) => {\n    ed.chain().focus().updateAttributes('table', { tableStyleId: id }).run();\n  };\n\n  const handleLink = () => {\n    const { from, to } = ed.state.selection;\n    const selectedText = ed.state.doc.textBetween(from, to, ' ');\n    if (isLink) {\n      const range = getMarkRange(ed.state.selection.$from, ed.state.schema.marks.link);\n      const href = (ed.getAttributes('link').href as string) || '';\n      const linkRange = range ?? { from, to };\n      const text = ed.state.doc.textBetween(linkRange.from, linkRange.to) || selectedText;\n      onOpenLinkDialog({ range: linkRange, text, url: href, isEditing: true });\n    } else {\n      onOpenLinkDialog({ range: { from, to }, text: selectedText, url: '', isEditing: false });\n    }\n    onClose();\n  };\n\n  return (\n    <div ref={ref} style={{ ...menuStyle, left: pos.left, top: pos.top, maxHeight: '80vh', overflowY: 'auto' }}>\n      {showFormatControls && (\n        <>\n          <FormatIconRow ed={ed} />\n          <FontSizeRow ed={ed} />\n          <MenuDivider />\n          <ColorRow ed={ed} mode=\"text\" />\n          <ColorRow ed={ed} mode=\"highlight\" />\n          {hasTextSelection && (\n            <>\n              <MenuDivider />\n              <MenuRow label={isLink ? 'Edit link' : 'Add link'} icon=\"🔗\" onClick={handleLink} />\n              {isLink && (\n                <MenuRow label=\"Remove link\" icon=\"🚫\" danger onClick={() => { ed.chain().focus().extendMarkRange('link').unsetLink().run(); onClose(); }} />\n              )}\n            </>\n          )}\n          <MenuDivider />\n        </>\n      )}\n\n      <MenuRow label=\"Insert row above\" onClick={() => { ed.chain().focus().addRowBefore().run(); onClose(); }} />\n      <MenuRow label=\"Insert row below\" onClick={() => { ed.chain().focus().addRowAfter().run(); onClose(); }} />\n      <MenuRow label=\"Insert column left\" onClick={() => { ed.chain().focus().addColumnBefore().run(); onClose(); }} />\n      <MenuRow label=\"Insert column right\" onClick={() => { ed.chain().focus().addColumnAfter().run(); onClose(); }} />\n      <MenuDivider />\n      <MenuRow label=\"Delete row\" danger onClick={() => { ed.chain().focus().deleteRow().run(); onClose(); }} />\n      <MenuRow label=\"Delete column\" danger onClick={() => { ed.chain().focus().deleteColumn().run(); onClose(); }} />\n      <MenuRow label=\"Delete table\" danger onClick={() => { ed.chain().focus().deleteTable().run(); onClose(); }} />\n      <MenuDivider />\n      {canMerge && <MenuRow label=\"Merge cells\" onClick={() => { ed.chain().focus().mergeCells().run(); onClose(); }} />}\n      {canSplit && <MenuRow label=\"Split cell\" onClick={() => { ed.chain().focus().splitCell().run(); onClose(); }} />}\n      {(canMerge || canSplit) && <MenuDivider />}\n      <MenuRow label=\"Toggle header row\" onClick={() => { ed.chain().focus().toggleHeaderRow().run(); onClose(); }} />\n      <MenuRow label=\"Toggle header column\" onClick={() => { ed.chain().focus().toggleHeaderColumn().run(); onClose(); }} />\n      <MenuDivider />\n\n      <AccordionSection label=\"Cell color\" icon=\"🎨\" open={openSection === 'color'} onToggle={() => toggle('color')}>\n        <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n          {SWATCHES.map((c) => (\n            <button\n              key={c}\n              type=\"button\"\n              title={c}\n              onClick={() => applyBackground(c)}\n              style={{ width: 18, height: 18, borderRadius: '50%', border: '1px solid #d0d7de', background: c, cursor: 'pointer', padding: 0 }}\n            />\n          ))}\n          <button\n            type=\"button\"\n            title=\"Clear\"\n            onClick={() => applyBackground(null)}\n            style={{ width: 18, height: 18, borderRadius: '50%', border: '1px solid #d0d7de', background: '#fff', cursor: 'pointer', fontSize: 11, lineHeight: '16px', color: '#6b7280' }}\n          >\n            ×\n          </button>\n        </div>\n      </AccordionSection>\n\n      <AccordionSection label=\"Borders\" icon=\"▦\" open={openSection === 'border'} onToggle={() => toggle('border')}>\n        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 6 }}>\n          {TABLE_BORDER_PRESETS.map((preset) => (\n            <button\n              key={preset.id}\n              type=\"button\"\n              title={preset.label}\n              onClick={() => applyBorder(preset.id)}\n              style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 4, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff', cursor: 'pointer' }}\n            >\n              <BorderIcon id={preset.id} />\n            </button>\n          ))}\n        </div>\n      </AccordionSection>\n\n      <AccordionSection label=\"Table style\" icon=\"🗒\" open={openSection === 'style'} onToggle={() => toggle('style')}>\n        <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n          {TABLE_STYLE_PRESETS.map((preset) => (\n            <button\n              key={preset.id}\n              type=\"button\"\n              onClick={() => applyStyle(preset.id)}\n              style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '4px 6px', border: 'none', background: 'transparent', borderRadius: 4, cursor: 'pointer', textAlign: 'left' }}\n              onMouseEnter={(e) => { e.currentTarget.style.background = '#f3f4f6'; }}\n              onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}\n            >\n              <StylePreview id={preset.id} />\n              <span style={{ fontSize: 13 }}>{preset.label}</span>\n            </button>\n          ))}\n        </div>\n      </AccordionSection>\n\n      <MenuDivider />\n      <MenuRow label=\"Table properties…\" icon=\"⚙\" onClick={() => { onOpenTableProperties(); onClose(); }} />\n    </div>\n  );\n}\n","/**\n * LinkDialogView — a proper \"Insert link\" / \"Edit link\" dialog\n * (Google-Docs-style), used in place of `window.prompt`. Shared by every\n * menu that offers \"add/edit link\" (selection menu, page menu, table menu,\n * link hover card).\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../../editor';\n\nexport interface LinkDialogRequest {\n  /** Range in the document to replace with the new text+link. `null` means\n   * \"insert at the current cursor position\" (nothing to replace). */\n  range: { from: number; to: number } | null;\n  /** Initial display text (selected text, existing link text, or ''). */\n  text: string;\n  /** Initial URL (existing link href, or ''). */\n  url: string;\n  /** Whether this is editing an existing link vs. creating a new one. */\n  isEditing: boolean;\n}\n\nfunction normalizeUrl(raw: string): string {\n  const trimmed = raw.trim();\n  if (!trimmed) return trimmed;\n  if (/^([a-z][a-z0-9+.-]*:|\\/|#)/i.test(trimmed)) return trimmed;\n  return `https://${trimmed}`;\n}\n\nexport interface LinkDialogViewProps {\n  request: LinkDialogRequest;\n  editor: DocxEditor;\n  onClose: () => void;\n}\n\nexport function LinkDialogView({ request, editor, onClose }: LinkDialogViewProps): React.ReactElement {\n  const [text, setText] = React.useState(request.text);\n  const [url, setUrl] = React.useState(request.url);\n  const urlRef = React.useRef<HTMLInputElement>(null);\n\n  React.useEffect(() => {\n    const t = setTimeout(() => {\n      urlRef.current?.focus();\n      urlRef.current?.select();\n    }, 0);\n    return () => clearTimeout(t);\n  }, []);\n\n  const canApply = url.trim().length > 0;\n\n  const apply = () => {\n    if (!canApply) return;\n    const finalUrl = normalizeUrl(url);\n    const displayText = text.trim() || finalUrl;\n    const ed = editor.editor;\n    const node = {\n      type: 'text',\n      text: displayText,\n      marks: [{ type: 'link', attrs: { href: finalUrl } }],\n    };\n    const chain = ed.chain().focus();\n    if (request.range) {\n      chain.insertContentAt({ from: request.range.from, to: request.range.to }, node);\n    } else {\n      chain.insertContent(node);\n    }\n    chain.run();\n    onClose();\n  };\n\n  const remove = () => {\n    if (request.range) {\n      editor.editor\n        .chain()\n        .focus()\n        .setTextSelection(request.range)\n        .extendMarkRange('link')\n        .unsetLink()\n        .run();\n    }\n    onClose();\n  };\n\n  return (\n    <div\n      onMouseDown={(e) => {\n        if (e.target === e.currentTarget) onClose();\n      }}\n      style={{\n        position: 'fixed',\n        inset: 0,\n        background: 'rgba(0,0,0,0.35)',\n        zIndex: 1100,\n        display: 'grid',\n        placeItems: 'center',\n      }}\n    >\n      <div\n        onMouseDown={(e) => e.stopPropagation()}\n        style={{\n          background: '#fff',\n          borderRadius: 10,\n          padding: 20,\n          width: 380,\n          maxWidth: '90vw',\n          boxShadow: '0 12px 40px rgba(0,0,0,0.25)',\n        }}\n      >\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 14 }}>\n          <h3 style={{ fontSize: 15, fontWeight: 600, margin: 0 }}>\n            {request.isEditing ? 'Edit link' : 'Insert link'}\n          </h3>\n          <button\n            onClick={onClose}\n            style={{ border: 'none', background: 'transparent', fontSize: 16, cursor: 'pointer', color: '#6b7280' }}\n          >\n            ✕\n          </button>\n        </div>\n\n        <label style={{ fontSize: 12, color: '#374151', display: 'block', marginBottom: 4 }}>Text to display</label>\n        <input\n          type=\"text\"\n          value={text}\n          onChange={(e) => setText(e.target.value)}\n          placeholder=\"Text\"\n          style={{\n            width: '100%',\n            boxSizing: 'border-box',\n            fontSize: 13,\n            border: '1px solid #d0d7de',\n            borderRadius: 6,\n            padding: '7px 10px',\n            outline: 'none',\n            marginBottom: 12,\n          }}\n        />\n\n        <label style={{ fontSize: 12, color: '#374151', display: 'block', marginBottom: 4 }}>Link</label>\n        <input\n          ref={urlRef}\n          type=\"text\"\n          value={url}\n          onChange={(e) => setUrl(e.target.value)}\n          onKeyDown={(e) => {\n            if (e.key === 'Enter') {\n              e.preventDefault();\n              apply();\n            } else if (e.key === 'Escape') {\n              onClose();\n            }\n          }}\n          placeholder=\"https://example.com\"\n          style={{\n            width: '100%',\n            boxSizing: 'border-box',\n            fontSize: 13,\n            border: '1px solid #d0d7de',\n            borderRadius: 6,\n            padding: '7px 10px',\n            outline: 'none',\n          }}\n        />\n\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginTop: 18 }}>\n          <div>\n            {request.isEditing && (\n              <button\n                onClick={remove}\n                style={{\n                  border: 'none',\n                  background: 'transparent',\n                  color: '#dc2626',\n                  fontSize: 13,\n                  cursor: 'pointer',\n                  padding: '6px 4px',\n                }}\n              >\n                Remove link\n              </button>\n            )}\n          </div>\n          <div style={{ display: 'flex', gap: 8 }}>\n            <button\n              onClick={onClose}\n              style={{\n                padding: '7px 14px',\n                fontSize: 13,\n                border: '1px solid #d0d7de',\n                background: '#fff',\n                borderRadius: 6,\n                cursor: 'pointer',\n                color: '#374151',\n              }}\n            >\n              Cancel\n            </button>\n            <button\n              onClick={apply}\n              disabled={!canApply}\n              style={{\n                padding: '7px 14px',\n                fontSize: 13,\n                border: 'none',\n                background: canApply ? '#2563eb' : '#93c5fd',\n                color: '#fff',\n                borderRadius: 6,\n                cursor: canApply ? 'pointer' : 'default',\n              }}\n            >\n              Apply\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n","/**\n * LinkHoverCardView — small floating card shown when hovering a link,\n * mirroring the Google Docs / Google Drive \"show the URL + quick actions\"\n * preview (Open/Copy/Edit/Remove).\n */\nimport * as React from 'react';\nimport { getMarkRange } from '@tiptap/core';\nimport type { DocxEditor } from '../../editor';\nimport { useClampedPosition } from './menuPrimitives';\n\nexport interface LinkHoverInfo {\n  href: string;\n  left: number;\n  top: number;\n  anchor: HTMLAnchorElement;\n}\n\nconst hoverIconBtnStyle: React.CSSProperties = {\n  border: 'none',\n  background: 'transparent',\n  cursor: 'pointer',\n  fontSize: 13,\n  color: '#57606a',\n  padding: '2px 4px',\n  borderRadius: 4,\n};\n\nexport interface LinkHoverCardViewProps {\n  info: LinkHoverInfo;\n  editor: DocxEditor;\n  onEdit: () => void;\n  onClose: () => void;\n  /** Set while the pointer is over the card itself, so the hide-timer in the\n   * parent doesn't dismiss it while the user is interacting with it. */\n  keepOpenRef: React.MutableRefObject<boolean>;\n}\n\nexport function LinkHoverCardView({ info, editor, onEdit, onClose, keepOpenRef }: LinkHoverCardViewProps): React.ReactElement {\n  const { ref, pos } = useClampedPosition({ left: info.left, top: info.top });\n\n  return (\n    <div\n      ref={ref}\n      onMouseEnter={() => {\n        keepOpenRef.current = true;\n      }}\n      onMouseLeave={() => {\n        keepOpenRef.current = false;\n        onClose();\n      }}\n      style={{\n        position: 'fixed',\n        left: pos.left,\n        top: pos.top,\n        zIndex: 999,\n        background: '#fff',\n        border: '1px solid #d0d7de',\n        borderRadius: 8,\n        boxShadow: '0 6px 20px rgba(0,0,0,0.15)',\n        padding: '6px 8px',\n        display: 'flex',\n        alignItems: 'center',\n        gap: 6,\n        fontSize: 12,\n        maxWidth: 340,\n      }}\n    >\n      <span style={{ color: '#2563eb', flexShrink: 0 }}>🔗</span>\n      <a\n        href={info.href}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        title={info.href}\n        style={{\n          color: '#2563eb',\n          textDecoration: 'none',\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n          maxWidth: 220,\n        }}\n      >\n        {info.href}\n      </a>\n      <span style={{ width: 1, height: 16, background: '#e5e7eb', flexShrink: 0 }} />\n      <button title=\"Copy link\" style={hoverIconBtnStyle} onClick={() => navigator.clipboard?.writeText(info.href)}>\n        ⧉\n      </button>\n      <button title=\"Edit link\" style={hoverIconBtnStyle} onClick={onEdit}>\n        ✎\n      </button>\n      <button\n        title=\"Remove link\"\n        style={hoverIconBtnStyle}\n        onClick={() => {\n          const ed = editor.editor;\n          const pos2 = ed.view.posAtDOM(info.anchor, 0);\n          const $pos = ed.state.doc.resolve(Math.min(pos2 + 1, ed.state.doc.content.size));\n          const range = getMarkRange($pos, ed.state.schema.marks.link);\n          if (range) {\n            ed.chain().focus().setTextSelection(range).unsetLink().run();\n          }\n          onClose();\n        }}\n      >\n        🚫\n      </button>\n    </div>\n  );\n}\n","/**\n * EditorContextMenuLayer — wires up right-click menus, the link dialog, and\n * the link hover preview automatically for a mounted `DocxEditor`.\n *\n * Drop this alongside a mounted `DocxEditor` to get, for free:\n *  - Right-click on the page (no selection) → `PageContextMenu`.\n *  - Right-click on selected text → `SelectionContextMenu` (formatting,\n *    font size, colors, link).\n *  - Right-click on an image → the existing `ImageContextMenu`.\n *  - Right-click inside a table → `TableContextMenu` (row/column/cell\n *    actions, style/border/color pickers, table properties).\n *  - Hovering a link → a small preview card with Open/Copy/Edit/Remove,\n *    Google-Docs style.\n *  - \"Add link\" / \"Edit link\" everywhere opens the same `LinkDialogView`.\n *\n * `ReactDocxEditor` mounts this automatically; only use it directly if\n * you're composing your own layout around `DocxEditor`.\n */\nimport * as React from 'react';\nimport { getMarkRange } from '@tiptap/core';\nimport type { DocxEditor } from '../../editor';\nimport { ImageContextMenu } from '../ui-widgets';\nimport { SelectionContextMenu } from './SelectionContextMenu';\nimport { PageContextMenu } from './PageContextMenu';\nimport { TableContextMenu, TablePropertiesDialog } from './TableContextMenu';\nimport { LinkDialogView, type LinkDialogRequest } from './LinkDialog';\nimport { LinkHoverCardView, type LinkHoverInfo } from './LinkHoverCard';\n\ntype MenuState =\n  | { type: 'selection'; position: { left: number; top: number } }\n  | { type: 'page'; position: { left: number; top: number } }\n  | { type: 'image'; position: { left: number; top: number } }\n  | { type: 'table'; position: { left: number; top: number } }\n  | null;\n\n/**\n * The selected text plus where it lives in the document — enough for a\n * context chip like \"Selected text — page 2, line 5\" that tells the user\n * (or the agent) exactly what's being referenced without re-scanning the\n * whole document. Computed here via `editor.getCursorContext()`, which\n * resolves page/line off `selection.from` — correct for a non-empty\n * selection too (that's its start, not just a bare cursor position).\n */\nexport interface SelectionContextInfo {\n  text: string;\n  page: number;\n  totalPages: number;\n  line: number;\n  totalLines: number;\n}\n\nexport interface EditorContextMenuLayerProps {\n  editor: DocxEditor;\n  /**\n   * Adds \"Edit with AI\" to the selection right-click menu. Called with the\n   * selection's text/page/line context plus the screen position to anchor\n   * the agent bubble at (computed here from the selection's end, same as\n   * the \"@\" trigger uses). Omit to hide the row entirely — `ReactDocxEditor`\n   * only passes this when an `agent` adapter is configured.\n   */\n  onEditWithAI?: (info: SelectionContextInfo & { left: number; top: number }) => void;\n  /**\n   * Adds \"Add to agent\" to the selection right-click menu. Called with the\n   * selection's text/page/line context; the host app is expected to open\n   * its agent sidebar and attach it as a context chip (see `ReactDocxEditor`'s\n   * `onAddSelectionToAgent` and `AgentPanel`'s `context` prop).\n   */\n  onAddToAgent?: (info: SelectionContextInfo) => void;\n}\n\nexport function EditorContextMenuLayer({ editor, onEditWithAI, onAddToAgent }: EditorContextMenuLayerProps): React.ReactElement | null {\n  const [menu, setMenu] = React.useState<MenuState>(null);\n  const [linkRequest, setLinkRequest] = React.useState<LinkDialogRequest | null>(null);\n  const [hover, setHover] = React.useState<LinkHoverInfo | null>(null);\n  const [tablePropertiesOpen, setTablePropertiesOpen] = React.useState(false);\n  const hoverKeepRef = React.useRef(false);\n  const hideTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  React.useEffect(() => {\n    const host = editor.getHost();\n    if (!host) return;\n\n    const onContextMenu = (e: MouseEvent) => {\n      const target = e.target instanceof Element ? e.target : e.target instanceof Node ? e.target.parentElement : null;\n      if (!target || !host.contains(target)) return;\n      e.preventDefault();\n      e.stopPropagation();\n      const position = { left: e.clientX, top: e.clientY };\n\n      const imgTarget = target.closest('.docx-image') as HTMLElement | null;\n      if (imgTarget) {\n        setMenu({ type: 'image', position });\n        setHover(null);\n        return;\n      }\n\n      // Table-related content (row/col/cell actions, style/border/color\n      // pickers) gets its own menu — see TableContextMenu.tsx — regardless\n      // of whether there's also a text selection inside the cell (that menu\n      // includes the text-formatting rows too in that case).\n      if (editor.editor.isActive('table')) {\n        setMenu({ type: 'table', position });\n        setHover(null);\n        return;\n      }\n\n      const { selection } = editor.editor.state;\n      setMenu({ type: selection.empty ? 'page' : 'selection', position });\n      setHover(null);\n    };\n\n    const onMouseOver = (e: MouseEvent) => {\n      const target = e.target instanceof Element ? e.target : e.target instanceof Node ? e.target.parentElement : null;\n      if (!target) return;\n      const anchor = target.closest('a[href]') as HTMLAnchorElement | null;\n      if (!anchor || !host.contains(anchor)) return;\n      if (hideTimerRef.current) {\n        clearTimeout(hideTimerRef.current);\n        hideTimerRef.current = null;\n      }\n      const rect = anchor.getBoundingClientRect();\n      setHover({ href: anchor.getAttribute('href') || '', left: rect.left, top: rect.bottom + 6, anchor });\n    };\n\n    const onMouseOut = (e: MouseEvent) => {\n      const target = e.target instanceof Element ? e.target : e.target instanceof Node ? e.target.parentElement : null;\n      const anchor = target?.closest('a[href]');\n      if (!anchor) return;\n      const related = e.relatedTarget as HTMLElement | null;\n      if (related && anchor.contains(related)) return;\n      hideTimerRef.current = setTimeout(() => {\n        if (!hoverKeepRef.current) setHover(null);\n      }, 180);\n    };\n\n    document.addEventListener('contextmenu', onContextMenu, true);\n    host.addEventListener('mouseover', onMouseOver);\n    host.addEventListener('mouseout', onMouseOut);\n    return () => {\n      document.removeEventListener('contextmenu', onContextMenu, true);\n      host.removeEventListener('mouseover', onMouseOver);\n      host.removeEventListener('mouseout', onMouseOut);\n      if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n    };\n  }, [editor]);\n\n  const closeMenu = React.useCallback(() => setMenu(null), []);\n  const closeLinkDialog = React.useCallback(() => setLinkRequest(null), []);\n  const openLinkDialog = React.useCallback((req: LinkDialogRequest) => {\n    setLinkRequest(req);\n    setHover(null);\n  }, []);\n\n  const buildSelectionContext = React.useCallback(\n    (text: string): SelectionContextInfo => {\n      const ctx = editor.getCursorContext();\n      return { text, page: ctx.page, totalPages: ctx.totalPages, line: ctx.line, totalLines: ctx.totalLines };\n    },\n    [editor],\n  );\n\n  const handleEditWithAI = React.useCallback(\n    (text: string) => {\n      if (!onEditWithAI) return;\n      const ed = editor.editor;\n      const info = buildSelectionContext(text);\n      try {\n        const coords = ed.view.coordsAtPos(ed.state.selection.to);\n        onEditWithAI({ ...info, left: coords.left, top: coords.bottom + 6 });\n      } catch {\n        // Selection coords can fail to resolve in edge cases (e.g. selection\n        // spans a node boundary mid-transaction) — fall back to the menu's\n        // own last click position rather than dropping the request.\n        onEditWithAI({ ...info, left: menu?.position.left ?? 0, top: (menu?.position.top ?? 0) + 20 });\n      }\n    },\n    [editor, onEditWithAI, menu, buildSelectionContext],\n  );\n\n  const handleAddToAgent = React.useCallback(\n    (text: string) => {\n      onAddToAgent?.(buildSelectionContext(text));\n    },\n    [onAddToAgent, buildSelectionContext],\n  );\n\n  const editLinkFromHover = () => {\n    if (!hover) return;\n    const ed = editor.editor;\n    const domPos = ed.view.posAtDOM(hover.anchor, 0);\n    const $pos = ed.state.doc.resolve(Math.min(domPos + 1, ed.state.doc.content.size));\n    const range = getMarkRange($pos, ed.state.schema.marks.link);\n    const from = range ? range.from : domPos;\n    const to = range ? range.to : domPos;\n    const text = (range ? ed.state.doc.textBetween(from, to) : hover.anchor.textContent) || '';\n    openLinkDialog({ range: { from, to }, text, url: hover.href, isEditing: true });\n  };\n\n  return (\n    <>\n      {menu?.type === 'selection' && (\n        <SelectionContextMenu\n          editor={editor}\n          position={menu.position}\n          onClose={closeMenu}\n          onOpenLinkDialog={openLinkDialog}\n          onEditWithAI={onEditWithAI ? handleEditWithAI : undefined}\n          onAddToAgent={onAddToAgent ? handleAddToAgent : undefined}\n        />\n      )}\n      {menu?.type === 'page' && (\n        <PageContextMenu editor={editor} position={menu.position} onClose={closeMenu} onOpenLinkDialog={openLinkDialog} />\n      )}\n      {menu?.type === 'image' && <ImageContextMenu editor={editor} position={menu.position} onClose={closeMenu} />}\n      {menu?.type === 'table' && (\n        <TableContextMenu\n          editor={editor}\n          position={menu.position}\n          onClose={closeMenu}\n          onOpenLinkDialog={openLinkDialog}\n          onOpenTableProperties={() => setTablePropertiesOpen(true)}\n        />\n      )}\n      {linkRequest && <LinkDialogView request={linkRequest} editor={editor} onClose={closeLinkDialog} />}\n      {tablePropertiesOpen && (\n        <TablePropertiesDialog editor={editor} onClose={() => setTablePropertiesOpen(false)} />\n      )}\n      {hover && !menu && !linkRequest && (\n        <LinkHoverCardView info={hover} editor={editor} onEdit={editLinkFromHover} onClose={() => setHover(null)} keepOpenRef={hoverKeepRef} />\n      )}\n    </>\n  );\n}\n","import * as React from 'react';\nimport { useClampedPosition, useCloseOnOutside, menuStyle, MenuRow } from '../context-menu/menuPrimitives';\n\n/** The \"@\" trigger popup — a single \"Agent\" row, shown right after typing \"@word\" at the cursor. */\nexport function AgentMentionMenu({\n  coords,\n  onSelect,\n  onClose,\n}: {\n  coords: { left: number; bottom: number };\n  onSelect: () => void;\n  onClose: () => void;\n}): React.ReactElement {\n  const { ref, pos } = useClampedPosition({ left: coords.left, top: coords.bottom + 6 });\n  useCloseOnOutside(ref, onClose);\n\n  return (\n    <div ref={ref} style={{ ...menuStyle, position: 'fixed', left: pos.left, top: pos.top, minWidth: 210, padding: 6 }}>\n      <MenuRow label=\"Agent\" onClick={onSelect} />\n      <div className=\"docx-editor-agent-mention-menu__hint\">Press Enter to ask the agent to make changes here</div>\n    </div>\n  );\n}\n","import type { AgentMentionActivityEvent, DisplayEntry } from './types';\n\nlet idCounter = 0;\nexport function genId(): string {\n  idCounter += 1;\n  return `activity_${Date.now()}_${idCounter}`;\n}\n\n/** Fold a raw `AgentMentionActivityEvent` into the bubble's merged display list — same merge rules as `useDocxAgent` uses for the sidebar panel. */\nexport function applyActivityEvent(\n  entries: DisplayEntry[],\n  event: AgentMentionActivityEvent,\n  activeThinkingId: { current: string | null },\n): DisplayEntry[] {\n  switch (event.type) {\n    case 'user':\n      return [...entries, { id: genId(), kind: 'user', text: event.text ?? '' }];\n    case 'assistant':\n      return [...entries, { id: genId(), kind: 'assistant', text: event.text ?? '' }];\n    case 'thinking': {\n      const done = !!event.done;\n      const chunk = event.text ?? '';\n      if (activeThinkingId.current) {\n        const id = activeThinkingId.current;\n        if (done) activeThinkingId.current = null;\n        return entries.map((e) =>\n          e.id === id && e.kind === 'thinking' ? { ...e, text: done ? chunk : e.text + chunk, streaming: !done } : e,\n        );\n      }\n      const id = genId();\n      if (!done) activeThinkingId.current = id;\n      return [...entries, { id, kind: 'thinking', text: chunk, streaming: !done }];\n    }\n    case 'tool_call': {\n      const id = event.callId ?? genId();\n      return [...entries, { id, kind: 'tool', name: event.toolName ?? 'tool', args: event.args, status: 'running' }];\n    }\n    case 'tool_result': {\n      let idx = event.callId ? entries.findIndex((e) => e.id === event.callId) : -1;\n      if (idx === -1) {\n        for (let i = entries.length - 1; i >= 0; i--) {\n          const e = entries[i];\n          if (e.kind === 'tool' && e.status === 'running' && e.name === event.toolName) {\n            idx = i;\n            break;\n          }\n        }\n      }\n      if (idx === -1) return entries;\n      const copy = entries.slice();\n      const entry = copy[idx];\n      if (entry.kind !== 'tool') return entries;\n      copy[idx] = { ...entry, status: event.isError ? 'error' : 'done', summary: event.summary };\n      return copy;\n    }\n    default:\n      return entries;\n  }\n}\n\n/** Group consecutive 'tool' entries into a single connected timeline run; everything else renders on its own. */\nexport function chunkRuns(items: DisplayEntry[]): Array<DisplayEntry | { run: Extract<DisplayEntry, { kind: 'tool' }>[] }> {\n  const out: Array<DisplayEntry | { run: Extract<DisplayEntry, { kind: 'tool' }>[] }> = [];\n  for (const entry of items) {\n    if (entry.kind === 'tool') {\n      const last = out[out.length - 1] as any;\n      if (last && last.run) {\n        last.run.push(entry);\n      } else {\n        out.push({ run: [entry] });\n      }\n    } else {\n      out.push(entry);\n    }\n  }\n  return out;\n}\n","/* Plain-language labels for tool calls — same idea as the sidebar's, kept\n * local since this component is deliberately decoupled from @shashimadushan/docx-editor-agent. */\n\nconst TOOL_LABELS: Record<string, string> = {\n  insert_paragraph: 'Adding a paragraph',\n  insert_heading: 'Adding a heading',\n  insert_bullet_list: 'Adding a bullet list',\n  insert_ordered_list: 'Adding a numbered list',\n  insert_table: 'Creating a table',\n  insert_code_block: 'Adding a code block',\n  insert_blockquote: 'Adding a quote',\n  insert_horizontal_rule: 'Adding a divider',\n  insert_page_break: 'Adding a page break',\n  insert_image: 'Adding an image',\n  insert_link: 'Adding a link',\n  insert_at_cursor: 'Inserting content',\n  append_html: 'Adding content',\n  duplicate_block: 'Duplicating content',\n  replace_selection: 'Replacing the selection',\n  wrap_selection: 'Formatting the selection',\n  set_block_text: 'Editing text',\n  batch_insert: 'Adding content',\n  batch_format: 'Formatting content',\n  batch_delete: 'Removing content',\n  batch_reorder: 'Reordering content',\n  set_bold: 'Formatting text',\n  set_italic: 'Formatting text',\n  set_underline: 'Formatting text',\n  set_strikethrough: 'Formatting text',\n  set_color: 'Changing text color',\n  set_alignment: 'Adjusting alignment',\n  set_heading: 'Changing to a heading',\n  set_paragraph: 'Changing to a paragraph',\n  set_paragraph_style: 'Changing style',\n  clear_formatting: 'Clearing formatting',\n  set_font_family: 'Changing the font',\n  set_font_size: 'Changing font size',\n  set_line_height: 'Adjusting spacing',\n  set_text_transform: 'Changing text case',\n  set_image_alignment: 'Aligning the image',\n  set_image_wrap: 'Adjusting image wrap',\n  set_image_size: 'Resizing the image',\n  get_table_info: 'Reading the table',\n  set_table_cell: 'Editing a table cell',\n  add_table_row: 'Adding a table row',\n  delete_table_row: 'Removing a table row',\n  add_table_column: 'Adding a table column',\n  delete_table_column: 'Removing a table column',\n  delete_block: 'Deleting content',\n  replace_block: 'Replacing content',\n  move_block: 'Moving content',\n  find_text: 'Searching the document',\n  replace_text: 'Replacing text',\n  clear_document: 'Clearing the document',\n  set_watermark: 'Setting the watermark',\n  set_header: 'Editing the header',\n  set_footer: 'Editing the footer',\n  scroll_to_block: 'Scrolling to content',\n  get_outline: 'Reading the outline',\n  get_word_count: 'Counting words',\n  list_blocks: 'Reading the document structure',\n  get_block: 'Reading content',\n  get_block_range: 'Reading content',\n  find_block_by_text: 'Locating content',\n  get_selection: 'Reading the selection',\n  get_document: 'Reading the document',\n  get_block_count: 'Counting blocks',\n};\n\nexport function toolLabel(name: string): string {\n  const known = TOOL_LABELS[name];\n  if (known) return known;\n  const words = name.replace(/_/g, ' ');\n  return words.charAt(0).toUpperCase() + words.slice(1);\n}\n","import * as React from 'react';\nimport type { DisplayEntry } from './types';\nimport { toolLabel } from './toolLabels';\n\nexport function ToolTimelineRow({\n  entry,\n  isLast,\n}: {\n  entry: Extract<DisplayEntry, { kind: 'tool' }>;\n  isLast: boolean;\n}): React.ReactElement {\n  const [expanded, setExpanded] = React.useState(false);\n  const label = toolLabel(entry.name);\n\n  return (\n    <div className=\"docx-editor-agent-tool-row\">\n      <div className=\"docx-editor-agent-tool-row__rail\">\n        <span className=\"docx-editor-agent-tool-row__dot\" data-status={entry.status} />\n        {!isLast && <span className=\"docx-editor-agent-tool-row__line\" />}\n      </div>\n      <div className=\"docx-editor-agent-tool-row__content\" data-last={isLast ? 'true' : undefined}>\n        <button type=\"button\" className=\"docx-editor-agent-tool-row__toggle\" onClick={() => setExpanded((v) => !v)}>\n          <span className=\"docx-editor-agent-tool-row__label\">\n            {label}\n            {entry.status === 'running' && <span className=\"docx-editor-agent-tool-row__ellipsis\">…</span>}\n          </span>\n          <svg\n            className=\"docx-editor-agent-tool-row__chevron\"\n            data-expanded={expanded ? 'true' : undefined}\n            width=\"10\"\n            height=\"10\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2.5\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          >\n            <polyline points=\"6 9 12 15 18 9\" />\n          </svg>\n        </button>\n        {expanded && (\n          <div className=\"docx-editor-agent-tool-row__details\">\n            <div className=\"docx-editor-agent-tool-row__details-name\">{entry.name}</div>\n            {entry.args && Object.keys(entry.args).length > 0 && <div>{JSON.stringify(entry.args, null, 2)}</div>}\n            {entry.status !== 'running' && (\n              <div className=\"docx-editor-agent-tool-row__details-result\" data-status={entry.status}>\n                {entry.summary || (entry.status === 'error' ? 'Failed' : 'Done')}\n              </div>\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DisplayEntry } from './types';\nimport { ToolTimelineRow } from './ToolTimelineRow';\n\nexport function ToolTimeline({ items }: { items: Extract<DisplayEntry, { kind: 'tool' }>[] }): React.ReactElement {\n  return (\n    <div className=\"docx-editor-agent-tool-timeline\">\n      {items.map((entry, i) => (\n        <ToolTimelineRow key={entry.id} entry={entry} isLast={i === items.length - 1} />\n      ))}\n    </div>\n  );\n}\n","import * as React from 'react';\n\n/** Three pulsing dots — \"the agent is working\" indicator, reused by the thinking row and the input footer. */\nexport function PulseDots(): React.ReactElement {\n  return (\n    <span className=\"docx-editor-agent-pulse-dots\">\n      <span className=\"docx-editor-agent-pulse-dots__dot\" />\n      <span className=\"docx-editor-agent-pulse-dots__dot\" />\n      <span className=\"docx-editor-agent-pulse-dots__dot\" />\n    </span>\n  );\n}\n","import * as React from 'react';\nimport type { DisplayEntry } from './types';\nimport { PulseDots } from './PulseDots';\n\nexport function ThinkingRow({ entry }: { entry: Extract<DisplayEntry, { kind: 'thinking' }> }): React.ReactElement {\n  const [expanded, setExpanded] = React.useState(false);\n  const hasText = entry.text.trim().length > 0;\n\n  return (\n    <div className=\"docx-editor-agent-thinking\">\n      <button type=\"button\" className=\"docx-editor-agent-thinking__toggle\" onClick={() => setExpanded((v) => !v)}>\n        <span className=\"docx-editor-agent-thinking__label\">{entry.streaming ? 'Thinking…' : 'Thought'}</span>\n        {entry.streaming && <PulseDots />}\n        {hasText && (\n          <svg\n            className=\"docx-editor-agent-thinking__chevron\"\n            data-expanded={expanded ? 'true' : undefined}\n            width=\"10\"\n            height=\"10\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2.5\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          >\n            <polyline points=\"6 9 12 15 18 9\" />\n          </svg>\n        )}\n      </button>\n      {hasText && (\n        <div className=\"docx-editor-agent-thinking__text\" data-expanded={expanded ? 'true' : undefined}>\n          {entry.text}\n        </div>\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { DisplayEntry } from './types';\nimport { chunkRuns } from './activityMerge';\nimport { ToolTimeline } from './ToolTimeline';\nimport { ThinkingRow } from './ThinkingRow';\n\nexport function ActivityFeed({ activity }: { activity: DisplayEntry[] }): React.ReactElement {\n  const runs = chunkRuns(activity);\n  return (\n    <>\n      {runs.map((item, i) => {\n        if ('run' in item) return <ToolTimeline key={i} items={item.run} />;\n        if (item.kind === 'user') {\n          return (\n            <div key={item.id} className=\"docx-editor-agent-activity__user-row\">\n              <div className=\"docx-editor-agent-activity__user-bubble\">{item.text}</div>\n            </div>\n          );\n        }\n        if (item.kind === 'assistant') {\n          return (\n            <div key={item.id} className=\"docx-editor-agent-activity__assistant\">\n              {item.text}\n            </div>\n          );\n        }\n        if (item.kind === 'thinking') {\n          return <ThinkingRow key={item.id} entry={item} />;\n        }\n        return null;\n      })}\n    </>\n  );\n}\n","import * as React from 'react';\n\nexport interface DragPosition {\n  left: number;\n  top: number;\n}\n\nexport interface PointerDragOptions {\n  /** Called once when a drag starts. */\n  onDragStart?: () => void;\n  /** Called once when a drag ends (pointerup/pointercancel). */\n  onDragEnd?: () => void;\n  /**\n   * Drags starting on an element matching this selector are ignored, so\n   * interactive children (close button, etc.) inside the drag handle stay\n   * clickable. Default: `'button'`.\n   */\n  ignoreSelector?: string;\n}\n\nexport interface PointerDragHandle {\n  dragging: boolean;\n  onPointerDown: (e: React.PointerEvent) => void;\n  onPointerMove: (e: React.PointerEvent) => void;\n  onPointerUp: (e: React.PointerEvent) => void;\n  onPointerCancel: (e: React.PointerEvent) => void;\n}\n\n/**\n * Drag-to-reposition a fixed-position element via Pointer Events\n * (`pointerdown`/`pointermove`/`pointerup` + `setPointerCapture`) instead of\n * `mousedown`/`document.mousemove`/`document.mouseup`. One code path works\n * for mouse, touch, and pen — the old mouse-only pattern (previously\n * duplicated in `AgentMentionBubble` and `CommentsPanel`) never received\n * `mousemove` during a touch drag, which is why both dialogs were immovable\n * on a phone.\n *\n * Spread the returned handlers onto the drag handle element (e.g. a header\n * row); `setPointerCapture` keeps move/up events targeted at that element\n * even once the pointer leaves its bounds, so there's no need for\n * document-level listeners or manual cleanup.\n *\n * `getSize` is called on every move to clamp the dragged position inside\n * the viewport — pass a function (not a static size) since the element's\n * real size is only known after mount and can change (e.g. the agent\n * bubble grows as activity streams in).\n */\nexport function usePointerDrag(\n  pos: DragPosition,\n  setPos: (pos: DragPosition) => void,\n  getSize: () => { width: number; height: number },\n  options?: PointerDragOptions,\n): PointerDragHandle {\n  const posRef = React.useRef(pos);\n  posRef.current = pos;\n  const setPosRef = React.useRef(setPos);\n  setPosRef.current = setPos;\n  const getSizeRef = React.useRef(getSize);\n  getSizeRef.current = getSize;\n  const optionsRef = React.useRef(options);\n  optionsRef.current = options;\n\n  const [dragging, setDragging] = React.useState(false);\n  const dragRef = React.useRef<{\n    pointerId: number;\n    startX: number;\n    startY: number;\n    startLeft: number;\n    startTop: number;\n  } | null>(null);\n\n  const onPointerDown = React.useCallback((e: React.PointerEvent) => {\n    const ignoreSelector = optionsRef.current?.ignoreSelector ?? 'button';\n    if ((e.target as HTMLElement).closest?.(ignoreSelector)) return;\n    if (e.button !== 0 && e.pointerType === 'mouse') return;\n    e.preventDefault();\n    (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n    dragRef.current = {\n      pointerId: e.pointerId,\n      startX: e.clientX,\n      startY: e.clientY,\n      startLeft: posRef.current.left,\n      startTop: posRef.current.top,\n    };\n    setDragging(true);\n    optionsRef.current?.onDragStart?.();\n  }, []);\n\n  const onPointerMove = React.useCallback((e: React.PointerEvent) => {\n    const d = dragRef.current;\n    if (!d || d.pointerId !== e.pointerId) return;\n    const { width, height } = getSizeRef.current();\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n    let left = d.startLeft + (e.clientX - d.startX);\n    let top = d.startTop + (e.clientY - d.startY);\n    left = Math.min(Math.max(left, 4), Math.max(4, vw - width - 4));\n    top = Math.min(Math.max(top, 4), Math.max(4, vh - height - 4));\n    setPosRef.current({ left, top });\n  }, []);\n\n  const endDrag = React.useCallback((e: React.PointerEvent) => {\n    const d = dragRef.current;\n    if (!d || d.pointerId !== e.pointerId) return;\n    dragRef.current = null;\n    setDragging(false);\n    optionsRef.current?.onDragEnd?.();\n  }, []);\n\n  return { dragging, onPointerDown, onPointerMove, onPointerUp: endDrag, onPointerCancel: endDrag };\n}\n","/**\n * MobileSheet — a generic bottom sheet: scrim, grabber, optional header\n * with a title + close button, swipe-down-to-dismiss on the grabber, safe\n * area + on-screen-keyboard padding baked in.\n *\n * This is the shared mobile presentation for any floating dialog that\n * shows a draggable card on desktop (the \"@\" agent bubble, the comments\n * panel) — the caller decides desktop-card vs. mobile-sheet based on its\n * own `mobile` flag and renders this in the mobile branch instead of its\n * usual `position: fixed` card. Unlike `MobileMoreSheet` (which is always\n * mobile-only and lives inside `react/mobile/`), this component has no\n * opinion about layout mode itself — it just renders a sheet whenever\n * `open` is true — so it belongs alongside the components that use it\n * rather than under `mobile/`.\n */\nimport * as React from 'react';\nimport { CloseIcon } from './icons';\nimport { useKeyboardInset } from './mobile/useKeyboardInset';\n\nexport interface MobileSheetProps {\n  open: boolean;\n  onClose: () => void;\n  title?: string;\n  children: React.ReactNode;\n  /** Extra class appended to the sheet root, e.g. for a feature-specific max-height. */\n  className?: string;\n}\n\nconst DISMISS_THRESHOLD = 90;\n\nexport function MobileSheet({ open, onClose, title, children, className }: MobileSheetProps): React.ReactElement | null {\n  const keyboardInset = useKeyboardInset();\n  const [dragY, setDragY] = React.useState(0);\n  const [dragging, setDragging] = React.useState(false);\n  const dragRef = React.useRef<{ pointerId: number; startY: number } | null>(null);\n\n  React.useEffect(() => {\n    if (!open) setDragY(0);\n  }, [open]);\n\n  if (!open) return null;\n\n  const onGrabberPointerDown = (e: React.PointerEvent) => {\n    e.preventDefault();\n    (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n    dragRef.current = { pointerId: e.pointerId, startY: e.clientY };\n    setDragging(true);\n  };\n  const onGrabberPointerMove = (e: React.PointerEvent) => {\n    const d = dragRef.current;\n    if (!d || d.pointerId !== e.pointerId) return;\n    setDragY(Math.max(0, e.clientY - d.startY));\n  };\n  const endGrabberDrag = (e: React.PointerEvent) => {\n    const d = dragRef.current;\n    if (!d || d.pointerId !== e.pointerId) return;\n    dragRef.current = null;\n    setDragging(false);\n    if (dragY > DISMISS_THRESHOLD) onClose();\n    else setDragY(0);\n  };\n\n  return (\n    <div className=\"docx-editor-sheet-overlay\" onClick={onClose}>\n      <div\n        className={`docx-editor-sheet${className ? ` ${className}` : ''}`}\n        style={{\n          transform: dragY ? `translateY(${dragY}px)` : undefined,\n          transition: dragging ? 'none' : undefined,\n          // Custom property, not a direct `paddingBottom`, so the CSS rule\n          // can still fall back through `--de-safe-bottom` (see\n          // styles/mobile/safe-area.css) for hosts that already reserve\n          // the inset themselves (the react-native WebView).\n          ['--docx-editor-sheet-kb-inset' as any]: `${keyboardInset}px`,\n        }}\n        onClick={(e) => e.stopPropagation()}\n        role=\"dialog\"\n        aria-label={title}\n      >\n        <div\n          className=\"docx-editor-sheet__grab-zone\"\n          onPointerDown={onGrabberPointerDown}\n          onPointerMove={onGrabberPointerMove}\n          onPointerUp={endGrabberDrag}\n          onPointerCancel={endGrabberDrag}\n        >\n          <div className=\"docx-editor-sheet__grabber\" aria-hidden=\"true\" />\n        </div>\n        {title && (\n          <div className=\"docx-editor-sheet__header\">\n            <span className=\"docx-editor-sheet__title\">{title}</span>\n            <button type=\"button\" className=\"docx-editor-sheet__close\" onClick={onClose} aria-label=\"Close\">\n              <CloseIcon size={16} />\n            </button>\n          </div>\n        )}\n        <div className=\"docx-editor-sheet__body\">{children}</div>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport type { BubbleState } from './types';\nimport { ActivityFeed } from './ActivityFeed';\nimport { PulseDots } from './PulseDots';\nimport { usePointerDrag } from '../usePointerDrag';\nimport { MobileSheet } from '../MobileSheet';\n\nconst BUBBLE_WIDTH = 400;\n\nexport interface AgentMentionBubbleProps {\n  state: BubbleState;\n  onChange: (value: string) => void;\n  onSend: () => void;\n  onClose: () => void;\n  /** Renders as a bottom `MobileSheet` instead of a draggable floating card. */\n  mobile?: boolean;\n}\n\nfunction bubbleTitle(state: BubbleState): string {\n  return state.sending ? 'Agent is working…' : state.contextText ? 'Edit with AI' : 'Ask Agent';\n}\n\nexport function AgentMentionBubble({ state, onChange, onSend, onClose, mobile }: AgentMentionBubbleProps): React.ReactElement {\n  const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n  const activityEndRef = React.useRef<HTMLDivElement>(null);\n\n  React.useEffect(() => {\n    textareaRef.current?.focus();\n  }, []);\n\n  // Auto-scroll the activity feed to the latest step.\n  React.useEffect(() => {\n    activityEndRef.current?.scrollIntoView({ block: 'end' });\n  }, [state.activity.length, state.sending]);\n\n  const canSend = !!state.value.trim() && !state.sending;\n  const hasActivity = state.activity.length > 0;\n\n  const body = (\n    <>\n      {state.contextText && (\n        <div className=\"docx-editor-agent-mention__context\" title={state.contextText}>\n          <span className=\"docx-editor-agent-mention__context-label\">{state.contextLabel ?? 'Selected'}:</span>\n          <span className=\"docx-editor-agent-mention__context-text\">&ldquo;{state.contextText}&rdquo;</span>\n        </div>\n      )}\n\n      {(hasActivity || state.sending) && (\n        <div className=\"docx-editor-agent-mention__activity\">\n          <ActivityFeed activity={state.activity} />\n          {state.sending && (\n            <div className=\"docx-editor-agent-mention__working\">\n              Working… <PulseDots />\n            </div>\n          )}\n          <div ref={activityEndRef} />\n        </div>\n      )}\n\n      <div className=\"docx-editor-agent-mention__input-row\">\n        <textarea\n          ref={textareaRef}\n          className=\"docx-editor-agent-mention__textarea\"\n          value={state.value}\n          onChange={(e) => onChange(e.target.value)}\n          onKeyDown={(e) => {\n            if (e.key === 'Enter' && !e.shiftKey) {\n              e.preventDefault();\n              if (canSend) onSend();\n            }\n          }}\n          placeholder={\n            hasActivity\n              ? 'Ask a follow-up…'\n              : state.contextText\n                ? 'Tell the agent what to do with the selected text…'\n                : 'Tell the agent what to do here…'\n          }\n          rows={2}\n        />\n        <button type=\"button\" className=\"docx-editor-agent-mention__send\" onClick={onSend} disabled={!canSend} title=\"Send\">\n          {state.sending ? '…' : '↑'}\n        </button>\n      </div>\n\n      {state.error && <div className=\"docx-editor-agent-mention__error\">{state.error}</div>}\n      {!state.sending && !state.error && (\n        <div className=\"docx-editor-agent-mention__hint\">Enter to send · Shift+Enter for a new line · Esc or ✕ to close</div>\n      )}\n    </>\n  );\n\n  if (mobile) {\n    return (\n      <MobileSheet open onClose={onClose} title={bubbleTitle(state)} className=\"docx-editor-agent-mention-sheet\">\n        {body}\n      </MobileSheet>\n    );\n  }\n\n  return <DesktopBubble state={state} onClose={onClose}>{body}</DesktopBubble>;\n}\n\n/** Desktop presentation: a draggable floating card, seeded once from where the \"@\" was typed. */\nfunction DesktopBubble({\n  state,\n  onClose,\n  children,\n}: {\n  state: BubbleState;\n  onClose: () => void;\n  children: React.ReactNode;\n}): React.ReactElement {\n  const ref = React.useRef<HTMLDivElement>(null);\n\n  // Position is local + draggable, seeded once from where the \"@\" was\n  // typed. Unlike the trigger menu (useClampedPosition), this never\n  // recomputes from props after mount — otherwise every activity update\n  // would fight the user's drag and snap the bubble back.\n  const [pos, setPos] = React.useState({ left: state.left, top: state.top });\n\n  const drag = usePointerDrag(pos, setPos, () => {\n    const rect = ref.current?.getBoundingClientRect();\n    return { width: rect?.width ?? BUBBLE_WIDTH, height: rect?.height ?? 100 };\n  });\n\n  // Nudge on-screen once, right after first mount (size is only known then).\n  React.useLayoutEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const rect = el.getBoundingClientRect();\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n    let left = state.left;\n    let top = state.top;\n    if (left + rect.width > vw - 8) left = Math.max(8, vw - rect.width - 8);\n    if (top + rect.height > vh - 8) top = Math.max(8, vh - rect.height - 8);\n    setPos({ left, top });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Manual close only: Escape closes the bubble (even mid-run — the agent\n  // keeps working in the background either way), but there's no\n  // outside-click/scroll auto-dismiss here, unlike the trigger menu — the\n  // whole point is that this stays put until the user is done with it.\n  React.useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        // Only when focus is inside the bubble (otherwise this would\n        // swallow Escape for whatever else is on screen).\n        if (ref.current?.contains(document.activeElement)) onClose();\n      }\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, [onClose]);\n\n  return (\n    <div ref={ref} className=\"docx-editor-agent-mention-bubble\" style={{ left: pos.left, top: pos.top, width: BUBBLE_WIDTH }}>\n      <div\n        className=\"docx-editor-agent-mention-bubble__header\"\n        data-dragging={drag.dragging ? 'true' : undefined}\n        onPointerDown={drag.onPointerDown}\n        onPointerMove={drag.onPointerMove}\n        onPointerUp={drag.onPointerUp}\n        onPointerCancel={drag.onPointerCancel}\n        title=\"Drag to move\"\n      >\n        <span className=\"docx-editor-agent-mention-bubble__title\">{bubbleTitle(state)}</span>\n        <span className=\"docx-editor-agent-mention-bubble__grip\">⠿</span>\n        <button type=\"button\" className=\"docx-editor-agent-mention-bubble__close\" onClick={onClose} title=\"Close\">\n          ✕\n        </button>\n      </div>\n      {children}\n    </div>\n  );\n}\n","/**\n * AgentMention — type \"@\" anywhere in the document to invoke the AI agent\n * right at the cursor.\n *\n * Flow:\n *   1. Typing \"@word\" near the cursor opens a small floating menu with a\n *      single \"Agent\" item (Enter or click to select).\n *   2. Selecting it deletes the \"@word\" trigger text (so it doesn't linger\n *      as real content) and opens an input bubble in its place — a small\n *      textarea + send button, Google-Docs-comment-style.\n *   3. Sending calls `adapter.sendMessage(prompt, onActivity)`. Because the\n *      trigger text was just deleted, the ProseMirror selection is still\n *      sitting exactly where \"@\" was typed — so if the agent uses\n *      cursor-relative tools (e.g. `insert_at_cursor`), it naturally acts\n *      \"at that place\" with no extra plumbing needed.\n *   4. While the agent works, the bubble stays open and shows a live feed\n *      of what it's doing — reasoning (\"thinking\") streamed into a\n *      collapsed block, and tool calls collapsed into a plain-language\n *      timeline — in the order it actually happened. It never auto-hides;\n *      the user closes it explicitly (✕ button or Escape), so they can\n *      always see what happened, even after the request finishes.\n *\n * This component is deliberately decoupled from `@shashimadushan/docx-editor-agent` — it\n * only needs an object with a `sendMessage(prompt, onActivity?)` method.\n * Wire it up with the raw `DocxAgent` instance so you can forward its\n * run() callbacks as activity events:\n *\n *   const { agent } = useDocxAgent({ adapter: myLLMAdapter }, editor);\n *   <ReactDocxEditor\n *     agent={{\n *       sendMessage: (prompt, onActivity) =>\n *         agent!.run(prompt, {\n *           onThinking: (text, done) => onActivity?.({ type: 'thinking', text, done }),\n *           onAssistantMessage: (text) => onActivity?.({ type: 'assistant', text }),\n *           onToolCall: (name, args, callId) => onActivity?.({ type: 'tool_call', toolName: name, args, callId }),\n *           onToolResult: (r) => onActivity?.({ type: 'tool_result', toolName: r.tool, callId: r.callId, summary: r.summary, isError: r.isError }),\n *         }),\n *     }}\n *     ...\n *   />\n *\n * If no `agent` adapter is supplied, `ReactDocxEditor` doesn't mount this\n * component at all, so typing \"@\" behaves like a normal character.\n *\n * There's a second entry point besides typing \"@\": the `externalTrigger`\n * prop lets another component (the right-click \"Edit with AI\" menu item, in\n * `EditorContextMenuLayer`) open the bubble directly at a given position\n * with a text selection as context — see `AgentMentionExternalTrigger`.\n *\n * On mobile (`mobile` prop) the bubble presents as a bottom `MobileSheet`\n * instead of a draggable floating card — see `AgentMentionBubble`.\n */\nimport * as React from 'react';\nimport type { BubbleState, TriggerState } from './types';\nimport { AgentMentionMenu } from './AgentMentionMenu';\nimport { AgentMentionBubble } from './AgentMentionBubble';\nimport { genId, applyActivityEvent } from './activityMerge';\nimport type { AgentMentionActivityEvent, AgentMentionViewProps } from './types';\n\nexport function AgentMentionView({ editor, adapter, externalTrigger, mobile }: AgentMentionViewProps): React.ReactElement | null {\n  const [trigger, setTrigger] = React.useState<TriggerState | null>(null);\n  const [bubble, setBubble] = React.useState<BubbleState | null>(null);\n  const bubbleOpenRef = React.useRef(false);\n  bubbleOpenRef.current = !!bubble;\n\n  // \"Edit with AI\" entry point — opens the bubble directly at the given\n  // position with the selection's text as context. Deliberately does NOT\n  // touch the document selection (no deleteRange, unlike the \"@\" flow),\n  // so it's still there for the agent's get_selection/replace_selection\n  // tools once the user sends an instruction.\n  const lastExternalNonceRef = React.useRef<number | null>(null);\n  React.useEffect(() => {\n    if (!externalTrigger || lastExternalNonceRef.current === externalTrigger.nonce) return;\n    lastExternalNonceRef.current = externalTrigger.nonce;\n    setTrigger(null);\n    setBubble({\n      left: externalTrigger.left,\n      top: externalTrigger.top,\n      value: '',\n      sending: false,\n      error: null,\n      activity: [],\n      contextText: externalTrigger.contextText,\n      contextLabel: externalTrigger.contextLabel,\n    });\n  }, [externalTrigger]);\n\n  // Watch every transaction/selection change for a \"@word\" run ending at\n  // the cursor. A plain regex over the text just before the cursor is\n  // enough here — no dedicated ProseMirror plugin/state needed.\n  React.useEffect(() => {\n    const ed = editor.editor;\n\n    const update = () => {\n      if (bubbleOpenRef.current) return; // bubble owns the UI; don't reopen the menu under it\n      const { selection } = ed.state;\n      if (!selection.empty) {\n        setTrigger(null);\n        return;\n      }\n      const pos = selection.from;\n      const textBefore = ed.state.doc.textBetween(Math.max(0, pos - 60), pos, '\\n', '\\n');\n      const match = /(?:^|\\s)@([^\\s@]*)$/.exec(textBefore);\n      if (!match) {\n        setTrigger(null);\n        return;\n      }\n      const atPos = pos - match[1].length - 1;\n      if (atPos < 0) {\n        setTrigger(null);\n        return;\n      }\n      try {\n        const coords = ed.view.coordsAtPos(pos);\n        setTrigger({ from: atPos, to: pos, coords });\n      } catch {\n        setTrigger(null);\n      }\n    };\n\n    ed.on('transaction', update);\n    ed.on('selectionUpdate', update);\n    return () => {\n      ed.off('transaction', update);\n      ed.off('selectionUpdate', update);\n    };\n  }, [editor]);\n\n  const selectAgent = React.useCallback(() => {\n    if (!trigger) return;\n    const { from, to, coords } = trigger;\n    editor.editor.chain().focus().deleteRange({ from, to }).run();\n    setTrigger(null);\n    setBubble({ left: coords.left, top: coords.bottom + 6, value: '', sending: false, error: null, activity: [] });\n  }, [trigger, editor]);\n\n  // Enter selects \"Agent\" while the trigger menu is open (Escape/outside\n  // click are already handled by useCloseOnOutside inside AgentMentionMenu).\n  React.useEffect(() => {\n    if (!trigger) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Enter') {\n        e.preventDefault();\n        selectAgent();\n      }\n    };\n    document.addEventListener('keydown', onKey, true);\n    return () => document.removeEventListener('keydown', onKey, true);\n  }, [trigger, selectAgent]);\n\n  // Explicit close only — the bubble never auto-hides while (or after) the\n  // agent is working, so the user never loses track of what it's doing.\n  const closeBubble = React.useCallback(() => {\n    setBubble(null);\n    editor.editor.chain().focus().run();\n  }, [editor]);\n\n  const bubbleRef = React.useRef(bubble);\n  bubbleRef.current = bubble;\n\n  // Tracks the in-progress thinking entry's id for the *current* round of\n  // the *current* send — reset per send() call, same as useDocxAgent.\n  const activeThinkingId = React.useRef<string | null>(null);\n\n  const send = React.useCallback(async () => {\n    const current = bubbleRef.current;\n    const rawPrompt = current?.value.trim();\n    if (!current || !rawPrompt || current.sending) return;\n\n    // Only the raw text the user typed shows up in the activity feed as\n    // \"them\" — the selected-text context (if any) is silently prepended to\n    // what's actually sent to the adapter, so the model has it without the\n    // conversation log looking like the user pasted their own selection back\n    // at themselves.\n    const promptForAgent = current.contextText\n      ? `Regarding this selected text:\\n\"\"\"\\n${current.contextText}\\n\"\"\"\\n\\n${rawPrompt}`\n      : rawPrompt;\n\n    activeThinkingId.current = null;\n    setBubble((b) =>\n      b\n        ? { ...b, sending: true, error: null, value: '', activity: [...b.activity, { id: genId(), kind: 'user', text: rawPrompt }] }\n        : b,\n    );\n\n    const onActivity = (event: AgentMentionActivityEvent) => {\n      setBubble((b) => (b ? { ...b, activity: applyActivityEvent(b.activity, event, activeThinkingId) } : b));\n    };\n\n    try {\n      await adapter.sendMessage(promptForAgent, onActivity);\n      setBubble((b) => (b ? { ...b, sending: false } : b));\n    } catch (e) {\n      setBubble((b) => (b ? { ...b, sending: false, error: (e as Error)?.message ?? 'Something went wrong.' } : b));\n    }\n  }, [adapter]);\n\n  return (\n    <>\n      {trigger && (\n        <AgentMentionMenu coords={trigger.coords} onSelect={selectAgent} onClose={() => setTrigger(null)} />\n      )}\n      {bubble && (\n        <AgentMentionBubble\n          state={bubble}\n          onChange={(value) => setBubble((b) => (b ? { ...b, value } : b))}\n          onSend={send}\n          onClose={closeBubble}\n          mobile={mobile}\n        />\n      )}\n    </>\n  );\n}\n","/**\n * SuggestionLayer — a small Accept/Reject card for a tracked\n * insertion/deletion span, Google-Docs style. It shows for whichever\n * suggestion is currently relevant:\n *\n *   - **Hover**: moving the mouse over any suggestion span previews it\n *     immediately, and moving off it (without landing on the card itself)\n *     reverts to whatever the caret is doing.\n *   - **Caret**: it opens the moment the caret sits inside a suggestion —\n *     while actively typing it, right after clicking into it (even if the\n *     click drags slightly and produces a non-empty selection, e.g. a\n *     double-click that selects the suggested word), or when arrowing\n *     through it — and closes once the caret moves off it.\n *\n * It never inserts anything into the document itself; the card is a\n * portal-rendered overlay, so accepting/rejecting is the only thing that\n * touches doc content.\n *\n * Positioned in the margin, not on top of the page: like Google Docs'\n * comment cards, it renders just outside the right edge of the paper\n * (`editor.getPage()`), vertically aligned with the suggestion, instead of\n * overlapping the document text. Falls back to clamping inside the viewport\n * if there isn't room (narrow window, sidebar squeezing the page).\n *\n * Closing is driven by hover/selection state, not a generic \"click outside\n * to close\" listener: a real click on inline text inside a contentEditable\n * region can report `e.target` as the outer ProseMirror container rather\n * than the clicked inline element, which made a generic \"was the click\n * inside the anchor?\" check (as `FloatingPanel` uses for ordinary toolbar\n * dropdowns, anchored to stable React-rendered buttons) unreliable for a\n * ProseMirror-anchored overlay like this one — it would close the card on\n * the very click that was supposed to (re)open it.\n *\n * Mounted unconditionally (like the context-menu/agent-mention layers):\n * suggestions left over from a previous Suggesting session are still\n * reachable after switching back to Editing mode, since they aren't\n * resolved until accepted or rejected.\n */\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport type { DocxEditor } from '../editor';\nimport { CheckIcon, CloseIcon } from './icons';\n\nexport interface SuggestionLayerProps {\n  editor: DocxEditor;\n}\n\ninterface SuggestionInfo {\n  id: string;\n  kind: 'insertion' | 'deletion';\n  author?: string;\n  date?: string;\n  text: string;\n}\n\nconst SNIPPET_MAX = 80;\nconst CARD_WIDTH = 240;\nconst VIEWPORT_MARGIN = 12;\nconst PAGE_GAP = 20;\n// Grace period between leaving a suggestion span (or the card) and reverting\n// to the caret-driven state, so moving the mouse across the gap to reach the\n// card's Accept/Reject buttons doesn't close it first. The `mousemove` safe\n// corridor below (span ∪ card, inflated by CORRIDOR_PAD) is the real guard;\n// this is just the fallback for a fast pointer that outruns a move event.\nconst HOVER_HIDE_DELAY = 350;\n// Half-gutter of slack around the span→card corridor: while the pointer stays\n// within the union of the suggestion span and the card, inflated by this many\n// px, the card is kept open regardless of which element is under the cursor.\nconst CORRIDOR_PAD = 40;\n\nfunction snippet(text: string): string {\n  const trimmed = text.trim();\n  return trimmed.length > SNIPPET_MAX ? `${trimmed.slice(0, SNIPPET_MAX)}…` : trimmed;\n}\n\nfunction formatWhen(dateIso?: string): string | null {\n  if (!dateIso) return null;\n  const d = new Date(dateIso);\n  if (Number.isNaN(d.getTime())) return null;\n  const time = d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n  const isToday = d.toDateString() === new Date().toDateString();\n  return isToday ? `${time} Today` : `${time} ${d.toLocaleDateString()}`;\n}\n\nfunction describeSuggestionEl(el: HTMLElement): SuggestionInfo | null {\n  const id = el.dataset.changeId;\n  const kind = el.dataset.track as 'insertion' | 'deletion' | undefined;\n  if (!id || !kind) return null;\n  return { id, kind, author: el.dataset.author || undefined, date: el.dataset.date, text: el.textContent ?? '' };\n}\n\nfunction closestSuggestionEl(target: EventTarget | null): HTMLElement | null {\n  return (target as HTMLElement | null)?.closest?.('[data-change-id]') ?? null;\n}\n\nexport function SuggestionLayer({ editor }: SuggestionLayerProps): React.ReactElement | null {\n  const [suggestion, setSuggestion] = React.useState<SuggestionInfo | null>(null);\n  const [anchorRect, setAnchorRect] = React.useState<DOMRect | null>(null);\n  const [pos, setPos] = React.useState<{ top: number; left: number } | null>(null);\n  const cardRef = React.useRef<HTMLDivElement>(null);\n  const hideTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const show = React.useCallback((el: HTMLElement) => {\n    const info = describeSuggestionEl(el);\n    if (!info) return;\n    setSuggestion(info);\n    setAnchorRect(el.getBoundingClientRect());\n  }, []);\n\n  // The suggestion the caret is currently inside, regardless of whether the\n  // selection is collapsed — a click that drags slightly (or a double-click\n  // that selects the whole suggested word) still lands `$head` inside the\n  // span, so it shouldn't hide the card either.\n  const updateFromCaret = React.useCallback(() => {\n    const ed = editor.editor;\n    const isTracked = (mark: { type: { name: string } }) =>\n      mark.type.name === 'insertion' || mark.type.name === 'deletion';\n    const $head = ed.state.selection.$head;\n    // Both marks are `inclusive: false`, so `$head.marks()` (the marks that\n    // would apply to text typed right now) is empty right after finishing a\n    // suggestion — the exact moment we most want the card to show. Check\n    // the node just before the caret too (that's where the just-typed/\n    // just-reviewed text actually is), falling back to the node just after\n    // for arrowing up to a suggestion from its start.\n    const before = $head.nodeBefore;\n    const after = $head.nodeAfter;\n    const fromBefore = before && before.marks.some(isTracked);\n    const fromAfter = !fromBefore && after && after.marks.some(isTracked);\n    let el: HTMLElement | null = null;\n    if (fromBefore || fromAfter) {\n      try {\n        const domPos = fromBefore ? Math.max($head.pos - 1, 0) : $head.pos;\n        const info = ed.view.domAtPos(domPos);\n        let node: Node | null = info.node;\n        if (node.nodeType === Node.TEXT_NODE) node = node.parentNode;\n        el = (node as HTMLElement | null)?.closest?.('[data-change-id]') ?? null;\n      } catch {\n        el = null;\n      }\n    }\n    if (el) show(el);\n    else setSuggestion(null);\n  }, [editor, show]);\n\n  const cancelHide = React.useCallback(() => {\n    if (hideTimerRef.current !== null) {\n      clearTimeout(hideTimerRef.current);\n      hideTimerRef.current = null;\n    }\n  }, []);\n\n  // Revert to whatever the caret is doing after a short grace period — long\n  // enough to cross the margin gap to reach the card's Accept/Reject\n  // buttons, short enough not to feel sticky.\n  const scheduleRevertToCaret = React.useCallback(() => {\n    cancelHide();\n    hideTimerRef.current = setTimeout(updateFromCaret, HOVER_HIDE_DELAY);\n  }, [cancelHide, updateFromCaret]);\n\n  React.useEffect(() => {\n    const ed = editor.editor;\n    const dom = ed.view.dom;\n\n    const onMouseOver = (e: MouseEvent) => {\n      const el = closestSuggestionEl(e.target);\n      if (!el) return;\n      cancelHide();\n      show(el);\n    };\n\n    const onMouseOut = (e: MouseEvent) => {\n      const el = closestSuggestionEl(e.target);\n      if (!el) return;\n      if (closestSuggestionEl(e.relatedTarget) === el) return; // moved within the same span\n      if (cardRef.current?.contains(e.relatedTarget as Node | null)) return; // moved onto the card\n      scheduleRevertToCaret();\n    };\n\n    ed.on('selectionUpdate', updateFromCaret);\n    // `selectionUpdate` only fires when the selection actually moves — a\n    // click that lands on the exact position the caret already sat at\n    // (e.g. re-clicking a suggestion right after Escape-dismissing its\n    // card, or after clicking away and back to the same spot) doesn't\n    // change anything ProseMirror considers a \"selection update\", so it'd\n    // never reopen otherwise. `mouseup` fires on every click regardless,\n    // and by then the browser/ProseMirror has already placed the caret —\n    // re-running the same lookup here just covers that gap; it's not a\n    // second source of truth.\n    dom.addEventListener('mouseup', updateFromCaret);\n    dom.addEventListener('mouseover', onMouseOver);\n    dom.addEventListener('mouseout', onMouseOut);\n\n    return () => {\n      cancelHide();\n      ed.off('selectionUpdate', updateFromCaret);\n      dom.removeEventListener('mouseup', updateFromCaret);\n      dom.removeEventListener('mouseover', onMouseOver);\n      dom.removeEventListener('mouseout', onMouseOut);\n    };\n  }, [editor, updateFromCaret, show, cancelHide, scheduleRevertToCaret]);\n\n  // Position the card in the margin just right of the page, aligned with\n  // the suggestion's line — clamped into the viewport if there's no room.\n  React.useLayoutEffect(() => {\n    if (!suggestion || !anchorRect) {\n      setPos(null);\n      return;\n    }\n    const compute = () => {\n      const cardWidth = cardRef.current?.offsetWidth || CARD_WIDTH;\n      const cardHeight = cardRef.current?.offsetHeight || 90;\n      let pageRight: number | null = null;\n      try {\n        pageRight = editor.getPage().getBoundingClientRect().right;\n      } catch {\n        pageRight = null;\n      }\n\n      let left = (pageRight ?? anchorRect.right) + PAGE_GAP;\n      if (left + cardWidth > window.innerWidth - VIEWPORT_MARGIN) {\n        left = Math.max(VIEWPORT_MARGIN, window.innerWidth - cardWidth - VIEWPORT_MARGIN);\n      }\n\n      let top = anchorRect.top;\n      top = Math.min(top, window.innerHeight - cardHeight - VIEWPORT_MARGIN);\n      top = Math.max(top, VIEWPORT_MARGIN);\n\n      setPos({ top, left });\n    };\n\n    compute();\n    window.addEventListener('resize', compute);\n    window.addEventListener('scroll', compute, true);\n    return () => {\n      window.removeEventListener('resize', compute);\n      window.removeEventListener('scroll', compute, true);\n    };\n  }, [suggestion, anchorRect, editor]);\n\n  // Safe corridor: while the card is up, keep it open as long as the pointer\n  // stays anywhere within the union of the suggestion span and the card\n  // (inflated by CORRIDOR_PAD) — this is what lets you drag the mouse across\n  // the wide page margin from the underlined text to the Accept/Reject\n  // buttons without the card evaporating mid-trip. Stepping outside that box\n  // schedules the normal revert-to-caret.\n  React.useEffect(() => {\n    if (!suggestion || !anchorRect) return;\n    const onMove = (e: MouseEvent) => {\n      const card = cardRef.current?.getBoundingClientRect();\n      const boxes = card ? [anchorRect, card] : [anchorRect];\n      const minX = Math.min(...boxes.map((b) => b.left)) - CORRIDOR_PAD;\n      const maxX = Math.max(...boxes.map((b) => b.right)) + CORRIDOR_PAD;\n      const minY = Math.min(...boxes.map((b) => b.top)) - CORRIDOR_PAD;\n      const maxY = Math.max(...boxes.map((b) => b.bottom)) + CORRIDOR_PAD;\n      const inside = e.clientX >= minX && e.clientX <= maxX && e.clientY >= minY && e.clientY <= maxY;\n      if (inside) cancelHide();\n      else if (hideTimerRef.current === null) scheduleRevertToCaret();\n    };\n    document.addEventListener('mousemove', onMove);\n    return () => document.removeEventListener('mousemove', onMove);\n  }, [suggestion, anchorRect, cancelHide, scheduleRevertToCaret]);\n\n  // Escape dismisses the card (doesn't resolve the suggestion — it's still\n  // pending, just hidden until the caret or mouse revisits it).\n  React.useEffect(() => {\n    if (!suggestion) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') setSuggestion(null);\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, [suggestion]);\n\n  if (!suggestion || typeof document === 'undefined') return null;\n\n  const when = formatWhen(suggestion.date);\n\n  return createPortal(\n    <div\n      ref={cardRef}\n      className=\"docx-editor-suggestion-popover\"\n      data-kind={suggestion.kind}\n      role=\"dialog\"\n      aria-label=\"Suggestion\"\n      onMouseEnter={cancelHide}\n      onMouseLeave={scheduleRevertToCaret}\n      style={{\n        position: 'fixed',\n        top: pos?.top ?? -9999,\n        left: pos?.left ?? -9999,\n        visibility: pos ? 'visible' : 'hidden',\n        zIndex: 10000,\n        width: CARD_WIDTH,\n      }}\n    >\n      <div className=\"docx-editor-suggestion-popover__header\">\n        <div className=\"docx-editor-suggestion-popover__who\">\n          <span className=\"docx-editor-suggestion-popover__avatar\">{(suggestion.author || 'You').charAt(0)}</span>\n          <span className=\"docx-editor-suggestion-popover__who-text\">\n            <span className=\"docx-editor-suggestion-popover__author\">{suggestion.author || 'You'}</span>\n            {when && <span className=\"docx-editor-suggestion-popover__time\">{when}</span>}\n          </span>\n        </div>\n        <div className=\"docx-editor-suggestion-popover__quick-actions\">\n          <button\n            type=\"button\"\n            title=\"Accept\"\n            aria-label=\"Accept suggestion\"\n            className=\"docx-editor-suggestion-popover__icon-btn docx-editor-suggestion-popover__icon-btn--accept\"\n            onClick={() => {\n              editor.acceptSuggestion(suggestion.id);\n              setSuggestion(null);\n            }}\n          >\n            <CheckIcon size={14} />\n          </button>\n          <button\n            type=\"button\"\n            title=\"Reject\"\n            aria-label=\"Reject suggestion\"\n            className=\"docx-editor-suggestion-popover__icon-btn docx-editor-suggestion-popover__icon-btn--reject\"\n            onClick={() => {\n              editor.rejectSuggestion(suggestion.id);\n              setSuggestion(null);\n            }}\n          >\n            <CloseIcon size={14} />\n          </button>\n        </div>\n        <button\n          type=\"button\"\n          title=\"Dismiss\"\n          aria-label=\"Dismiss suggestion card\"\n          className=\"docx-editor-suggestion-popover__dismiss\"\n          onClick={() => setSuggestion(null)}\n        >\n          <CloseIcon size={12} />\n        </button>\n      </div>\n      <div className=\"docx-editor-suggestion-popover__body\">\n        <strong>{suggestion.kind === 'insertion' ? 'Add' : 'Delete'}:</strong> &ldquo;{snippet(suggestion.text)}&rdquo;\n      </div>\n    </div>,\n    document.body,\n  );\n}\n","/**\n * Built-in `CommentsStorageAdapter` implementations (see `../comments-types`).\n *\n * `MemoryCommentsAdapter` is the default used by `CommentsLayer` when no\n * `storage` is passed, so the Comments feature works out of the box.\n * `LocalStorageCommentsAdapter` persists across reloads for simple/demo\n * use without a backend. A real app (or the demo's IndexedDB adapter) can\n * supply its own `CommentsStorageAdapter` instead.\n */\nimport type { CommentThread, CommentsStorageAdapter } from '../comments-types';\n\n/** In-memory adapter — comments are lost on reload. Default when no `storage` is given. */\nexport class MemoryCommentsAdapter implements CommentsStorageAdapter {\n  private threads = new Map<string, CommentThread>();\n\n  async list(): Promise<CommentThread[]> {\n    return [...this.threads.values()];\n  }\n\n  async save(thread: CommentThread): Promise<void> {\n    this.threads.set(thread.id, thread);\n  }\n\n  async remove(id: string): Promise<void> {\n    this.threads.delete(id);\n  }\n}\n\n/** localStorage adapter (browser only) — persists across reloads under a single JSON blob. */\nexport class LocalStorageCommentsAdapter implements CommentsStorageAdapter {\n  constructor(private key: string) {}\n\n  private read(): Record<string, CommentThread> {\n    if (typeof localStorage === 'undefined') return {};\n    try {\n      const raw = localStorage.getItem(this.key);\n      return raw ? JSON.parse(raw) : {};\n    } catch {\n      return {};\n    }\n  }\n\n  private write(data: Record<string, CommentThread>): void {\n    if (typeof localStorage === 'undefined') return;\n    localStorage.setItem(this.key, JSON.stringify(data));\n  }\n\n  async list(): Promise<CommentThread[]> {\n    return Object.values(this.read());\n  }\n\n  async save(thread: CommentThread): Promise<void> {\n    const data = this.read();\n    data[thread.id] = thread;\n    this.write(data);\n  }\n\n  async remove(id: string): Promise<void> {\n    const data = this.read();\n    delete data[id];\n    this.write(data);\n  }\n}\n","import * as React from 'react';\nimport { CommentIcon } from '../icons';\n\nexport interface CommentsToggleButtonProps {\n  left: number;\n  top: number;\n  active: boolean;\n  count: number;\n  onClick: () => void;\n  /**\n   * Rendered inside a `createPortal` to `document.body` (see\n   * CommentsLayer.tsx), so it's not a DOM descendant of the\n   * `.docx-editor-react[data-de-layout=\"mobile\"]` wrapper and the usual\n   * mobile-scoping CSS selector can't reach it. Set directly from\n   * `ReactDocxEditor`'s `layout` prop instead so `mobile/comments.css` can\n   * target `[data-mobile=\"true\"]` on the element itself — the button's\n   * `left`/`top` (a page-margin gutter that doesn't exist on a phone-width\n   * screen) is overridden there with a fixed thumb-zone position.\n   */\n  mobile?: boolean;\n}\n\n/** Small bubble pinned to the page's margin; toggles the comments panel and shows an unresolved-count badge. */\nexport function CommentsToggleButton({ left, top, active, count, onClick, mobile }: CommentsToggleButtonProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"docx-editor-comments-toggle\"\n      data-active={active ? 'true' : undefined}\n      data-mobile={mobile ? 'true' : undefined}\n      style={{ left, top }}\n      title=\"Comments\"\n      aria-label=\"Toggle comments panel\"\n      onClick={onClick}\n    >\n      <CommentIcon size={16} />\n      {count > 0 && <span className=\"docx-editor-comments-toggle__badge\">{count > 99 ? '99+' : count}</span>}\n    </button>\n  );\n}\n","import * as React from 'react';\nimport { CommentIcon } from '../icons';\n\nexport interface CommentAddTriggerProps {\n  left: number;\n  top: number;\n  onClick: () => void;\n}\n\n/** Small button that appears near a non-empty text selection, offering to start a comment thread on it. */\nexport function CommentAddTrigger({ left, top, onClick }: CommentAddTriggerProps): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"docx-editor-comment-add-trigger\"\n      style={{ left, top }}\n      // Keep the ProseMirror selection alive — a default mousedown on a\n      // button outside the contentEditable region can otherwise collapse it\n      // before onClick fires.\n      onMouseDown={(e) => e.preventDefault()}\n      onClick={onClick}\n    >\n      <CommentIcon size={13} />\n      Comment\n    </button>\n  );\n}\n","import * as React from 'react';\nimport type { CommentMentionUser } from '../../comments-types';\n\nexport interface MentionTrigger {\n  query: string;\n  /** Index of the \"@\" in `value`. */\n  start: number;\n  /** Caret position (end of the typed query). */\n  end: number;\n}\n\n/**\n * Detects a live \"@query\" run ending at the caret in a plain textarea's\n * value (not a ProseMirror doc — see `AgentMention/AgentMentionView.tsx`\n * for the in-document equivalent of this same regex), and offers matching\n * `mentionableUsers` to insert.\n */\nexport function useMentionAutocomplete(\n  value: string,\n  caret: number,\n  mentionableUsers: CommentMentionUser[] | undefined,\n) {\n  const trigger = React.useMemo<MentionTrigger | null>(() => {\n    if (!mentionableUsers || !mentionableUsers.length) return null;\n    const before = value.slice(0, caret);\n    const match = /(?:^|\\s)@([^\\s@]*)$/.exec(before);\n    if (!match) return null;\n    const query = match[1];\n    const start = caret - query.length - 1;\n    if (start < 0) return null;\n    return { query, start, end: caret };\n  }, [value, caret, mentionableUsers]);\n\n  const matches = React.useMemo(() => {\n    if (!trigger || !mentionableUsers) return [];\n    const q = trigger.query.toLowerCase();\n    return mentionableUsers.filter((u) => u.name.toLowerCase().includes(q)).slice(0, 8);\n  }, [trigger, mentionableUsers]);\n\n  const insertMention = React.useCallback(\n    (user: CommentMentionUser): { value: string; caret: number } => {\n      if (!trigger) return { value, caret };\n      const before = value.slice(0, trigger.start);\n      const after = value.slice(trigger.end);\n      const insertion = `@${user.name} `;\n      return { value: `${before}${insertion}${after}`, caret: before.length + insertion.length };\n    },\n    [trigger, value, caret],\n  );\n\n  return { trigger, matches, insertMention };\n}\n","/**\n * Shared textarea + send button used both for starting a new comment\n * thread and for replying to one. Typing \"@\" opens a filtered dropdown of\n * `mentionableUsers` (see `useMentionAutocomplete`); picking one inserts\n * \"@Name \" as plain text. Mentions are derived at submit time by scanning\n * the final body for \"@Name\" substrings, rather than tracked as separate\n * state — so editing/deleting a mention \"just works\" without extra\n * bookkeeping.\n */\nimport * as React from 'react';\nimport type { CommentMentionUser } from '../../comments-types';\nimport { useMentionAutocomplete } from './useMentionAutocomplete';\nimport { MenuRow } from '../context-menu/menuPrimitives';\nimport { SendIcon } from '../icons';\n\nexport interface CommentComposerProps {\n  mentionableUsers?: CommentMentionUser[];\n  placeholder?: string;\n  autoFocus?: boolean;\n  onSubmit: (body: string, mentions: string[]) => void;\n}\n\nfunction extractMentions(body: string, users: CommentMentionUser[] | undefined): string[] {\n  if (!users || !users.length) return [];\n  return users.filter((u) => body.includes(`@${u.name}`)).map((u) => u.id);\n}\n\nexport function CommentComposer({ mentionableUsers, placeholder, autoFocus, onSubmit }: CommentComposerProps): React.ReactElement {\n  const [value, setValue] = React.useState('');\n  const [caret, setCaret] = React.useState(0);\n  const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n  const { trigger, matches, insertMention } = useMentionAutocomplete(value, caret, mentionableUsers);\n\n  React.useEffect(() => {\n    if (autoFocus) textareaRef.current?.focus();\n  }, [autoFocus]);\n\n  const syncCaret = () => setCaret(textareaRef.current?.selectionStart ?? value.length);\n\n  const submit = () => {\n    const body = value.trim();\n    if (!body) return;\n    onSubmit(body, extractMentions(body, mentionableUsers));\n    setValue('');\n    setCaret(0);\n  };\n\n  const pickMention = (user: CommentMentionUser) => {\n    const next = insertMention(user);\n    setValue(next.value);\n    setCaret(next.caret);\n    requestAnimationFrame(() => {\n      const el = textareaRef.current;\n      if (el) {\n        el.focus();\n        el.setSelectionRange(next.caret, next.caret);\n      }\n    });\n  };\n\n  return (\n    <div className=\"docx-editor-comment-composer\">\n      <div className=\"docx-editor-comment-composer__row\">\n        <textarea\n          ref={textareaRef}\n          className=\"docx-editor-comment-composer__textarea\"\n          rows={1}\n          placeholder={placeholder ?? 'Add a comment… use @ to mention someone'}\n          value={value}\n          onChange={(e) => {\n            setValue(e.target.value);\n            setCaret(e.target.selectionStart);\n          }}\n          onSelect={syncCaret}\n          onClick={syncCaret}\n          onKeyDown={(e) => {\n            if (trigger && matches.length > 0 && (e.key === 'Enter' || e.key === 'Tab')) {\n              e.preventDefault();\n              pickMention(matches[0]);\n              return;\n            }\n            if (e.key === 'Enter' && !e.shiftKey) {\n              e.preventDefault();\n              submit();\n            }\n          }}\n        />\n        <button\n          type=\"button\"\n          className=\"docx-editor-comment-composer__send\"\n          title=\"Send\"\n          aria-label=\"Send comment\"\n          disabled={!value.trim()}\n          onClick={submit}\n        >\n          <SendIcon size={14} />\n        </button>\n      </div>\n      {trigger && matches.length > 0 && (\n        <div\n          className=\"docx-editor-comment-mention-menu\"\n          style={{\n            position: 'absolute',\n            top: '100%',\n            left: 0,\n            right: 28,\n            marginTop: 2,\n            background: '#fff',\n            border: '1px solid var(--de-border-raw)',\n            borderRadius: 8,\n            boxShadow: '0 8px 24px rgba(0,0,0,0.16)',\n            zIndex: 10001,\n            padding: 4,\n          }}\n        >\n          {matches.map((u) => (\n            <MenuRow key={u.id} label={u.name} onClick={() => pickMention(u)} />\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n","/**\n * One comment thread in the panel: a collapsed snippet (author, quoted\n * anchor text, line-clamped first message) that expands into a scrollable\n * FAQ-accordion-style message list with a reply composer and\n * resolve/delete actions.\n */\nimport * as React from 'react';\nimport type { CommentThread, CommentMentionUser } from '../../comments-types';\nimport { ChevronDownIcon, CheckIcon, TrashIcon } from '../icons';\nimport { CommentComposer } from './CommentComposer';\n\nconst SNIPPET_MAX = 140;\n\nfunction snippet(text: string): string {\n  const trimmed = text.trim();\n  return trimmed.length > SNIPPET_MAX ? `${trimmed.slice(0, SNIPPET_MAX)}…` : trimmed;\n}\n\nfunction formatWhen(iso: string): string {\n  const d = new Date(iso);\n  if (Number.isNaN(d.getTime())) return '';\n  const time = d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n  const isToday = d.toDateString() === new Date().toDateString();\n  return isToday ? `${time} Today` : `${time} ${d.toLocaleDateString()}`;\n}\n\nfunction escapeRegExp(s: string): string {\n  return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Highlights \"@Name\" runs that match a known mentionable user. */\nfunction renderBody(body: string, users: CommentMentionUser[] | undefined): React.ReactNode {\n  if (!users || !users.length) return body;\n  const names = [...new Set(users.map((u) => u.name))].sort((a, b) => b.length - a.length);\n  if (!names.length) return body;\n  const pattern = new RegExp(`(@(?:${names.map(escapeRegExp).join('|')}))`, 'g');\n  const parts = body.split(pattern);\n  return parts.map((part, i) =>\n    part.startsWith('@') && names.includes(part.slice(1)) ? (\n      <span key={i} className=\"docx-editor-comment-thread__mention\">\n        {part}\n      </span>\n    ) : (\n      <React.Fragment key={i}>{part}</React.Fragment>\n    ),\n  );\n}\n\nexport interface CommentThreadItemProps {\n  thread: CommentThread;\n  expanded: boolean;\n  mentionableUsers?: CommentMentionUser[];\n  onToggle: () => void;\n  onReply: (body: string, mentions: string[]) => void;\n  onResolveToggle: () => void;\n  onDelete: () => void;\n}\n\nexport function CommentThreadItem({\n  thread,\n  expanded,\n  mentionableUsers,\n  onToggle,\n  onReply,\n  onResolveToggle,\n  onDelete,\n}: CommentThreadItemProps): React.ReactElement {\n  const first = thread.messages[0];\n\n  return (\n    <div className=\"docx-editor-comment-thread\" data-resolved={thread.resolved ? 'true' : undefined}>\n      <button type=\"button\" className=\"docx-editor-comment-thread__head\" onClick={onToggle}>\n        <span className=\"docx-editor-comment-thread__avatar\">{(first?.author || '?').charAt(0)}</span>\n        <span className=\"docx-editor-comment-thread__preview\">\n          <span className=\"docx-editor-comment-thread__author-row\">\n            <span className=\"docx-editor-comment-thread__author\">{first?.author ?? 'Unknown'}</span>\n            <span className=\"docx-editor-comment-thread__time\">{first ? formatWhen(first.createdAt) : ''}</span>\n          </span>\n          {thread.quote && <div className=\"docx-editor-comment-thread__quote\">&ldquo;{snippet(thread.quote)}&rdquo;</div>}\n          {!expanded && first && <div className=\"docx-editor-comment-thread__snippet\">{first.body}</div>}\n        </span>\n        <span className=\"docx-editor-comment-thread__chevron\" data-expanded={expanded ? 'true' : undefined}>\n          <ChevronDownIcon size={12} />\n        </span>\n      </button>\n\n      {expanded && (\n        <div className=\"docx-editor-comment-thread__expanded\">\n          <div className=\"docx-editor-comment-thread__messages\">\n            {thread.messages.map((m) => (\n              <div key={m.id} className=\"docx-editor-comment-thread__message\">\n                <div className=\"docx-editor-comment-thread__message-meta\">\n                  <span className=\"docx-editor-comment-thread__author\">{m.author}</span>\n                  <span className=\"docx-editor-comment-thread__time\">{formatWhen(m.createdAt)}</span>\n                </div>\n                <div className=\"docx-editor-comment-thread__message-body\">{renderBody(m.body, mentionableUsers)}</div>\n              </div>\n            ))}\n          </div>\n          <div className=\"docx-editor-comment-thread__actions\">\n            <button type=\"button\" className=\"docx-editor-comment-thread__action-btn\" onClick={onResolveToggle}>\n              <CheckIcon size={12} /> {thread.resolved ? 'Reopen' : 'Resolve'}\n            </button>\n            <button\n              type=\"button\"\n              className=\"docx-editor-comment-thread__action-btn docx-editor-comment-thread__action-btn--danger\"\n              onClick={onDelete}\n            >\n              <TrashIcon size={12} /> Delete\n            </button>\n          </div>\n          <CommentComposer mentionableUsers={mentionableUsers} placeholder=\"Reply… use @ to mention someone\" onSubmit={onReply} />\n        </div>\n      )}\n    </div>\n  );\n}\n","/**\n * The comments panel: a header (drag handle + close), an optional \"new\n * comment\" composer at the top when a text selection is pending, and a\n * scrollable list of thread snippets.\n *\n * Desktop presentation is a draggable floating card — dragging goes\n * through `usePointerDrag` (pointer events + `setPointerCapture`, one code\n * path for mouse and touch) rather than `FloatingPanel`, since a dragged\n * position must never snap back to an anchor. On mobile (`mobile` prop)\n * the same thread list renders inside a bottom `MobileSheet` instead —\n * see `AgentMentionBubble` for the identical split.\n */\nimport * as React from 'react';\nimport type { CommentThread, CommentMentionUser } from '../../comments-types';\nimport { CloseIcon, GripIcon } from '../icons';\nimport { CommentThreadItem } from './CommentThreadItem';\nimport { CommentComposer } from './CommentComposer';\nimport { usePointerDrag } from '../usePointerDrag';\nimport { MobileSheet } from '../MobileSheet';\n\nconst PANEL_WIDTH = 300;\n\nexport interface CommentsPanelProps {\n  initialPos: { left: number; top: number };\n  threads: CommentThread[];\n  expandedId: string | null;\n  mentionableUsers?: CommentMentionUser[];\n  pendingQuote: string | null;\n  onClose: () => void;\n  onToggleExpand: (id: string) => void;\n  onReply: (id: string, body: string, mentions: string[]) => void;\n  onResolveToggle: (id: string) => void;\n  onDelete: (id: string) => void;\n  onCreate: (body: string, mentions: string[]) => void;\n  /** Renders as a bottom `MobileSheet` instead of a draggable floating card. */\n  mobile?: boolean;\n}\n\nfunction ThreadList({\n  threads,\n  expandedId,\n  mentionableUsers,\n  pendingQuote,\n  onToggleExpand,\n  onReply,\n  onResolveToggle,\n  onDelete,\n  onCreate,\n}: Omit<CommentsPanelProps, 'initialPos' | 'onClose' | 'mobile'>): React.ReactElement {\n  const sorted = React.useMemo(\n    () => [...threads].sort((a, b) => Number(a.resolved) - Number(b.resolved)),\n    [threads],\n  );\n\n  return (\n    <>\n      {pendingQuote !== null && (\n        <div className=\"docx-editor-comments-panel__new\">\n          {pendingQuote && <div className=\"docx-editor-comment-thread__quote\">&ldquo;{pendingQuote}&rdquo;</div>}\n          <CommentComposer\n            mentionableUsers={mentionableUsers}\n            placeholder=\"Add a comment… use @ to mention someone\"\n            autoFocus\n            onSubmit={onCreate}\n          />\n        </div>\n      )}\n\n      <div className=\"docx-editor-comments-panel__list\">\n        {sorted.length === 0 && pendingQuote === null && (\n          <div className=\"docx-editor-comments-panel__empty\">No comments yet. Select text in the document to add one.</div>\n        )}\n        {sorted.map((t) => (\n          <CommentThreadItem\n            key={t.id}\n            thread={t}\n            expanded={expandedId === t.id}\n            mentionableUsers={mentionableUsers}\n            onToggle={() => onToggleExpand(t.id)}\n            onReply={(body, mentions) => onReply(t.id, body, mentions)}\n            onResolveToggle={() => onResolveToggle(t.id)}\n            onDelete={() => onDelete(t.id)}\n          />\n        ))}\n      </div>\n    </>\n  );\n}\n\nexport function CommentsPanel(props: CommentsPanelProps): React.ReactElement {\n  const { initialPos, onClose, mobile, ...listProps } = props;\n\n  if (mobile) {\n    return (\n      <MobileSheet open onClose={onClose} title=\"Comments\" className=\"docx-editor-comments-sheet\">\n        <ThreadList {...listProps} />\n      </MobileSheet>\n    );\n  }\n\n  return <DesktopCommentsPanel initialPos={initialPos} onClose={onClose} {...listProps} />;\n}\n\nfunction DesktopCommentsPanel({\n  initialPos,\n  onClose,\n  ...listProps\n}: Omit<CommentsPanelProps, 'mobile'>): React.ReactElement {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [pos, setPos] = React.useState(initialPos);\n\n  const drag = usePointerDrag(pos, setPos, () => {\n    const rect = ref.current?.getBoundingClientRect();\n    return { width: rect?.width ?? PANEL_WIDTH, height: rect?.height ?? 200 };\n  });\n\n  // Nudge on-screen once, right after first mount (size is only known then).\n  React.useLayoutEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const rect = el.getBoundingClientRect();\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n    let left = initialPos.left;\n    let top = initialPos.top;\n    if (left + rect.width > vw - 8) left = Math.max(8, vw - rect.width - 8);\n    if (top + rect.height > vh - 8) top = Math.max(8, vh - rect.height - 8);\n    setPos({ left, top });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  React.useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape' && ref.current?.contains(document.activeElement)) onClose();\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, [onClose]);\n\n  return (\n    <div\n      ref={ref}\n      className=\"docx-editor-comments-panel\"\n      style={{ left: pos.left, top: pos.top, width: PANEL_WIDTH }}\n      role=\"dialog\"\n      aria-label=\"Comments\"\n    >\n      <div\n        className=\"docx-editor-comments-panel__header\"\n        data-dragging={drag.dragging ? 'true' : undefined}\n        onPointerDown={drag.onPointerDown}\n        onPointerMove={drag.onPointerMove}\n        onPointerUp={drag.onPointerUp}\n        onPointerCancel={drag.onPointerCancel}\n        title=\"Drag to move\"\n      >\n        <span className=\"docx-editor-comments-panel__grip\">\n          <GripIcon size={14} />\n        </span>\n        <span className=\"docx-editor-comments-panel__title\">Comments</span>\n        <button\n          type=\"button\"\n          className=\"docx-editor-comments-panel__close\"\n          title=\"Close\"\n          aria-label=\"Close comments panel\"\n          onClick={onClose}\n        >\n          <CloseIcon size={13} />\n        </button>\n      </div>\n\n      <ThreadList {...listProps} />\n    </div>\n  );\n}\n","/**\n * CommentsLayer — orchestrates the whole Comments feature: a toggle bubble\n * pinned to the page margin, a small \"Add comment\" button that appears\n * near a non-empty text selection, and the draggable panel listing every\n * thread. Independent of \"Suggesting\" mode track changes (`SuggestionLayer`)\n * — comments are anchored via the separate `comment` mark\n * (`extensions/builtins/comments.ts`).\n *\n * Thread content (author, messages, mentions, resolved state) is owned by\n * this component's React state, hydrated from and persisted through a\n * pluggable `CommentsStorageAdapter` — the document's `comment` mark only\n * carries an anchor id, never thread content, so resolving/replying never\n * touches document/undo history.\n *\n * A comment's highlight is only written to the document once its first\n * message is actually submitted (not the moment the trigger is clicked) —\n * this keeps the mark and the persisted thread record atomic, so there's\n * never an orphaned highlight for a thread that was opened and abandoned.\n */\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport type { DocxEditor } from '../../editor';\nimport type {\n  CommentThread,\n  CommentMentionUser,\n  CommentsStorageAdapter,\n  CommentsHostViewState,\n  CommentsHostCommand,\n} from '../../comments-types';\nimport { MemoryCommentsAdapter } from '../comments-store';\nimport { CommentsToggleButton } from './CommentsToggleButton';\nimport { CommentAddTrigger } from './CommentAddTrigger';\nimport { CommentsPanel } from './CommentsPanel';\n\nexport interface CommentsLayerProps {\n  editor: DocxEditor;\n  /** Persistence backend. Defaults to an in-memory adapter (comments are lost on reload). */\n  storage?: CommentsStorageAdapter;\n  /** People selectable via \"@\" in the comment composer. Omit to disable @mention autocomplete. */\n  mentionableUsers?: CommentMentionUser[];\n  /** Display name attached to comments/replies made from now on. Default: 'You'. */\n  currentAuthor?: string;\n  /** See `CommentsToggleButtonProps.mobile` — passed straight from `ReactDocxEditor`'s `layout` prop. */\n  mobile?: boolean;\n  /**\n   * Bumped to open the \"new comment\" composer for whatever text is\n   * currently selected, without going through `CommentAddTrigger` — used\n   * by `SelectionFormatBar`'s mobile-only \"Comment\" button (see\n   * `ReactDocxEditor`'s `handleAddComment`). On mobile, `CommentAddTrigger`\n   * is not rendered at all (§2.3 \"one selection affordance\"), so this is\n   * the only way to start a thread from a selection there. Undefined or\n   * an unchanged value is a no-op.\n   */\n  commentRequest?: number;\n  /**\n   * `'host'` suppresses `CommentsPanel` entirely — `CommentsLayer` keeps\n   * anchoring/mutating threads exactly as before (the toggle bubble and\n   * \"Add comment\" selection trigger still render, since their position\n   * depends on document layout only this component knows), but reports\n   * every state change via `onHostOpen` instead of rendering the panel, and\n   * takes actions back via `hostCommand` instead of `CommentsPanel`'s own\n   * composer/reply/resolve/delete buttons. Default `'panel'` (today's\n   * behavior, unchanged).\n   */\n  presentation?: 'panel' | 'host';\n  /** Required (and only called) when `presentation: 'host'`. See `CommentsHostViewState`. */\n  onHostOpen?: (state: CommentsHostViewState) => void;\n  /** Action from a host-rendered sheet — see `CommentsHostCommand`. */\n  hostCommand?: CommentsHostCommand;\n}\n\ninterface SelectionTrigger {\n  from: number;\n  to: number;\n  text: string;\n  left: number;\n  top: number;\n}\n\ninterface PendingAnchor {\n  from: number;\n  to: number;\n  quote: string;\n}\n\nlet _idCounter = 0;\nfunction nextId(prefix: string): string {\n  _idCounter += 1;\n  return `${prefix}-${Date.now().toString(36)}-${_idCounter}`;\n}\n\nexport function CommentsLayer({\n  editor,\n  storage,\n  mentionableUsers,\n  currentAuthor,\n  mobile,\n  commentRequest,\n  presentation = 'panel',\n  onHostOpen,\n  hostCommand,\n}: CommentsLayerProps): React.ReactElement | null {\n  const store = React.useMemo(() => storage ?? new MemoryCommentsAdapter(), [storage]);\n  const author = currentAuthor || 'You';\n\n  const [threads, setThreads] = React.useState<CommentThread[]>([]);\n  const [togglePos, setTogglePos] = React.useState<{ left: number; top: number } | null>(null);\n  const [selTrigger, setSelTrigger] = React.useState<SelectionTrigger | null>(null);\n  const [panelOpen, setPanelOpen] = React.useState(false);\n  const [panelOrigin, setPanelOrigin] = React.useState<{ left: number; top: number } | null>(null);\n  const [expandedId, setExpandedId] = React.useState<string | null>(null);\n  const [pendingAnchor, setPendingAnchor] = React.useState<PendingAnchor | null>(null);\n\n  // Hydrate thread metadata from the store. The `comment` marks themselves\n  // round-trip with the document content (already inline in whatever was\n  // loaded) — only the thread messages/resolved-state need refetching.\n  React.useEffect(() => {\n    let cancelled = false;\n    store.list().then((list) => {\n      if (!cancelled) setThreads(list);\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [store]);\n\n  // Toggle bubble: pinned outside the page's right margin and stuck to the\n  // top of the visible surface. Anchoring it to the page's top alone makes\n  // it scroll off-screen (or sit mid-page) as soon as the page's top passes\n  // above the viewport on a long/scrolled document — so clamp `top` to the\n  // surface's visible band: never above the surface top, never below the\n  // page's bottom.\n  React.useLayoutEffect(() => {\n    const compute = () => {\n      try {\n        const pageRect = editor.getPage().getBoundingClientRect();\n        const surfaceRect = editor.getSurface().getBoundingClientRect();\n        const minTop = surfaceRect.top + 8;\n        const maxTop = Math.max(minTop, pageRect.bottom - 42);\n        const top = Math.min(Math.max(pageRect.top + 8, minTop), maxTop);\n        setTogglePos({ left: pageRect.right + 16, top });\n      } catch {\n        setTogglePos(null);\n      }\n    };\n    compute();\n    window.addEventListener('resize', compute);\n    window.addEventListener('scroll', compute, true);\n    return () => {\n      window.removeEventListener('resize', compute);\n      window.removeEventListener('scroll', compute, true);\n    };\n  }, [editor]);\n\n  // \"Add comment\" trigger: appears near a non-empty selection.\n  React.useEffect(() => {\n    const ed = editor.editor;\n    const update = () => {\n      const { selection } = ed.state;\n      if (selection.empty) {\n        setSelTrigger(null);\n        return;\n      }\n      try {\n        const coords = ed.view.coordsAtPos(selection.to);\n        const text = ed.state.doc.textBetween(selection.from, selection.to, ' ', ' ');\n        setSelTrigger({ from: selection.from, to: selection.to, text, left: coords.left, top: coords.bottom + 6 });\n      } catch {\n        setSelTrigger(null);\n      }\n    };\n    ed.on('selectionUpdate', update);\n    return () => {\n      ed.off('selectionUpdate', update);\n    };\n  }, [editor]);\n\n  // Dim resolved threads' highlights in the document (presentational only —\n  // resolved state lives in `threads`, not the mark, so this never touches\n  // ProseMirror state/undo history).\n  React.useEffect(() => {\n    const dom = editor.editor.view.dom;\n    const resolvedIds = new Set(threads.filter((t) => t.resolved).map((t) => t.id));\n    dom.querySelectorAll('[data-comment-id]').forEach((el) => {\n      const id = (el as HTMLElement).dataset.commentId;\n      if (id && resolvedIds.has(id)) el.setAttribute('data-resolved', 'true');\n      else el.removeAttribute('data-resolved');\n    });\n  }, [threads, editor]);\n\n  // Clicking an existing comment highlight opens/focuses its thread.\n  React.useEffect(() => {\n    const dom = editor.editor.view.dom;\n    const onClick = (e: MouseEvent) => {\n      const el = (e.target as HTMLElement)?.closest?.('[data-comment-id]') as HTMLElement | null;\n      if (!el) return;\n      const id = el.dataset.commentId;\n      if (!id) return;\n      setPanelOpen((open) => {\n        if (open) return open;\n        const rect = el.getBoundingClientRect();\n        setPanelOrigin({ left: rect.right + 16, top: rect.top });\n        return true;\n      });\n      setExpandedId(id);\n    };\n    dom.addEventListener('click', onClick);\n    return () => dom.removeEventListener('click', onClick);\n  }, [editor]);\n\n  const openComposerForSelection = () => {\n    if (!selTrigger) return;\n    setPendingAnchor({ from: selTrigger.from, to: selTrigger.to, quote: selTrigger.text });\n    setExpandedId(null);\n    setPanelOpen((open) => {\n      if (!open) setPanelOrigin({ left: selTrigger.left, top: selTrigger.top });\n      return true;\n    });\n  };\n\n  // External \"Comment\" request (mobile's `SelectionFormatBar` button, see\n  // `commentRequest` doc). `selTrigger` is already up to date by the time\n  // this fires, since it's recomputed on every `selectionUpdate` above.\n  const lastCommentRequestRef = React.useRef(commentRequest);\n  React.useEffect(() => {\n    if (commentRequest === undefined || commentRequest === lastCommentRequestRef.current) return;\n    lastCommentRequestRef.current = commentRequest;\n    openComposerForSelection();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [commentRequest]);\n\n  const toggleButtonClick = () => {\n    setPanelOpen((open) => {\n      if (open) {\n        setPendingAnchor(null);\n        return false;\n      }\n      // Open beside the page (to the right of the bubble), not over the\n      // document. If the margin is too narrow, CommentsPanel's own on-mount\n      // clamp nudges it back on-screen.\n      if (togglePos) setPanelOrigin({ left: togglePos.left + 42, top: togglePos.top });\n      return true;\n    });\n  };\n\n  const closePanel = () => {\n    setPanelOpen(false);\n    setPendingAnchor(null);\n  };\n\n  const handleCreate = (body: string, mentions: string[]) => {\n    if (!pendingAnchor) return;\n    const id = nextId('comment');\n    editor.addCommentAnchor(id, pendingAnchor.from, pendingAnchor.to);\n    const now = new Date().toISOString();\n    const thread: CommentThread = {\n      id,\n      quote: pendingAnchor.quote,\n      resolved: false,\n      createdAt: now,\n      messages: [{ id: nextId('msg'), author, body, mentions, createdAt: now }],\n    };\n    setThreads((prev) => [...prev, thread]);\n    setPendingAnchor(null);\n    setExpandedId(id);\n    void store.save(thread);\n  };\n\n  const handleReply = (threadId: string, body: string, mentions: string[]) => {\n    setThreads((prev) => {\n      const next = prev.map((t) =>\n        t.id === threadId\n          ? { ...t, messages: [...t.messages, { id: nextId('msg'), author, body, mentions, createdAt: new Date().toISOString() }] }\n          : t,\n      );\n      const updated = next.find((t) => t.id === threadId);\n      if (updated) void store.save(updated);\n      return next;\n    });\n  };\n\n  const handleResolveToggle = (threadId: string) => {\n    setThreads((prev) => {\n      const next = prev.map((t) => (t.id === threadId ? { ...t, resolved: !t.resolved } : t));\n      const updated = next.find((t) => t.id === threadId);\n      if (updated) void store.save(updated);\n      return next;\n    });\n  };\n\n  const handleDelete = (threadId: string) => {\n    editor.removeCommentAnchor(threadId);\n    setThreads((prev) => prev.filter((t) => t.id !== threadId));\n    setExpandedId((cur) => (cur === threadId ? null : cur));\n    void store.remove(threadId);\n  };\n\n  // Host-presentation reporting: whenever the state a panel would render\n  // from changes, hand it to the host instead of mounting `CommentsPanel`.\n  React.useEffect(() => {\n    if (presentation !== 'host') return;\n    onHostOpen?.({\n      open: panelOpen,\n      threads,\n      expandedId,\n      pendingQuote: pendingAnchor ? pendingAnchor.quote : null,\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [presentation, panelOpen, threads, expandedId, pendingAnchor]);\n\n  // Host-presentation commands: the nonce-bumped-prop pattern `commentRequest`\n  // above already establishes — a plain data change is enough to cross the\n  // WebView/native boundary, no imperative ref needed.\n  const lastHostCommandNonceRef = React.useRef<number | undefined>(undefined);\n  React.useEffect(() => {\n    if (!hostCommand || hostCommand.nonce === lastHostCommandNonceRef.current) return;\n    lastHostCommandNonceRef.current = hostCommand.nonce;\n    switch (hostCommand.action) {\n      case 'reply':\n        if (hostCommand.threadId && hostCommand.body) handleReply(hostCommand.threadId, hostCommand.body, hostCommand.mentions ?? []);\n        break;\n      case 'resolveToggle':\n        if (hostCommand.threadId) handleResolveToggle(hostCommand.threadId);\n        break;\n      case 'delete':\n        if (hostCommand.threadId) handleDelete(hostCommand.threadId);\n        break;\n      case 'create':\n        if (hostCommand.body) handleCreate(hostCommand.body, hostCommand.mentions ?? []);\n        break;\n      case 'close':\n        closePanel();\n        break;\n      case 'expand':\n        setExpandedId(hostCommand.threadId ?? null);\n        break;\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [hostCommand]);\n\n  if (typeof document === 'undefined') return null;\n  const canComment = editor.getMode() !== 'viewing';\n  const unresolvedCount = threads.filter((t) => !t.resolved).length;\n\n  return createPortal(\n    <>\n      {togglePos && (\n        <CommentsToggleButton left={togglePos.left} top={togglePos.top} active={panelOpen} count={unresolvedCount} onClick={toggleButtonClick} mobile={mobile} />\n      )}\n      {/* On mobile, `SelectionFormatBar`'s \"Comment\" button (see\n          `commentRequest`) is the one selection affordance instead — two\n          competing floating buttons over one selection doesn't fit a\n          phone screen (§2.3). */}\n      {!mobile && canComment && selTrigger && !pendingAnchor && (\n        <CommentAddTrigger left={selTrigger.left} top={selTrigger.top} onClick={openComposerForSelection} />\n      )}\n      {presentation !== 'host' && panelOpen && (mobile || panelOrigin) && (\n        <CommentsPanel\n          initialPos={panelOrigin ?? { left: 0, top: 0 }}\n          threads={threads}\n          expandedId={expandedId}\n          mentionableUsers={mentionableUsers}\n          pendingQuote={pendingAnchor ? pendingAnchor.quote : null}\n          onClose={closePanel}\n          onToggleExpand={(id) => setExpandedId((cur) => (cur === id ? null : id))}\n          onReply={handleReply}\n          onResolveToggle={handleResolveToggle}\n          onDelete={handleDelete}\n          onCreate={handleCreate}\n          mobile={mobile}\n        />\n      )}\n    </>,\n    document.body,\n  );\n}\n","/**\n * Pure search logic for the Find & Replace panel — kept separate from the\n * React component so it's cheap to unit test without mounting TipTap.\n */\nimport type { Node as PMNode } from '@tiptap/pm/model';\n\nexport interface DocMatch {\n  from: number;\n  to: number;\n}\n\n/** Flatten every text node in the doc into one string + a doc-position map,\n *  so a match can span across mark/run boundaries within a paragraph. */\nexport function buildSearchIndex(doc: PMNode): { text: string; positions: number[] } {\n  let text = '';\n  const positions: number[] = [];\n  doc.descendants((node, pos) => {\n    if (node.isText && node.text) {\n      for (let i = 0; i < node.text.length; i++) positions.push(pos + i);\n      text += node.text;\n    } else if (node.isBlock) {\n      // Block boundary: a character that never matches a real query but\n      // stops matches from spanning across paragraphs.\n      text += '\\n';\n      positions.push(-1);\n    }\n  });\n  return { text, positions };\n}\n\nexport interface FindOptions {\n  caseSensitive?: boolean;\n  useRegex?: boolean;\n}\n\n/** Find every match of `query` in the search index, as doc {from, to} ranges. */\nexport function findMatches(\n  index: { text: string; positions: number[] },\n  query: string,\n  options: FindOptions = {},\n): DocMatch[] {\n  if (!query) return [];\n  const matches: DocMatch[] = [];\n  const { text, positions } = index;\n\n  if (options.useRegex) {\n    let re: RegExp;\n    try {\n      re = new RegExp(query, options.caseSensitive ? 'g' : 'gi');\n    } catch {\n      return [];\n    }\n    let m: RegExpExecArray | null;\n    while ((m = re.exec(text))) {\n      if (m[0].length === 0) {\n        re.lastIndex++;\n        continue;\n      }\n      const from = positions[m.index];\n      const to = positions[m.index + m[0].length - 1];\n      if (from >= 0 && to >= 0) matches.push({ from, to: to + 1 });\n    }\n    return matches;\n  }\n\n  const haystack = options.caseSensitive ? text : text.toLowerCase();\n  const needle = options.caseSensitive ? query : query.toLowerCase();\n  let idx = 0;\n  while (true) {\n    const found = haystack.indexOf(needle, idx);\n    if (found === -1) break;\n    const from = positions[found];\n    const to = positions[found + needle.length - 1];\n    if (from >= 0 && to >= 0) matches.push({ from, to: to + 1 });\n    idx = found + Math.max(needle.length, 1);\n  }\n  return matches;\n}\n","/**\n * FindReplace — Ctrl/Cmd+F find bar with replace, Word/Google-Docs style.\n *\n * Navigation selects the match with the editor's own text selection (so the\n * browser highlights it natively) and scrolls it into view; it doesn't\n * decorate every match on screen (v1 — see IMPROVEMENT_PLAN §4). Replace\n * goes through TipTap commands, so it plays nicely with suggesting mode the\n * same way every other agent/human edit does.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport { buildSearchIndex, findMatches, type DocMatch } from './find-replace-search';\nimport { CloseIcon } from './icons';\n\nexport interface FindReplaceProps {\n  editor: DocxEditor;\n  open: boolean;\n  onClose: () => void;\n}\n\nexport function FindReplace({ editor, open, onClose }: FindReplaceProps): React.ReactElement | null {\n  const ed = editor.editor;\n  const [query, setQuery] = React.useState('');\n  const [replacement, setReplacement] = React.useState('');\n  const [caseSensitive, setCaseSensitive] = React.useState(false);\n  const [showReplace, setShowReplace] = React.useState(false);\n  const [matches, setMatches] = React.useState<DocMatch[]>([]);\n  const [current, setCurrent] = React.useState(0);\n  const inputRef = React.useRef<HTMLInputElement>(null);\n\n  const recompute = React.useCallback(\n    (q: string) => {\n      const index = buildSearchIndex(ed.state.doc);\n      const found = findMatches(index, q, { caseSensitive });\n      setMatches(found);\n      setCurrent(found.length > 0 ? 0 : -1);\n      return found;\n    },\n    [ed, caseSensitive],\n  );\n\n  React.useEffect(() => {\n    if (open) {\n      recompute(query);\n      inputRef.current?.focus();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [open]);\n\n  const selectMatch = (index: number, list = matches) => {\n    const m = list[index];\n    if (!m) return;\n    ed.chain().setTextSelection({ from: m.from, to: m.to }).run();\n    const domNode = ed.view.domAtPos(m.from).node as Node;\n    const el = domNode instanceof HTMLElement ? domNode : domNode.parentElement;\n    el?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n  };\n\n  const onQueryChange = (q: string) => {\n    setQuery(q);\n    const found = recompute(q);\n    if (found.length > 0) selectMatch(0, found);\n  };\n\n  const goNext = () => {\n    if (matches.length === 0) return;\n    const next = (current + 1) % matches.length;\n    setCurrent(next);\n    selectMatch(next);\n  };\n\n  const goPrev = () => {\n    if (matches.length === 0) return;\n    const prev = (current - 1 + matches.length) % matches.length;\n    setCurrent(prev);\n    selectMatch(prev);\n  };\n\n  const replaceCurrent = () => {\n    const m = matches[current];\n    if (!m) return;\n    ed.chain().focus().insertContentAt(m, replacement).run();\n    const found = recompute(query);\n    if (found.length > 0) selectMatch(Math.min(current, found.length - 1), found);\n  };\n\n  const replaceAll = () => {\n    // Replace back-to-front so earlier positions stay valid as later ones shrink/grow.\n    for (let i = matches.length - 1; i >= 0; i--) {\n      ed.chain().insertContentAt(matches[i], replacement).run();\n    }\n    ed.commands.focus();\n    recompute(query);\n  };\n\n  React.useEffect(() => {\n    if (!open) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose();\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, [open, onClose]);\n\n  if (!open) return null;\n\n  return (\n    <div className=\"docx-editor-find-replace\" role=\"dialog\" aria-label=\"Find and replace\">\n      <div className=\"docx-editor-find-row\">\n        <input\n          ref={inputRef}\n          type=\"text\"\n          placeholder=\"Find\"\n          value={query}\n          onChange={(e) => onQueryChange(e.target.value)}\n          onKeyDown={(e) => {\n            if (e.key === 'Enter') (e.shiftKey ? goPrev : goNext)();\n          }}\n        />\n        <span className=\"docx-editor-find-count\">\n          {matches.length > 0 ? `${current + 1}/${matches.length}` : '0/0'}\n        </span>\n        <button type=\"button\" onClick={goPrev} title=\"Previous match\" disabled={matches.length === 0}>\n          ↑\n        </button>\n        <button type=\"button\" onClick={goNext} title=\"Next match\" disabled={matches.length === 0}>\n          ↓\n        </button>\n        <label className=\"docx-editor-find-case\">\n          <input type=\"checkbox\" checked={caseSensitive} onChange={(e) => { setCaseSensitive(e.target.checked); recompute(query); }} />\n          Aa\n        </label>\n        <button type=\"button\" onClick={() => setShowReplace((v) => !v)} title=\"Toggle replace\">\n          Replace\n        </button>\n        <button type=\"button\" onClick={onClose} title=\"Close\" aria-label=\"Close find and replace\">\n          <CloseIcon size={14} />\n        </button>\n      </div>\n      {showReplace && (\n        <div className=\"docx-editor-find-row\">\n          <input\n            type=\"text\"\n            placeholder=\"Replace with\"\n            value={replacement}\n            onChange={(e) => setReplacement(e.target.value)}\n          />\n          <button type=\"button\" onClick={replaceCurrent} disabled={matches.length === 0}>\n            Replace\n          </button>\n          <button type=\"button\" onClick={replaceAll} disabled={matches.length === 0}>\n            Replace all\n          </button>\n        </div>\n      )}\n    </div>\n  );\n}\n","/**\n * Ruler — horizontal indent/tab-stop ruler above the page, Word-style.\n *\n * Shows the current paragraph's left indent, first-line indent, and tab\n * stops (all `paragraphLayout` attrs — see `extensions/builtins/\n * paragraph-layout.ts`). Drag the indent markers to change indent; click\n * empty ruler space to add a left tab stop; click an existing tab stop to\n * remove it. Scale is derived from the live page width/margins so 1 inch on\n * the ruler always matches 1 inch on the page.\n */\nimport * as React from 'react';\nimport type { DocxEditor } from '../editor';\nimport { resolvePageDimensions } from '../page-setup';\nimport type { TabStop } from '../extensions/builtins/paragraph-layout';\n\nexport interface RulerProps {\n  editor: DocxEditor;\n}\n\nconst PX_PER_INCH = 96;\n\nexport function Ruler({ editor }: RulerProps): React.ReactElement {\n  const ed = editor.editor;\n  const trackRef = React.useRef<HTMLDivElement>(null);\n  const [, forceRender] = React.useReducer((n: number) => n + 1, 0);\n\n  React.useEffect(() => {\n    const onUpdate = () => forceRender();\n    ed.on('selectionUpdate', onUpdate);\n    ed.on('transaction', onUpdate);\n    return () => {\n      ed.off('selectionUpdate', onUpdate);\n      ed.off('transaction', onUpdate);\n    };\n  }, [ed]);\n\n  const pageSetup = editor.getPageSetup();\n  const { widthPx } = resolvePageDimensions(pageSetup);\n  const marginPx = pageSetup.marginX * PX_PER_INCH;\n  const contentWidth = widthPx - marginPx * 2;\n\n  const attrs = ed.getAttributes('paragraph');\n  const indent: number = attrs.indent ?? 0;\n  const textIndent: number = attrs.textIndent ?? 0;\n  const tabStops: TabStop[] = attrs.tabStops ?? [];\n\n  const setAttrs = (patch: Record<string, unknown>) => {\n    ed.chain().focus().updateAttributes('paragraph', patch).run();\n  };\n\n  const posFromEvent = (e: React.MouseEvent): number => {\n    const track = trackRef.current;\n    if (!track) return 0;\n    const rect = track.getBoundingClientRect();\n    return Math.max(0, Math.min(contentWidth, e.clientX - rect.left));\n  };\n\n  const onTrackClick = (e: React.MouseEvent) => {\n    if ((e.target as HTMLElement).closest('[data-ruler-marker]')) return;\n    const pos = Math.round(posFromEvent(e));\n    setAttrs({ tabStops: [...tabStops, { pos, val: 'left' }].sort((a, b) => a.pos - b.pos) });\n  };\n\n  const removeTabStop = (pos: number) => {\n    setAttrs({ tabStops: tabStops.filter((t) => t.pos !== pos) });\n  };\n\n  const dragMarker = (kind: 'indent' | 'textIndent') => (e: React.PointerEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    (e.target as HTMLElement).setPointerCapture(e.pointerId);\n    const onMove = (ev: PointerEvent) => {\n      const track = trackRef.current;\n      if (!track) return;\n      const rect = track.getBoundingClientRect();\n      const pos = Math.max(0, Math.min(contentWidth, ev.clientX - rect.left));\n      if (kind === 'indent') setAttrs({ indent: Math.round(pos) });\n      else setAttrs({ textIndent: Math.round(pos - indent) });\n    };\n    const onUp = () => {\n      window.removeEventListener('pointermove', onMove);\n      window.removeEventListener('pointerup', onUp);\n    };\n    window.addEventListener('pointermove', onMove);\n    window.addEventListener('pointerup', onUp);\n  };\n\n  const inchTicks = Math.floor(contentWidth / PX_PER_INCH);\n\n  return (\n    <div className=\"docx-editor-ruler\" style={{ width: widthPx, marginLeft: 'auto', marginRight: 'auto' }}>\n      <div className=\"docx-editor-ruler-margin\" style={{ width: marginPx }} />\n      <div ref={trackRef} className=\"docx-editor-ruler-track\" style={{ width: contentWidth }} onClick={onTrackClick}>\n        {Array.from({ length: inchTicks + 1 }, (_, i) => (\n          <span key={i} className=\"docx-editor-ruler-tick\" style={{ left: i * PX_PER_INCH }}>\n            {i > 0 ? i : ''}\n          </span>\n        ))}\n        {tabStops.map((t) => (\n          <span\n            key={t.pos}\n            data-ruler-marker\n            className=\"docx-editor-ruler-tabstop\"\n            style={{ left: t.pos }}\n            title={`Tab stop (${t.val}) — click to remove`}\n            onClick={(e) => {\n              e.stopPropagation();\n              removeTabStop(t.pos);\n            }}\n          />\n        ))}\n        <span\n          data-ruler-marker\n          className=\"docx-editor-ruler-indent-marker\"\n          style={{ left: indent }}\n          title=\"Left indent — drag to change\"\n          onPointerDown={dragMarker('indent')}\n        />\n        <span\n          data-ruler-marker\n          className=\"docx-editor-ruler-firstline-marker\"\n          style={{ left: indent + textIndent }}\n          title=\"First-line indent — drag to change\"\n          onPointerDown={dragMarker('textIndent')}\n        />\n      </div>\n    </div>\n  );\n}\n","/**\n * ReactDocxEditor — a React wrapper around the framework-agnostic DocxEditor.\n *\n * Renders a Word/Google-Docs-style editor with:\n *   - Title bar (filename + open/save buttons)\n *   - Menu bar (File / Insert / Format / View dropdowns)\n *   - Formatting toolbar (grouped, with font/size pickers, color pickers, table tools)\n *   - Paged paper-like editing surface\n *   - Optional status bar\n *\n * Customization props:\n *   - `renderToolbar` / `renderTitleBar` / `renderMenuBar` — replace entire sections\n *   - `toolbarExtraItems` / `toolbarExtraGroups` — append/prepend custom toolbar items\n *   - `titleBarActions` — append custom buttons to the title bar\n *   - `showTitleBar` / `showMenuBar` / `showStatusBar` — toggle sections\n *   - `mode` — lock Editing/Suggesting/Viewing to a value the host controls,\n *     hiding the pill's own dropdown so the user can't switch modes themselves\n */\nimport * as React from 'react';\nimport { DocxEditor, type DocxEditorOptions, type EditorMode } from '../editor';\nimport { TitleBar } from './TitleBar';\nimport { HeaderActions, type HeaderActionItem, type HeaderDefaultActionToggles } from './HeaderActions';\nimport { useDocumentHistory, type HistoryManagerOptions, type HistoryManagerLike } from './history';\nimport { HistorySidebar } from './history/HistorySidebar';\nimport { MenuBar } from './MenuBar';\nimport { Toolbar } from './Toolbar';\nimport { MobileHeader, MobileToolbar, MobileStatusBar, SelectionFormatBar, type MobileMenuSection } from './mobile';\nimport type { TemplatePickerItem } from './TemplatePicker';\nimport { StatusBar } from './StatusBar';\nimport { attachImageResizeHandles } from '../extensions/builtins/image-interactions';\nimport { attachTableInteractions } from '../extensions/builtins/table-interactions';\nimport { EditorContextMenuLayer, type SelectionContextInfo } from './context-menu/EditorContextMenuLayer';\nimport { AgentMentionView, type AgentMentionAdapter, type AgentMentionExternalTrigger } from './AgentMention';\nimport { SuggestionLayer } from './SuggestionLayer';\nimport { CommentsLayer } from './Comments';\nimport { FindReplace } from './FindReplace';\nimport { Ruler } from './Ruler';\nimport type { CommentsStorageAdapter, CommentMentionUser, CommentsHostViewState, CommentsHostCommand } from '../comments-types';\nimport { loadPageSetup } from './page-setup-storage';\n\n/** \"Page 2, Line 5\" (only mentions total counts when there's more than one page/line, since \"page 1 of 1\" is just noise). */\nfunction formatSelectionLabel(ctx: SelectionContextInfo): string {\n  const pagePart = ctx.totalPages > 1 ? `Page ${ctx.page} of ${ctx.totalPages}` : `Page ${ctx.page}`;\n  const linePart = ctx.totalLines > 1 ? `Line ${ctx.line} of ${ctx.totalLines}` : `Line ${ctx.line}`;\n  return `${pagePart}, ${linePart}`;\n}\n\nexport { DocxEditor };\n\nexport interface ReactDocxEditorProps\n  extends Omit<DocxEditorOptions, 'element' | 'content' | 'onUpdate' | 'onCreate'> {\n  /** Initial HTML content. */\n  content?: string;\n  /** CSS class applied to the host wrapper. */\n  className?: string;\n  /** Inline style applied to the host wrapper. */\n  style?: React.CSSProperties;\n  /** Called whenever the document content changes. */\n  onUpdate?: (json: any, html: string) => void;\n  /** Called when the editor is created. Receives the DocxEditor instance. */\n  onReady?: (editor: DocxEditor) => void;\n\n  /** Render-prop: replace the entire title bar. */\n  renderTitleBar?: (editor: DocxEditor) => React.ReactNode;\n  /** Render-prop: replace the entire menu bar. */\n  renderMenuBar?: (editor: DocxEditor) => React.ReactNode;\n  /** Render-prop: replace the entire toolbar. */\n  renderToolbar?: (editor: DocxEditor) => React.ReactNode;\n  /** Render-prop: replace the entire status bar. */\n  renderStatusBar?: (editor: DocxEditor) => React.ReactNode;\n\n  /**\n   * Controls Editing/Suggesting/Viewing from the host app instead of\n   * leaving it to the user. When set, the mode pill in the header renders\n   * as a plain, non-interactive indicator (no dropdown) — the user can't\n   * switch modes from the editor UI, only the host can, by changing this\n   * prop (e.g. render Viewing for a read-only share, or Suggesting for a\n   * reviewer who shouldn't be able to edit directly). Omit to let the user\n   * pick freely from the pill (default).\n   */\n  mode?: EditorMode;\n\n  /** Show the title bar (default: true). */\n  showTitleBar?: boolean;\n  /** Show the indent/tab-stop ruler above the page. Default: false. */\n  showRuler?: boolean;\n  /** Show the menu bar (default: true). */\n  showMenuBar?: boolean;\n  /** Show the status bar at the bottom (default: true). */\n  showStatusBar?: boolean;\n\n  /** Initial filename shown in the title bar. */\n  filename?: string;\n  /** Called when the user edits the filename in the title bar. */\n  onFilenameChange?: (filename: string) => void;\n  /**\n   * Host chrome for the header's right-hand action area. Two shapes:\n   *   - a bare `React.ReactNode` — rendered once, right after the\n   *     Editing/Suggesting/Viewing pill (unchanged historical behavior); or\n   *   - `HeaderActionItem[]` — each `{ id, node, placement }` dropped into a\n   *     named slot among the built-in buttons (`placement` slots:\n   *     `start`, `before-open`, `after-open`, `after-save`,\n   *     `after-export-pdf`, `after-history`, `before-mode`, `after-mode`\n   *     (default), `end`), so app buttons can be interleaved with\n   *     Open/Save/Export/History and the mode pill rather than only appended.\n   * Desktop (`layout: 'desktop'`) header only.\n   */\n  titleBarActions?: React.ReactNode | HeaderActionItem[];\n  /**\n   * Hide individual built-in header buttons — `{ open?, save?, exportPdf? }`,\n   * each `true` to hide. Lets an app that opens/saves through its own flow\n   * (e.g. a document manager, not a local file download) drop the built-in\n   * buttons without CSS overrides. Desktop header only; the History button is\n   * governed by `history` instead.\n   */\n  hideDefaultHeaderActions?: HeaderDefaultActionToggles;\n\n  /**\n   * Override what the \"Export PDF\" button/menu item does. Defaults to\n   * `editor.printToPdf()` (the browser's print dialog — works with no\n   * server or extra dependency). Pass this to swap in a server-rendered\n   * pipeline instead: send `editor.getExportSnapshot()` to a server that\n   * calls `renderHtmlToPdf()` (`@shashimadushan/docx-editor-editor/headless`, via\n   * Puppeteer/Playwright) for higher-fidelity, no-user-interaction export.\n   */\n  onExportPdf?: (editor: DocxEditor) => void;\n\n  /**\n   * Edit-history sidebar config, shown via a \"History\" button right after\n   * \"Export PDF\" — a docked, collapsible panel (like the AI agent sidebar)\n   * that shrinks the editor's width when open rather than overlaying it.\n   * `false` hides the button and disables checkpoint recording entirely.\n   * Omitted (default) shows the button backed by `LocalStorageHistoryAdapter`.\n   * See `HistoryManagerOptions` (`./history.ts`) for `storage`/`key`/`maxEntries`.\n   */\n  history?: false | HistoryManagerOptions;\n\n  /** Extra items appended to the end of the default toolbar. Desktop (`layout: 'desktop'`) only — see `mobileToolbarExtraItems` for `layout: 'mobile'`. */\n  toolbarExtraItems?: React.ReactNode;\n  /** Extra groups prepended to the beginning of the default toolbar. Desktop only — see `mobileToolbarExtraItems`. */\n  toolbarExtraGroups?: React.ReactNode;\n\n  /**\n   * `MobileToolbar`'s (`layout: 'mobile'`) equivalent of `toolbarExtraItems`\n   * — appended after the built-in Insert-tab group. Data-only (`id`/`label`,\n   * no `ReactNode`) rather than the desktop slot's arbitrary-content shape,\n   * since `layout: 'mobile'`'s primary consumer\n   * (`@shashimadushan/docx-editor-react-native`) needs to describe these\n   * from a JSON config channel, not live React elements — see that\n   * package's `toolbarItems` prop.\n   */\n  mobileToolbarExtraItems?: Array<{ id: string; label: string }>;\n  /** Fired when a `mobileToolbarExtraItems` entry is tapped, with that item's `id`. */\n  onMobileToolbarExtraItemPress?: (id: string) => void;\n\n  /**\n   * Host-provided rows added to the mobile \"⋯\" menu sheet (`layout: 'mobile'`\n   * only) — the extension point for app-level actions the editor knows\n   * nothing about, e.g. \"Save to Drive\". Each section chooses whether it\n   * merges into the built-in File card or renders as its own card; see\n   * `MobileMenuSection`. Data-only for the same reason as\n   * `mobileToolbarExtraItems`: `@shashimadushan/docx-editor-react-native`\n   * describes these over a JSON config channel, not as live React elements.\n   */\n  mobileMenuSections?: MobileMenuSection[];\n  /** Fired when a `mobileMenuSections` item is tapped, with that item's `id`. */\n  onMobileMenuItemPress?: (id: string) => void;\n\n  /**\n   * Templates the user can manually browse and insert via a \"Templates\"\n   * dropdown right after the toolbar's History (Undo/Redo) group (e.g. pass\n   * `builtinLegalTemplates` from `@shashimadushan/docx-editor-legal-templates`, mapped to\n   * `{ id, title, category, description }`). Omit to hide the dropdown.\n   */\n  templates?: TemplatePickerItem[];\n  /**\n   * Called with the chosen template's `id` when the user picks one from the\n   * Templates dropdown. Typical implementation: look up the template, call\n   * `renderLegalTemplate(template, {})` from `@shashimadushan/docx-editor-legal-templates`\n   * (empty field values are fine — unfilled fields render as `[Field Label]`\n   * placeholders the user then edits by hand), and insert the result with\n   * `editor.editor.chain().focus().insertContent(rendered).run()`.\n   */\n  onInsertTemplate?: (templateId: string) => void;\n\n  /**\n   * Reusable boilerplate clauses the user can manually browse and insert via\n   * a \"Clauses\" dropdown right after Templates (e.g. pass\n   * `builtinLegalClauses` from `@shashimadushan/docx-editor-legal-templates`,\n   * mapped to `{ id, title, category: c.applicableTo[0], description }`).\n   * Omit to hide the dropdown.\n   */\n  clauses?: TemplatePickerItem[];\n  /**\n   * Called with the chosen clause's `id` when the user picks one from the\n   * Clauses dropdown. Typical implementation: look up the clause (e.g. via\n   * `getLegalClause(id)`) and insert its `body` with\n   * `editor.editor.chain().focus().insertContent(clause.body).run()`.\n   */\n  onInsertClause?: (clauseId: string) => void;\n\n  /**\n   * Enable the built-in right-click context menus (page menu / selection\n   * formatting menu / image menu) plus the link \"Insert link\" dialog and\n   * hover preview card. Default: true.\n   */\n  enableContextMenu?: boolean;\n\n  /**\n   * Enable the \"@\" agent mention: typing \"@\" in the document opens a small\n   * menu with an \"Agent\" item; selecting it opens an input bubble that\n   * sends the typed instruction to `agent.sendMessage(prompt)`. Pass a\n   * `{ sendMessage }` adapter backed by `@shashimadushan/docx-editor-agent`'s\n   * `useDocxAgent()` hook (`{ sendMessage: run }`), or any object with a\n   * matching method. Omit this prop to disable the feature entirely —\n   * typing \"@\" then behaves like a normal character.\n   */\n  agent?: AgentMentionAdapter;\n\n  /**\n   * Adds \"Add to agent\" to the right-click menu shown on a text selection.\n   * Called with the selected text plus where it is in the document (page/\n   * line) — the typical implementation opens the host app's agent sidebar\n   * (`AgentPanel`) and attaches it as a context chip (e.g. via `AgentPanel`'s\n   * `context` prop, which shows an editable \"Page 2, Line 5\" chip above the\n   * input instead of dumping the quoted text into it). Omit to hide the\n   * menu item.\n   *\n   * \"Edit with AI\" (also on the selection right-click menu) needs no\n   * separate prop — it reuses the `agent` adapter above to open the same\n   * in-document bubble the \"@\" mention uses, seeded with the selection as\n   * context, and is only shown when `agent` is configured.\n   */\n  onAddSelectionToAgent?: (info: SelectionContextInfo) => void;\n\n  /**\n   * Text-anchored comment threads: select text to leave a comment (with\n   * \"@\" mention autocomplete), browse every thread in a draggable panel\n   * toggled from a bubble pinned to the page margin. Thread content is\n   * persisted through `storage` (defaults to an in-memory adapter, so\n   * comments are lost on reload unless you supply one — e.g.\n   * `LocalStorageCommentsAdapter` or a custom `CommentsStorageAdapter`\n   * backed by IndexedDB/a real API). Pass `false` to disable the feature\n   * entirely.\n   */\n  comments?: false | {\n    storage?: CommentsStorageAdapter;\n    mentionableUsers?: CommentMentionUser[];\n    currentAuthor?: string;\n    /**\n     * `'host'` suppresses the built-in draggable/sheet `CommentsPanel` —\n     * the toggle bubble and \"Add comment\" selection trigger keep rendering\n     * (their position depends on document layout only this component\n     * knows), but every open/thread-list/expanded/pending-composer change\n     * is reported via `onHostOpen` instead, so a host app (e.g.\n     * `@shashimadushan/docx-editor-react-native`'s `CommentsSheet`) can\n     * render its own native equivalent. Actions come back via\n     * `hostCommand`. Default `'panel'` — today's behavior, unchanged.\n     */\n    presentation?: 'panel' | 'host';\n    onHostOpen?: (state: CommentsHostViewState) => void;\n    hostCommand?: CommentsHostCommand;\n  };\n\n  /**\n   * Switch the entire header/toolbar chrome to a touch-friendly mobile\n   * layout: `MobileHeader` (folded filename + a \"⋯\" sheet with File/View\n   * actions) replaces the `TitleBar`/`HeaderActions` row and the desktop\n   * `MenuBar` is skipped entirely, and `MobileToolbar` (tabbed Home/Insert/\n   * Table/Image, 44px touch targets) replaces `Toolbar`. A floating\n   * `SelectionFormatBar` also appears above any non-empty text selection,\n   * the touch equivalent of \"select text, right-click to format.\"\n   *\n   * Sets `data-de-layout` on the host div, which is the *only* CSS gate for\n   * every mobile style partial (`styles/mobile/*.css`, all scoped under\n   * `.docx-editor-react[data-de-layout=\"mobile\"]`) — so omitting this prop\n   * (default `'desktop'`) reproduces today's desktop rendering exactly,\n   * with zero behavior change for existing consumers.\n   */\n  layout?: 'desktop' | 'mobile';\n}\n\nexport function ReactDocxEditor(props: ReactDocxEditorProps): React.ReactElement {\n  const {\n    content,\n    className,\n    style,\n    theme,\n    pageSetup,\n    editable,\n    disableBuiltins,\n    extensions,\n    tiptapExtensions,\n    placeholder,\n    mode,\n    onUpdate,\n    onReady,\n    renderToolbar,\n    renderTitleBar,\n    renderMenuBar,\n    renderStatusBar,\n    showTitleBar = true,\n    showRuler = false,\n    showMenuBar = true,\n    showStatusBar = true,\n    filename,\n    onFilenameChange,\n    titleBarActions,\n    hideDefaultHeaderActions,\n    onExportPdf,\n    history,\n    toolbarExtraItems,\n    toolbarExtraGroups,\n    mobileToolbarExtraItems,\n    onMobileToolbarExtraItemPress,\n    mobileMenuSections,\n    onMobileMenuItemPress,\n    templates,\n    onInsertTemplate,\n    clauses,\n    onInsertClause,\n    enableContextMenu = true,\n    agent,\n    onAddSelectionToAgent,\n    comments,\n    layout = 'desktop',\n  } = props;\n\n  // \"Edit with AI\" request from the selection right-click menu — flows into\n  // AgentMentionView's `externalTrigger`, which opens the same bubble the\n  // \"@\" mention uses (see AgentMention.tsx) without touching the selection.\n  const [editWithAIRequest, setEditWithAIRequest] = React.useState<AgentMentionExternalTrigger | null>(null);\n  const handleEditWithAI = React.useCallback((info: SelectionContextInfo & { left: number; top: number }) => {\n    setEditWithAIRequest({\n      nonce: Date.now(),\n      left: info.left,\n      top: info.top,\n      contextText: info.text,\n      contextLabel: formatSelectionLabel(info),\n    });\n  }, []);\n\n  // Mobile's \"Comment\" button on `SelectionFormatBar` — bumps a nonce\n  // `CommentsLayer` watches (`commentRequest`) to open its composer for the\n  // current selection, since mobile doesn't render `CommentAddTrigger`\n  // (see SelectionFormatBar.tsx's `onAddComment` doc).\n  const [commentRequest, setCommentRequest] = React.useState(0);\n  const handleAddComment = React.useCallback(() => {\n    setCommentRequest((n) => n + 1);\n  }, []);\n\n  // Ctrl/Cmd+F opens the Find & Replace bar (see FindReplace.tsx).\n  const [findReplaceOpen, setFindReplaceOpen] = React.useState(false);\n  React.useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'f') {\n        e.preventDefault();\n        setFindReplaceOpen(true);\n      }\n    };\n    document.addEventListener('keydown', onKey);\n    return () => document.removeEventListener('keydown', onKey);\n  }, []);\n\n  const hostRef = React.useRef<HTMLDivElement | null>(null);\n  const editorRef = React.useRef<DocxEditor | null>(null);\n  const [editor, setEditor] = React.useState<DocxEditor | null>(null);\n  const [, setTick] = React.useState(0);\n  const forceUpdate = React.useCallback(() => setTick((t) => t + 1), []);\n\n  // Filename is shared between TitleBar (the input) and HeaderActions (what\n  // \"Save .docx\" downloads as, and what \"Open .docx\" updates on load) — see\n  // TitleBar/HeaderActions.tsx for why they're split into two components.\n  const [name, setName] = React.useState(filename ?? 'Untitled.docx');\n  React.useEffect(() => {\n    if (filename !== undefined) setName(filename);\n  }, [filename]);\n  const handleNameChange = React.useCallback(\n    (v: string) => {\n      setName(v);\n      onFilenameChange?.(v);\n    },\n    [onFilenameChange],\n  );\n\n  const onUpdateRef = React.useRef(onUpdate);\n  const onReadyRef = React.useRef(onReady);\n  onUpdateRef.current = onUpdate;\n  onReadyRef.current = onReady;\n\n  // Edit-history sidebar state — owned here (not HeaderActions) because the\n  // sidebar must sit in the body row as a flex sibling of the main column\n  // (see the return below), while the toggle button lives in the title row.\n  // `history: false` fully disables the feature (not just hides the button)\n  // — pass `null` as the editor so useDocumentHistory's effect never attaches\n  // `onCheckpoint`, rather than conditionally calling the hook (not allowed).\n  const [historyOpen, setHistoryOpen] = React.useState(false);\n  const historyOptions: HistoryManagerOptions = history || { key: 'default' };\n  const {\n    entries: historyEntries,\n    get: getHistoryEntry,\n    restore: restoreHistoryEntry,\n    remove: removeHistoryEntry,\n  } = useDocumentHistory(history === false ? null : editor, historyOptions);\n  // HistorySidebar/HistoryEntryRow take a `HistoryManagerLike` (just\n  // get/restore/remove) rather than the full HistoryManager class, so the\n  // hook's flattened API satisfies it directly with no manager instance needed.\n  const historyManager: HistoryManagerLike = React.useMemo(\n    () => ({ get: getHistoryEntry, restore: restoreHistoryEntry, remove: removeHistoryEntry }),\n    [getHistoryEntry, restoreHistoryEntry, removeHistoryEntry],\n  );\n\n  React.useEffect(() => {\n    if (!hostRef.current) return;\n    const ed = new DocxEditor({\n      element: hostRef.current,\n      content,\n      theme,\n      // Explicit prop wins; otherwise fall back to the last-saved localStorage\n      // preference; otherwise DocxEditor itself defaults to A4. Resolved here\n      // (not inside DocxEditor) so it's available before construction with no\n      // extra round trip.\n      pageSetup: pageSetup ?? loadPageSetup() ?? undefined,\n      editable,\n      disableBuiltins,\n      extensions,\n      tiptapExtensions,\n      placeholder,\n      filename,\n      onUpdate: ({ editor: e, json, html }) => {\n        onUpdateRef.current?.(json, html);\n        forceUpdate();\n      },\n      onCreate: ({ editor: e }) => {\n        onReadyRef.current?.(e);\n        forceUpdate();\n      },\n    });\n    editorRef.current = ed;\n    setEditor(ed);\n\n    const handler = () => forceUpdate();\n    ed.editor.on('selectionUpdate', handler);\n    ed.editor.on('transaction', handler);\n\n    // Attach image resize handles (shows 8 drag handles when an image is selected)\n    let detachResize: (() => void) | undefined;\n    let detachTableInteractions: (() => void) | undefined;\n    setTimeout(() => {\n      const pm = ed.getHost()?.querySelector('.ProseMirror') as HTMLElement | null;\n      if (pm) {\n        detachResize = attachImageResizeHandles(pm, (width, height) => {\n          ed.editor.chain().focus().setImageSize(width, height).run();\n        });\n        // Row resize handles + insert row/column hover buttons + table-attr sync\n        // (see table-interactions.ts for why the sync pass is needed).\n        detachTableInteractions = attachTableInteractions(pm, ed.editor);\n      }\n    }, 100);\n\n    return () => {\n      detachResize?.();\n      detachTableInteractions?.();\n      ed.editor.off('selectionUpdate', handler);\n      ed.editor.off('transaction', handler);\n      ed.destroy();\n      editorRef.current = null;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  React.useEffect(() => {\n    if (editor && editable !== undefined) {\n      editor.setEditable(editable);\n    }\n  }, [editor, editable]);\n\n  // Controlled mode (see `mode` doc comment above): only takes effect when\n  // the prop is actually passed — omitting it leaves the mode entirely up\n  // to the user via the pill's own dropdown (ModeSwitcher's uncontrolled\n  // path), so this never fights that.\n  React.useEffect(() => {\n    if (editor && mode !== undefined) {\n      editor.setMode(mode);\n    }\n  }, [editor, mode]);\n\n  const mobile = layout === 'mobile';\n\n  return (\n    <div className={'docx-editor-react ' + (className ?? '')} style={style} data-de-layout={layout}>\n      {editor && mobile && showTitleBar && (renderTitleBar ? renderTitleBar(editor) : (\n        <MobileHeader\n          editor={editor}\n          name={name}\n          onNameChange={handleNameChange}\n          mode={mode}\n          onExportPdf={onExportPdf}\n          onToggleHistory={history !== false ? () => setHistoryOpen((o) => !o) : undefined}\n          menuSections={mobileMenuSections}\n          onMenuItemPress={onMobileMenuItemPress}\n        />\n      ))}\n      {editor && !mobile && showTitleBar && (renderTitleBar ? renderTitleBar(editor) : (\n        <div className=\"docx-editor-title-row\">\n          <TitleBar editor={editor} name={name} onNameChange={handleNameChange} />\n          <div className=\"docx-editor-title-row__spacer\" />\n          <HeaderActions\n            editor={editor}\n            name={name}\n            onNameChange={handleNameChange}\n            actions={titleBarActions}\n            hideDefaultActions={hideDefaultHeaderActions}\n            onExportPdf={onExportPdf}\n            onToggleHistory={history !== false ? () => setHistoryOpen((o) => !o) : undefined}\n            mode={mode}\n          />\n        </div>\n      ))}\n      {editor && !mobile && showMenuBar && (renderMenuBar ? renderMenuBar(editor) : <MenuBar editor={editor} onExportPdf={onExportPdf} />)}\n      {editor && mobile && (renderToolbar ? renderToolbar(editor) : (\n        <MobileToolbar\n          editor={editor}\n          templates={templates}\n          onInsertTemplate={onInsertTemplate}\n          clauses={clauses}\n          onInsertClause={onInsertClause}\n          extraItems={mobileToolbarExtraItems}\n          onExtraItemPress={onMobileToolbarExtraItemPress}\n        />\n      ))}\n      {editor && !mobile && (renderToolbar ? renderToolbar(editor) : (\n        <Toolbar\n          editor={editor}\n          extraItems={toolbarExtraItems}\n          extraGroups={toolbarExtraGroups}\n          templates={templates}\n          onInsertTemplate={onInsertTemplate}\n          clauses={clauses}\n          onInsertClause={onInsertClause}\n        />\n      ))}\n      <div className=\"docx-editor-body-row\">\n        <div className=\"docx-editor-main-column\">\n          {/* Ruler lives INSIDE the main column (not above the body row) so it\n              tracks the page's available width — it shrinks/recenters together\n              with the page when the history or agent sidebar docks, instead of\n              staying centered in the full editor width and drifting out of\n              alignment. */}\n          {editor && showRuler && <Ruler editor={editor} />}\n          <div ref={hostRef} className=\"docx-editor-react-host\" style={{ flex: 1, minHeight: 0, display: 'flex' }} />\n          {editor && showStatusBar && (renderStatusBar ? renderStatusBar(editor) : (\n            mobile ? <MobileStatusBar editor={editor} /> : <StatusBar editor={editor} />\n          ))}\n        </div>\n        {editor && history !== false && (\n          <HistorySidebar\n            open={historyOpen}\n            onClose={() => setHistoryOpen(false)}\n            editor={editor}\n            manager={historyManager}\n            entries={historyEntries}\n          />\n        )}\n      </div>\n      {editor && enableContextMenu && (\n        <EditorContextMenuLayer\n          editor={editor}\n          onEditWithAI={agent ? handleEditWithAI : undefined}\n          onAddToAgent={onAddSelectionToAgent}\n        />\n      )}\n      {editor && mobile && (\n        <SelectionFormatBar\n          editor={editor}\n          onEditWithAI={agent ? handleEditWithAI : undefined}\n          onAddComment={comments !== false ? handleAddComment : undefined}\n        />\n      )}\n      {editor && agent && (\n        <AgentMentionView editor={editor} adapter={agent} externalTrigger={editWithAIRequest} mobile={mobile} />\n      )}\n      {editor && <FindReplace editor={editor} open={findReplaceOpen} onClose={() => setFindReplaceOpen(false)} />}\n      {editor && <SuggestionLayer editor={editor} />}\n      {editor && comments !== false && (\n        <CommentsLayer\n          editor={editor}\n          storage={comments && comments.storage}\n          mentionableUsers={comments ? comments.mentionableUsers : undefined}\n          currentAuthor={comments ? comments.currentAuthor : undefined}\n          mobile={mobile}\n          commentRequest={commentRequest}\n          presentation={comments ? comments.presentation : undefined}\n          onHostOpen={comments ? comments.onHostOpen : undefined}\n          hostCommand={comments ? comments.hostCommand : undefined}\n        />\n      )}\n    </div>\n  );\n}\n","/**\n * AutoSaveManager — extensible auto-save with pluggable storage backends.\n *\n * Built-in: localStorage (browser) / in-memory (server)\n * Extensible: users provide a custom StorageAdapter to save to S3, a database,\n * an API endpoint, or any other backend.\n *\n * Usage (localStorage — default):\n *   const manager = new AutoSaveManager({ key: 'my-doc-draft' });\n *   manager.start(editor);\n *   // ... later ...\n *   manager.stop();\n *\n * Usage (custom S3 backend):\n *   const s3Adapter = {\n *     async save(data: string): Promise<void> {\n *       await fetch('/api/save', { method: 'POST', body: data });\n *     },\n *     async load(): Promise<string | null> {\n *       const res = await fetch('/api/load');\n *       return res.ok ? await res.text() : null;\n *     },\n *     async clear(): Promise<void> {\n *       await fetch('/api/clear', { method: 'DELETE' });\n *     },\n *   };\n *   const manager = new AutoSaveManager({ key: 'my-doc', storage: s3Adapter });\n *   manager.start(editor);\n */\n\n/* -------------------------------------------------------------------------- */\n/* Storage adapter interface (extensible)                                     */\n/* -------------------------------------------------------------------------- */\n\nexport interface StorageAdapter {\n  /** Save data to the backend. */\n  save(data: string): Promise<void>;\n  /** Load previously-saved data. Returns null if none. */\n  load(): Promise<string | null>;\n  /** Clear saved data. */\n  clear(): Promise<void>;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Built-in adapters                                                          */\n/* -------------------------------------------------------------------------- */\n\n/** localStorage adapter (browser only). */\nexport class LocalStorageAdapter implements StorageAdapter {\n  constructor(private key: string) {}\n\n  async save(data: string): Promise<void> {\n    if (typeof localStorage === 'undefined') return;\n    localStorage.setItem(this.key, data);\n  }\n\n  async load(): Promise<string | null> {\n    if (typeof localStorage === 'undefined') return null;\n    return localStorage.getItem(this.key);\n  }\n\n  async clear(): Promise<void> {\n    if (typeof localStorage === 'undefined') return;\n    localStorage.removeItem(this.key);\n  }\n}\n\n/** In-memory adapter (for testing or server-side). */\nexport class MemoryStorageAdapter implements StorageAdapter {\n  private data: string | null = null;\n\n  async save(data: string): Promise<void> { this.data = data; }\n  async load(): Promise<string | null> { return this.data; }\n  async clear(): Promise<void> { this.data = null; }\n}\n\n/**\n * HTTP API adapter — save/load via fetch to a REST endpoint.\n * Useful for S3-backed APIs, databases, etc.\n *\n * Usage:\n *   new HttpStorageAdapter({\n *     saveUrl: '/api/documents/123/save',\n *     loadUrl: '/api/documents/123/load',\n *     clearUrl: '/api/documents/123/clear',\n *     headers: { 'Authorization': 'Bearer ...' },\n *   })\n */\nexport class HttpStorageAdapter implements StorageAdapter {\n  constructor(private opts: {\n    saveUrl: string;\n    loadUrl?: string;\n    clearUrl?: string;\n    headers?: Record<string, string>;\n  }) {}\n\n  async save(data: string): Promise<void> {\n    await fetch(this.opts.saveUrl, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', ...this.opts.headers },\n      body: JSON.stringify({ data }),\n    });\n  }\n\n  async load(): Promise<string | null> {\n    if (!this.opts.loadUrl) return null;\n    const res = await fetch(this.opts.loadUrl, { headers: this.opts.headers });\n    if (!res.ok) return null;\n    const json = await res.json();\n    return json.data ?? null;\n  }\n\n  async clear(): Promise<void> {\n    if (!this.opts.clearUrl) return;\n    await fetch(this.opts.clearUrl, { method: 'DELETE', headers: this.opts.headers });\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Auto-save status                                                           */\n/* -------------------------------------------------------------------------- */\n\nexport type AutoSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport interface AutoSaveState {\n  status: AutoSaveStatus;\n  lastSaved: Date | null;\n  error: string | null;\n  draftCount: number;\n}\n\n/* -------------------------------------------------------------------------- */\n/* AutoSaveManager                                                            */\n/* -------------------------------------------------------------------------- */\n\nexport interface AutoSaveOptions {\n  /** Unique key for this document's drafts. */\n  key: string;\n  /** Storage adapter. Defaults to LocalStorageAdapter. */\n  storage?: StorageAdapter;\n  /** Save interval in milliseconds. Default: 30000 (30s). */\n  interval?: number;\n  /** Max number of drafts to keep. Default: 10. */\n  maxDrafts?: number;\n  /** Format to save: 'json' (TipTap JSON) or 'html'. Default: 'json'. */\n  format?: 'json' | 'html';\n  /** Called whenever the save status changes. */\n  onStatusChange?: (state: AutoSaveState) => void;\n  /** Only save when the document has changed since the last save. */\n  saveOnlyOnChange?: boolean;\n}\n\nexport class AutoSaveManager {\n  private storage: StorageAdapter;\n  private interval: number;\n  private maxDrafts: number;\n  private format: 'json' | 'html';\n  private onStatusChange?: (state: AutoSaveState) => void;\n  private saveOnlyOnChange: boolean;\n\n  private timer: ReturnType<typeof setInterval> | null = null;\n  private editor: any = null;\n  private lastContent: string = '';\n  private state: AutoSaveState = {\n    status: 'idle', lastSaved: null, error: null, draftCount: 0,\n  };\n\n  constructor(opts: AutoSaveOptions) {\n    this.storage = opts.storage ?? new LocalStorageAdapter(opts.key);\n    this.interval = opts.interval ?? 30000;\n    this.maxDrafts = opts.maxDrafts ?? 10;\n    this.format = opts.format ?? 'json';\n    this.onStatusChange = opts.onStatusChange;\n    this.saveOnlyOnChange = opts.saveOnlyOnChange ?? true;\n  }\n\n  /** Start auto-saving. Call with a DocxEditor instance. */\n  start(editor: any): void {\n    this.editor = editor;\n    this.stop();\n    this.timer = setInterval(() => this.save(), this.interval);\n    this.updateState({ status: 'idle' });\n  }\n\n  /** Stop auto-saving. */\n  stop(): void {\n    if (this.timer) {\n      clearInterval(this.timer);\n      this.timer = null;\n    }\n  }\n\n  /** Manually trigger a save. */\n  async save(): Promise<void> {\n    if (!this.editor) return;\n\n    const content = this.format === 'json'\n      ? JSON.stringify(this.editor.getJSON())\n      : this.editor.getHTML();\n\n    if (this.saveOnlyOnChange && content === this.lastContent) return;\n\n    this.updateState({ status: 'saving', error: null });\n\n    try {\n      const draft = JSON.stringify({\n        content,\n        timestamp: Date.now(),\n        format: this.format,\n      });\n      await this.storage.save(draft);\n      this.lastContent = content;\n      this.updateState({\n        status: 'saved',\n        lastSaved: new Date(),\n        error: null,\n        draftCount: this.state.draftCount + 1,\n      });\n    } catch (e: any) {\n      this.updateState({\n        status: 'error',\n        error: e?.message ?? String(e),\n      });\n    }\n  }\n\n  /** Load the most recent draft. Returns null if no draft exists. */\n  async loadDraft(): Promise<{ content: string; timestamp: Date; format: 'json' | 'html' } | null> {\n    try {\n      const raw = await this.storage.load();\n      if (!raw) return null;\n      const draft = JSON.parse(raw);\n      return {\n        content: draft.content,\n        timestamp: new Date(draft.timestamp),\n        format: draft.format,\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  /** Restore the most recent draft into the editor. */\n  async restore(): Promise<boolean> {\n    if (!this.editor) return false;\n    const draft = await this.loadDraft();\n    if (!draft) return false;\n    if (draft.format === 'json') {\n      this.editor.setJSON(JSON.parse(draft.content));\n    } else {\n      this.editor.setHTML(draft.content);\n    }\n    this.lastContent = draft.content;\n    return true;\n  }\n\n  /** Clear all saved drafts. */\n  async clear(): Promise<void> {\n    await this.storage.clear();\n    this.lastContent = '';\n    this.updateState({ status: 'idle', lastSaved: null, draftCount: 0 });\n  }\n\n  /** Get current auto-save state. */\n  getState(): AutoSaveState {\n    return { ...this.state };\n  }\n\n  /** Format the last-saved time as a human-readable string. */\n  formatLastSaved(): string {\n    if (!this.state.lastSaved) return 'Never';\n    const diff = Date.now() - this.state.lastSaved.getTime();\n    if (diff < 60000) return 'Just now';\n    if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n    if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n    return this.state.lastSaved.toLocaleDateString();\n  }\n\n  private updateState(patch: Partial<AutoSaveState>): void {\n    this.state = { ...this.state, ...patch };\n    this.onStatusChange?.(this.state);\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* React hook for auto-save                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport function useAutoSave(editor: any, options: AutoSaveOptions): {\n  status: AutoSaveStatus;\n  lastSaved: Date | null;\n  error: string | null;\n  save: () => Promise<void>;\n  restore: () => Promise<boolean>;\n  clear: () => Promise<void>;\n  formatLastSaved: () => string;\n} {\n  const managerRef = React.useRef<AutoSaveManager | null>(null);\n  const [state, setState] = React.useState<AutoSaveState>({\n    status: 'idle', lastSaved: null, error: null, draftCount: 0,\n  });\n\n  if (!managerRef.current) {\n    managerRef.current = new AutoSaveManager({\n      ...options,\n      onStatusChange: setState,\n    });\n  }\n\n  React.useEffect(() => {\n    if (editor) {\n      managerRef.current!.start(editor);\n    }\n    return () => managerRef.current!.stop();\n  }, [editor]);\n\n  return {\n    status: state.status,\n    lastSaved: state.lastSaved,\n    error: state.error,\n    save: () => managerRef.current!.save(),\n    restore: () => managerRef.current!.restore(),\n    clear: () => managerRef.current!.clear(),\n    formatLastSaved: () => managerRef.current!.formatLastSaved(),\n  };\n}\n\n// Import React at the bottom for the hook\nimport * as React from 'react';\n"]}