{"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/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/index.ts","../src/io/template.ts"],"names":["n","PAGE_SIZE_PRESETS","DEFAULT_PAGE_SETUP","documentXml","stylesXml","coreXml","numberingXml","commentsXml","getJSZip","EMU_PER_PX","escapeXml","JSZip","saveDocxFromJSON","defaultTheme","SINHALA_FONT_STACK","TAMIL_FONT_STACK","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","applyRowHeight","CellSelection"],"mappings":"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","file":"index.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 * 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","// Public API surface for @shashimadushan/docx-editor-editor\n\n// Core class + options\nexport { DocxEditor, formatCursorContext } from './editor';\nexport type { DocxEditorOptions, HeaderFooterConfig, ViewMode, EditorMode, CursorContext, DocxEditorExportSnapshot } from './editor';\n\n// Edit history types (framework-agnostic — shared with @shashimadushan/docx-editor-agent)\nexport type {\n  HistorySource,\n  HistoryCheckpointMeta,\n  HistoryEntryMeta,\n  HistoryEntry,\n  HistoryStorageAdapter,\n} from './history-types';\n\n// Comments types (framework-agnostic — text-anchored comment threads)\nexport type {\n  CommentMentionUser,\n  CommentMessage,\n  CommentThread,\n  CommentsStorageAdapter,\n  CommentsHostViewState,\n  CommentsHostCommand,\n} from './comments-types';\n\n// Block-formatting helpers (block type / alignment / inline-mark annotation)\n// — shared by DocxEditor.getCursorContext() and the agent's inspection tools\n// so both surfaces describe \"what kind of block/formatting is this\" the\n// same way. See packages/editor/src/context/block-format.ts.\nexport { describeBlockType, getBlockAlignment, annotateNode, KNOWN_MARK_NAMES } from './context/block-format';\n\n// Extension system\nexport { ExtensionRegistry } from './extensions/registry';\nexport type {\n  DocxEditorExtension,\n  ToolbarButton,\n  SlashCommand,\n  ExtensionContext,\n} from './extensions/types';\nexport {\n  builtinExtensions,\n  builtinExtensionIds,\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} from './extensions/builtins';\nexport { defaultTipTapExtensions, COMMON_FONT_FAMILIES, COMMON_FONT_SIZES } from './extensions/builtins/tiptap-defaults';\n\n// Individual extensions (for advanced users building their own schema)\nexport { FontSize } from './extensions/builtins/font-size';\nexport { PageBreak } from './extensions/builtins/page-break';\nexport { DocxImage } from './extensions/builtins/docx-image';\nexport type { ImageAlignment, ImageWrap } from './extensions/builtins/docx-image';\nexport { TextTransform, LetterSpacing, LineHeight } from './extensions/builtins/text-layout';\nexport type { TextTransformValue } from './extensions/builtins/text-layout';\nexport { LegalBlock, applyLegalBlockStyles } from './extensions/builtins/legal-block';\nexport type { LegalBlockType } from './extensions/builtins/legal-block';\nexport { ImageInteractions, attachImageResizeHandles } from './extensions/builtins/image-interactions';\nexport type { ImageResizeState } from './extensions/builtins/image-interactions';\nexport { CommentMark, CommentsCore, listCommentAnchors, hasComments } from './extensions/builtins/comments';\nexport type { CommentAnchor } from './extensions/builtins/comments';\n\n// Table enhancements (style/border presets, extra attrs on Table/TableRow/\n// TableCell/TableHeader) + the row-resize/insert-button interaction layer.\nexport {\n  EnhancedTable,\n  EnhancedTableRow,\n  EnhancedTableCell,\n  EnhancedTableHeader,\n  TABLE_STYLE_PRESETS,\n  TABLE_BORDER_PRESETS,\n  insertTableFitted,\n  computeEvenColumnWidth,\n  getAvailableContentWidth,\n} from './extensions/builtins/table-enhancements';\nexport { attachTableInteractions } from './extensions/builtins/table-interactions';\n\n// Watermark\nexport {\n  type WatermarkConfig,\n  DEFAULT_WATERMARK,\n  DEFAULT_WATERMARK_PRESETS,\n  createWatermarkElement,\n} from './extensions/builtins/watermark';\n\n// .docx I/O\nexport { loadDocx, loadDocxToHTML } from './io/load';\nexport { saveDocxFromJSON } from './io/save';\nexport type { SaveDocxOptions } from './io/save';\nexport { getEditorHTML, setEditorHTML, jsonToHTML } from './io/html';\n// Embedded fonts\nexport {\n  loadEmbeddedFontsFromDocx,\n  deobfuscateFont,\n  getLoadedEmbeddedFonts,\n  clearEmbeddedFonts,\n  type EmbeddedFontResult,\n} from './io/embedded-fonts';\n\n// Template processing (docxtemplater)\nexport {\n  processTemplate,\n  processTemplateAsBlob,\n  processTemplateAndDownload,\n  getTemplateTags,\n  validateTemplate,\n  getMissingVariables,\n  previewTemplate,\n  type ProcessTemplateOptions,\n  type ProcessTemplateResult,\n  type TemplateError,\n  type TemplateValidation,\n} from './io/template';\n\n// OOXML parser (high-fidelity .docx → TipTap JSON)\nexport {\n  parseDocxOOXML,\n  readPageSetupFromDocx,\n  type ParsedOOXML,\n  type StyleDef,\n  type DocxMetadata,\n} from './io/ooxml-parser';\n\n// OOXML serializer (TipTap JSON → OOXML XML with selective patching)\nexport {\n  serializeTipTapToOOXML,\n  patchDocumentXml,\n  rezipDocx,\n  saveDocxSelective,\n  type SerializeOptions,\n  type SerializeResult,\n} from './io/ooxml-serializer';\n\n// Theme\nexport { defaultTheme, themeToCSSVars, SINHALA_FONT_STACK, TAMIL_FONT_STACK } from './theme';\nexport type { DocxEditorTheme } from './theme';\n\n// Page setup\nexport {\n  PAGE_SIZE_PRESETS,\n  DEFAULT_PAGE_SETUP,\n  resolvePageDimensions,\n  resolvePageDimensionsTwips,\n  pageSetupFromTwips,\n  mmToPx,\n  pxToMm,\n} from './page-setup';\nexport type { PageSetup, PageSizePreset, PageDimensionsTwips } from './page-setup';\n","/**\n * Docxtemplater plugin — template variable substitution for .docx files.\n *\n * Supports the docxtemplater syntax:\n *   - {variable}           — simple variable substitution\n *   - {#loop}...{/loop}    — repeat content for each item in an array\n *   - {#cond}...{/cond}    — conditional inclusion (truthy = show)\n *   - {-w:image}           — image substitution (with base64 data)\n *\n * All formatting (fonts, styles, colors, tables) is preserved because\n * docxtemplater operates on the raw OOXML XML, not on rendered HTML.\n *\n * Usage:\n *   import { processTemplate } from '@shashimadushan/docx-editor-editor/headless';\n *\n *   const result = processTemplate(docxBuffer, {\n *     name: 'John Doe',\n *     date: '2026-01-15',\n *     items: [{ name: 'Item 1' }, { name: 'Item 2' }],\n *   });\n *   // result.buffer = processed .docx ArrayBuffer\n *\n * Can be used server-side (no DOM required).\n */\n\n// Lazy-load dependencies\nlet PizZip: any = null;\nlet Docxtemplater: any = null;\n\nasync function loadDeps(): Promise<void> {\n  if (PizZip && Docxtemplater) return;\n  const [pizMod, docxMod] = await Promise.all([\n    import('pizzip'),\n    import('docxtemplater'),\n  ]);\n  PizZip = pizMod.default || pizMod;\n  Docxtemplater = docxMod.default || docxMod;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Types                                                                       */\n/* -------------------------------------------------------------------------- */\n\nexport interface ProcessTemplateOptions {\n  /** How to handle undefined variables: 'keep' (leave tag as-is), 'empty' (remove), 'error' (throw). Default: 'keep'. */\n  nullGetter?: 'keep' | 'empty' | 'error';\n  /** Convert \\n in values to <w:br/> (Word line breaks). Default: true. */\n  linebreaks?: boolean;\n  /** Custom delimiters (default: { and }). */\n  delimiters?: { start?: string; end?: string };\n}\n\nexport interface ProcessTemplateResult {\n  /** The processed document buffer. */\n  buffer: ArrayBuffer;\n  /** Variables that were found and replaced. */\n  replacedVariables: string[];\n  /** Variables that were not replaced (no value provided). */\n  unreplacedVariables: string[];\n  /** Any warnings during processing. */\n  warnings: string[];\n}\n\nexport interface TemplateError {\n  message: string;\n  variable?: string;\n  type: 'parse' | 'render' | 'undefined' | 'unknown';\n  originalError?: Error;\n}\n\nexport interface TemplateValidation {\n  valid: boolean;\n  errors: TemplateError[];\n  tags: string[];\n}\n\n/* -------------------------------------------------------------------------- */\n/* Main functions                                                             */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Process a DOCX template with variable substitution.\n *\n * @param buffer - The DOCX file as ArrayBuffer\n * @param variables - Map of variable names to values (strings, arrays, or nested objects)\n * @param options - Processing options\n * @returns Processed DOCX as ArrayBuffer\n */\nexport async function processTemplate(\n  buffer: ArrayBuffer,\n  variables: Record<string, unknown>,\n  options: ProcessTemplateOptions = {},\n): Promise<ProcessTemplateResult> {\n  await loadDeps();\n  const { nullGetter = 'keep', linebreaks = true, delimiters } = options;\n\n  const warnings: string[] = [];\n  const replacedVariables: string[] = [];\n  const unreplacedVariables: string[] = [];\n\n  try {\n    const zip = new PizZip(buffer);\n    const doc = new Docxtemplater(zip, {\n      paragraphLoop: true,\n      linebreaks,\n      nullGetter: (part: { value?: string }) => {\n        const varName = part.value || '';\n        if (nullGetter === 'error') {\n          throw new Error(`Undefined variable: ${varName}`);\n        }\n        if (nullGetter === 'empty') {\n          unreplacedVariables.push(varName);\n          return '';\n        }\n        unreplacedVariables.push(varName);\n        return `{${varName}}`;\n      },\n      delimiters: delimiters\n        ? { start: delimiters.start || '{', end: delimiters.end || '}' }\n        : undefined,\n    });\n\n    Object.keys(variables).forEach((key) => {\n      if (variables[key] !== undefined && variables[key] !== null) {\n        replacedVariables.push(key);\n      }\n    });\n\n    // New API: pass data to render() directly (avoids deprecated setData)\n    doc.render(variables);\n\n    const outputBuffer = doc.getZip().generate({\n      type: 'arraybuffer',\n      compression: 'DEFLATE',\n      compressionOptions: { level: 6 },\n    });\n\n    return { buffer: outputBuffer, replacedVariables, unreplacedVariables, warnings };\n  } catch (error) {\n    throw formatTemplateError(error);\n  }\n}\n\n/**\n * Process template and return as Blob (for download).\n */\nexport async function processTemplateAsBlob(\n  buffer: ArrayBuffer,\n  variables: Record<string, unknown>,\n  options: ProcessTemplateOptions = {},\n): Promise<Blob> {\n  const result = await processTemplate(buffer, variables, options);\n  return new Blob([result.buffer], {\n    type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  });\n}\n\n/**\n * Process template and trigger browser download.\n */\nexport async function processTemplateAndDownload(\n  buffer: ArrayBuffer,\n  variables: Record<string, unknown>,\n  filename: string = 'document',\n  options: ProcessTemplateOptions = {},\n): Promise<void> {\n  const blob = await processTemplateAsBlob(buffer, variables, options);\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = `${filename}.docx`;\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n  setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Validation & inspection                                                    */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Get all template tags in a document without processing.\n */\nexport async function getTemplateTags(buffer: ArrayBuffer): Promise<string[]> {\n  await loadDeps();\n  try {\n    const zip = new PizZip(buffer);\n    const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true });\n    const fullText = doc.getFullText();\n    return extractTagsFromText(fullText);\n  } catch (error) {\n    throw formatTemplateError(error);\n  }\n}\n\n/**\n * Validate that a document is a valid docxtemplater template.\n */\nexport async function validateTemplate(buffer: ArrayBuffer): Promise<TemplateValidation> {\n  await loadDeps();\n  const errors: TemplateError[] = [];\n  let tags: string[] = [];\n\n  try {\n    const zip = new PizZip(buffer);\n    const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true });\n    const fullText = doc.getFullText();\n    tags = extractTagsFromText(fullText);\n\n    const unclosed = findUnclosedTags(fullText);\n    for (const tag of unclosed) {\n      errors.push({ message: `Unclosed tag: ${tag}`, variable: tag, type: 'parse' });\n    }\n\n    return { valid: errors.length === 0, errors, tags };\n  } catch (error) {\n    errors.push(formatTemplateError(error));\n    return { valid: false, errors, tags };\n  }\n}\n\n/**\n * Check which required variables are missing.\n */\nexport function getMissingVariables(\n  tags: string[],\n  variables: Record<string, unknown>,\n): string[] {\n  return tags.filter(\n    (tag) => !(tag in variables) || variables[tag] === undefined || variables[tag] === null,\n  );\n}\n\n/**\n * Preview the document text with variables replaced (no formatting).\n */\nexport async function previewTemplate(\n  buffer: ArrayBuffer,\n  variables: Record<string, unknown>,\n): Promise<string> {\n  await loadDeps();\n  try {\n    const zip = new PizZip(buffer);\n    const doc = new Docxtemplater(zip, {\n      paragraphLoop: true,\n      linebreaks: true,\n      nullGetter: (part: { value?: string }) => `[${part.value || ''}]`,\n    });\n    doc.setData(variables);\n    doc.render();\n    return doc.getFullText();\n  } catch (error) {\n    throw formatTemplateError(error);\n  }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers                                                                    */\n/* -------------------------------------------------------------------------- */\n\nfunction extractTagsFromText(text: string): string[] {\n  const tags: string[] = [];\n  const regex = /\\{([^{}]+)\\}/g;\n  let match: RegExpExecArray | null;\n  while ((match = regex.exec(text)) !== null) {\n    const tag = match[1].trim();\n    if (tag && !tags.includes(tag)) tags.push(tag);\n  }\n  return tags.sort();\n}\n\nfunction findUnclosedTags(text: string): string[] {\n  const unclosed: string[] = [];\n  let depth = 0;\n  let currentTag = '';\n  for (const char of text) {\n    if (char === '{') { depth++; currentTag = ''; }\n    else if (char === '}') { depth--; if (depth < 0) depth = 0; }\n    else if (depth > 0) { currentTag += char; }\n  }\n  if (depth > 0 && currentTag.trim()) unclosed.push(currentTag.trim());\n  return unclosed;\n}\n\ninterface DocxTemplaterError extends Error {\n  properties?: { errors?: Array<{ message?: string; properties?: { tag?: string } }> };\n}\n\nfunction isDocxTemplaterError(error: Error): error is DocxTemplaterError {\n  return 'properties' in error && typeof (error as DocxTemplaterError).properties === 'object';\n}\n\nfunction formatTemplateError(error: unknown): TemplateError {\n  if (error instanceof Error) {\n    if (isDocxTemplaterError(error) && error.properties?.errors) {\n      const first = error.properties.errors[0];\n      return { message: first?.message || 'Template error', variable: first?.properties?.tag, type: 'render', originalError: error };\n    }\n    if (error.message.includes('undefined')) {\n      const match = error.message.match(/undefined (?:variable|tag):\\s*(\\S+)/i);\n      return { message: error.message, variable: match ? match[1] : undefined, type: 'undefined', originalError: error };\n    }\n    if (error.message.includes('parse') || error.message.includes('unclosed') || error.message.includes('syntax')) {\n      return { message: error.message, type: 'parse', originalError: error };\n    }\n    return { message: error.message, type: 'unknown', originalError: error };\n  }\n  return { message: String(error), type: 'unknown' };\n}\n"]}