@extend-ai/react-docx 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,8 +4,8 @@ React-first DOCX viewing and editing components for rendering `.docx` files in a
4
4
 
5
5
  `@extend-ai/react-docx` gives you:
6
6
 
7
- - A simple read-only viewer for rendering `.docx` files or prebuilt document models
8
- - A richer editor/controller API for building custom DOCX editing UIs
7
+ - A shared viewer for read-only previews and editable documents
8
+ - A controller API for import/export and custom DOCX editing UIs
9
9
  - Pagination, page layout, theme, tracked-change, form-field, and thumbnail hooks
10
10
  - Configurable page surface and inter-page background colors
11
11
  - A dark read-only night-reader mode that inverts document content while preserving image hues
@@ -51,13 +51,10 @@ You can also call `initWasm()` (optionally with a source) ahead of time to warm
51
51
 
52
52
  ## Main Entry Points
53
53
 
54
- The package exports two useful levels of API:
55
-
56
- 1. `ReactDocxViewer`
57
- A lightweight read-only viewer when you just want to render a document.
58
-
59
- 2. `useDocxEditor` + `DocxEditorViewer`
60
- The full controller/view split for editable or highly customized experiences.
54
+ Use `useDocxEditor` + `DocxEditorViewer` for both read-only and editable
55
+ experiences. The hook manages document state, import/export, and editing
56
+ commands; the component renders the document. Set `mode="read-only"` for
57
+ view-only use or `mode="edit"` for editing.
61
58
 
62
59
  It also re-exports lower-level document/model/layout/serializer APIs, so you can work below the UI layer when needed.
63
60
 
@@ -65,36 +62,41 @@ It also re-exports lower-level document/model/layout/serializer APIs, so you can
65
62
 
66
63
  ### Read-only viewer
67
64
 
68
- Use `ReactDocxViewer` when you want the smallest integration surface.
65
+ Starting in v0.10.0, the intended pattern for read-only viewing is
66
+ `useDocxEditor` with `DocxEditorViewer mode="read-only"`. Use the same component
67
+ with `mode="edit"` when editing is needed.
69
68
 
70
69
  ```tsx
71
- import * as React from "react";
72
- import { ReactDocxViewer } from "@extend-ai/react-docx";
70
+ import { DocxEditorViewer, useDocxEditor } from "@extend-ai/react-docx";
73
71
 
74
72
  export function ReadOnlyDocxExample() {
75
- const [file, setFile] = React.useState<ArrayBuffer | undefined>();
73
+ const editor = useDocxEditor();
76
74
 
77
75
  return (
78
76
  <div style={{ display: "grid", gap: 12 }}>
79
77
  <input
80
78
  type="file"
81
79
  accept=".docx"
82
- onChange={async (event) => {
83
- const nextFile = event.target.files?.[0];
84
- setFile(nextFile ? await nextFile.arrayBuffer() : undefined);
80
+ onChange={(event) => {
81
+ const file = event.target.files?.[0];
82
+ if (file) {
83
+ void editor.importDocxFile(file);
84
+ }
85
85
  }}
86
86
  />
87
87
 
88
- <ReactDocxViewer
89
- file={file}
90
- emptyState="Choose a DOCX file to preview."
91
- />
88
+ <DocxEditorViewer editor={editor} mode="read-only" />
92
89
  </div>
93
90
  );
94
91
  }
95
92
  ```
96
93
 
97
- You can also pass a `model` instead of a raw `.docx` file if you already have a normalized document model.
94
+ For an already parsed document, initialize the controller with
95
+ `useDocxEditor({ document })`. For a prebuilt document model, use
96
+ `useDocxEditor({ starterModel: model })`. To start from a raw buffer, call
97
+ `parseDocxForViewer(buffer)` and pass the resulting `document` to the hook.
98
+ These options set the initial document; use `editor.importDocxFile(file)` to
99
+ load a different document into an existing controller.
98
100
 
99
101
  ### Full editor/viewer
100
102
 
@@ -190,6 +192,27 @@ function FullEditor() {
190
192
  }
191
193
  ```
192
194
 
195
+ ## Responsive zoom
196
+
197
+ `DocxEditorViewer` accepts numeric percentages and responsive zoom modes.
198
+ Responsive modes remain selected while the viewer recalculates their resolved
199
+ percentage as its viewport or page layout changes.
200
+
201
+ ```tsx
202
+ <DocxEditorViewer
203
+ editor={editor}
204
+ mode="read-only"
205
+ defaultZoom="fit-width"
206
+ />
207
+ ```
208
+
209
+ Use `zoom` with `onZoomChange` for a controlled viewer, or `defaultZoom` for an
210
+ uncontrolled viewer. The available modes are `"automatic"`, `"fit-page"`, and
211
+ `"fit-width"`. Custom editor toolbars can use `editor.setZoom(level)`,
212
+ `editor.getZoom()`, and `editor.getResolvedZoom()`. When zooming in or out from
213
+ a responsive mode, calculate the next numeric percentage from
214
+ `editor.getResolvedZoom()` and pass it to `editor.setZoom()`.
215
+
193
216
  `renderPage` supports `canvas`, `blob`, and `imageBitmap` output. Pass `canvas`
194
217
  to draw into a caller-owned canvas without an encoding round trip. Its timings
195
218
  separate pagination, page mounting, rasterization, and encoding; the parsed
@@ -198,6 +221,33 @@ and embedded-font loading. Use `loadEmbeddedFonts: "defer"` to load fonts later
198
221
  through `document.loadEmbeddedFonts()`. The renderer also accepts an existing
199
222
  `DocModel` directly when the OOXML package is not needed.
200
223
 
224
+ ## Caller fonts
225
+
226
+ Fonts embedded in a DOCX load automatically by default. Caller-provided fonts
227
+ must be available in `document.fonts` before layout uses them. When adding or
228
+ removing fonts after parsing or mounting, call `refreshDocxFontMetrics()` after
229
+ the change to refresh cached text measurements and mounted viewers.
230
+
231
+ ```tsx
232
+ import { refreshDocxFontMetrics } from "@extend-ai/react-docx";
233
+
234
+ async function attachViewerFont(face: FontFace) {
235
+ await face.load();
236
+ document.fonts.add(face);
237
+ refreshDocxFontMetrics();
238
+
239
+ return () => {
240
+ document.fonts.delete(face);
241
+ refreshDocxFontMetrics();
242
+ };
243
+ }
244
+ ```
245
+
246
+ Provide matching font data and descriptors for each required weight and style.
247
+ The caller owns loading and cleanup. Load fonts before creating a standalone
248
+ `createDocxThumbnailRenderer`; after changing fonts, dispose and recreate that
249
+ renderer to refresh its captured pagination.
250
+
201
251
  ## Thumbnail Hook
202
252
 
203
253
  The library can expose page thumbnails so you can build your own page strip, mini-map, or navigation UI. Thumbnail painting can render from the live page surface when it is mounted, or from an offscreen one-page surface when viewer virtualization has unmounted that page.
@@ -93,6 +93,25 @@ function normalizeDocModel(model) {
93
93
  };
94
94
  }
95
95
 
96
+ // ../doc-model/src/table-grid.ts
97
+ function tableGridColumnBound(table) {
98
+ if (table.style?.columnWidthsTwips !== void 0) return table.style.columnWidthsTwips.length;
99
+ return Math.max(0, ...table.rows.map((row) => row.cells.reduce((total, cell) => {
100
+ const span = cell.style?.gridSpan;
101
+ return total + (Number.isFinite(span) && span > 0 ? Math.max(1, Math.floor(span)) : 1);
102
+ }, 0)));
103
+ }
104
+ function resolveTableGridSkipCount(count, gridColumnCount) {
105
+ const value = Number.isFinite(count) && count >= 0 ? Math.floor(count) : 0;
106
+ return Number.isFinite(gridColumnCount) && gridColumnCount >= value ? value : 0;
107
+ }
108
+ function tableRowGridSkipCount(table, row, edge) {
109
+ return resolveTableGridSkipCount(
110
+ edge === "before" ? row.style?.gridBefore : row.style?.gridAfter,
111
+ tableGridColumnBound(table)
112
+ );
113
+ }
114
+
96
115
  // ../doc-model/src/block-id.ts
97
116
  var nextBlockIdValue = 1;
98
117
  function allocateBlockId() {
@@ -235,6 +254,7 @@ function cloneParagraphStyle(style) {
235
254
  spacing: cloneParagraphSpacing(style.spacing),
236
255
  indent: cloneParagraphIndent(style.indent),
237
256
  borders: cloneParagraphBorderSet(style.borders),
257
+ tabStops: style.tabStops?.map((stop) => ({ ...stop })),
238
258
  dropCap: style.dropCap ? {
239
259
  ...style.dropCap
240
260
  } : void 0
@@ -246,6 +266,13 @@ function cloneTextStyle(style) {
246
266
  runBorder: style.runBorder ? { ...style.runBorder } : void 0
247
267
  } : void 0;
248
268
  }
269
+ function cloneParagraphMarkFormatting(formatting) {
270
+ return formatting ? {
271
+ defaultStyle: cloneTextStyle(formatting.defaultStyle),
272
+ characterStyle: cloneTextStyle(formatting.characterStyle),
273
+ directStyle: cloneTextStyle(formatting.directStyle)
274
+ } : void 0;
275
+ }
249
276
  function cloneParagraphNode(paragraph) {
250
277
  return cloneParagraph(paragraph);
251
278
  }
@@ -257,6 +284,12 @@ function cloneParagraph(paragraph) {
257
284
  type: "paragraph",
258
285
  blockId: paragraph.blockId,
259
286
  style: cloneParagraphStyle(paragraph.style),
287
+ paragraphMarkStyle: cloneTextStyle(paragraph.paragraphMarkStyle),
288
+ sourceParagraphMarkStyle: cloneTextStyle(paragraph.sourceParagraphMarkStyle),
289
+ sourceParagraphMarkFormatting: cloneParagraphMarkFormatting(
290
+ paragraph.sourceParagraphMarkFormatting
291
+ ),
292
+ sourceParagraphMarkPropertiesXml: paragraph.sourceParagraphMarkPropertiesXml,
260
293
  paragraphMarkDeleted: paragraph.paragraphMarkDeleted,
261
294
  sourceXml: paragraph.sourceXml,
262
295
  sourceTextPatch: paragraph.sourceTextPatch ? {
@@ -397,6 +430,28 @@ function cloneTableFloatingStyle(floating) {
397
430
  verticalAlign: floating.verticalAlign
398
431
  };
399
432
  }
433
+ function cloneTablePreferredWidth(width) {
434
+ return width ? { ...width } : void 0;
435
+ }
436
+ function cloneTableWidthSource(source) {
437
+ return source ? {
438
+ ...source,
439
+ preferredWidth: cloneTablePreferredWidth(source.preferredWidth),
440
+ inheritedPreferredWidth: cloneTablePreferredWidth(source.inheritedPreferredWidth)
441
+ } : void 0;
442
+ }
443
+ function cloneTableRowStyle(style) {
444
+ return style ? {
445
+ ...style,
446
+ widthBefore: cloneTablePreferredWidth(style.widthBefore),
447
+ widthAfter: cloneTablePreferredWidth(style.widthAfter),
448
+ sourceRowGeometry: style.sourceRowGeometry ? {
449
+ ...style.sourceRowGeometry,
450
+ widthBefore: cloneTablePreferredWidth(style.sourceRowGeometry.widthBefore),
451
+ widthAfter: cloneTablePreferredWidth(style.sourceRowGeometry.widthAfter)
452
+ } : void 0
453
+ } : void 0;
454
+ }
400
455
  function cloneTable(table) {
401
456
  return {
402
457
  type: "table",
@@ -407,7 +462,17 @@ function cloneTable(table) {
407
462
  paragraph: cloneParagraph(patch.paragraph)
408
463
  })),
409
464
  style: table.style ? {
465
+ styleId: table.style.styleId,
466
+ sourceStyleId: table.style.sourceStyleId,
410
467
  widthTwips: table.style.widthTwips,
468
+ preferredWidth: cloneTablePreferredWidth(table.style.preferredWidth),
469
+ sourceWidth: cloneTableWidthSource(table.style.sourceWidth),
470
+ alignment: table.style.alignment,
471
+ sourceAlignment: table.style.sourceAlignment,
472
+ sourceInheritedAlignment: table.style.sourceInheritedAlignment,
473
+ bidiVisual: table.style.bidiVisual,
474
+ sourceBidiVisual: table.style.sourceBidiVisual,
475
+ sourceInheritedBidiVisual: table.style.sourceInheritedBidiVisual,
411
476
  indentTwips: table.style.indentTwips,
412
477
  layout: table.style.layout,
413
478
  cellSpacingTwips: table.style.cellSpacingTwips,
@@ -418,11 +483,13 @@ function cloneTable(table) {
418
483
  } : void 0,
419
484
  rows: table.rows.map((row) => ({
420
485
  type: "table-row",
421
- style: row.style ? { ...row.style } : void 0,
486
+ style: cloneTableRowStyle(row.style),
422
487
  cells: row.cells.map((cell) => ({
423
488
  type: "table-cell",
424
489
  style: cell.style ? {
425
490
  ...cell.style,
491
+ preferredWidth: cloneTablePreferredWidth(cell.style.preferredWidth),
492
+ sourceWidth: cloneTableWidthSource(cell.style.sourceWidth),
426
493
  marginTwips: cloneTableBoxSpacing(cell.style.marginTwips),
427
494
  borders: cloneTableBorderSet(cell.style.borders)
428
495
  } : void 0,
@@ -502,6 +569,9 @@ function cloneDocModel(model) {
502
569
  borders: cloneParagraphBorderSet(style.borders)
503
570
  })),
504
571
  defaultParagraphStyleId: model.metadata.defaultParagraphStyleId,
572
+ defaultTabStopTwips: model.metadata.defaultTabStopTwips,
573
+ documentSettingsImported: model.metadata.documentSettingsImported,
574
+ lineSpacingCompatibilityImported: model.metadata.lineSpacingCompatibilityImported,
505
575
  numberingDefinitions: cloneNumberingDefinitions(
506
576
  model.metadata.numberingDefinitions
507
577
  ),
@@ -578,9 +648,13 @@ async function buildDocModelFromBytes(bytes) {
578
648
 
579
649
  export {
580
650
  normalizeDocModel,
651
+ tableGridColumnBound,
652
+ resolveTableGridSkipCount,
653
+ tableRowGridSkipCount,
581
654
  allocateBlockId,
582
655
  ensureDocModelBlockIds,
583
656
  collectDuplicateDocModelBlockIds,
657
+ cloneParagraphMarkFormatting,
584
658
  cloneParagraphNode,
585
659
  cloneTableNode,
586
660
  cloneDocModel,
@@ -588,4 +662,4 @@ export {
588
662
  buildDocModel,
589
663
  buildDocModelFromBytes
590
664
  };
591
- //# sourceMappingURL=chunk-GRQPIBJJ.js.map
665
+ //# sourceMappingURL=chunk-YT56QNGH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../doc-model/src/normalize.ts","../../doc-model/src/table-grid.ts","../../doc-model/src/block-id.ts","../../doc-model/src/clone.ts","../../doc-model/src/freeze.ts","../../doc-model/src/index.ts"],"sourcesContent":["import type {\n DocModel,\n DocNode,\n ImageRunNode,\n ParagraphChildNode,\n TableCellContentNode\n} from \"./types\";\n\nfunction normalizeUint8Array(value: unknown): Uint8Array | undefined {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (Array.isArray(value)) {\n return Uint8Array.from(value as number[]);\n }\n return undefined;\n}\n\nfunction normalizeParagraphChild(child: ParagraphChildNode): ParagraphChildNode {\n if (child.type !== \"image\") {\n return child;\n }\n\n const image = child as ImageRunNode;\n const data = normalizeUint8Array(image.data);\n if (data === image.data) {\n return child;\n }\n\n return {\n ...image,\n data\n };\n}\n\nfunction normalizeTableCellContent(node: TableCellContentNode): TableCellContentNode {\n if (node.type === \"table\") {\n return normalizeDocNode(node) as TableCellContentNode;\n }\n\n return {\n ...node,\n children: node.children.map(normalizeParagraphChild)\n };\n}\n\nfunction normalizeDocNode(node: DocNode): DocNode {\n if (node.type === \"paragraph\") {\n return {\n ...node,\n children: node.children.map(normalizeParagraphChild)\n };\n }\n\n return {\n ...node,\n rows: node.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => ({\n ...cell,\n nodes: cell.nodes.map(normalizeTableCellContent)\n }))\n }))\n };\n}\n\nexport function normalizeDocModel(model: DocModel): DocModel {\n return {\n ...model,\n nodes: model.nodes.map(normalizeDocNode),\n metadata: {\n ...model.metadata,\n headerSections: model.metadata.headerSections.map((section) => ({\n ...section,\n nodes: section.nodes.map(normalizeDocNode)\n })),\n footerSections: model.metadata.footerSections.map((section) => ({\n ...section,\n nodes: section.nodes.map(normalizeDocNode)\n })),\n sections: model.metadata.sections?.map((section) => ({\n ...section,\n headerSections: section.headerSections.map((header) => ({\n ...header,\n nodes: header.nodes.map(normalizeDocNode)\n })),\n footerSections: section.footerSections.map((footer) => ({\n ...footer,\n nodes: footer.nodes.map(normalizeDocNode)\n }))\n })),\n footnotes: model.metadata.footnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(normalizeDocNode)\n })),\n endnotes: model.metadata.endnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(normalizeDocNode)\n }))\n }\n };\n}\n","import type { TableNode, TableRowNode } from \"./types\";\n\n/** The parent grid bounds skipped-column counts without changing their source values. */\nexport function tableGridColumnBound(table: Pick<TableNode, \"style\" | \"rows\">): number {\n if (table.style?.columnWidthsTwips !== undefined) return table.style.columnWidthsTwips.length;\n return Math.max(0, ...table.rows.map((row) => row.cells.reduce((total, cell) => {\n const span = cell.style?.gridSpan;\n return total + (Number.isFinite(span) && (span as number) > 0 ? Math.max(1, Math.floor(span as number)) : 1);\n }, 0)));\n}\n\n/** Ignore skipped-grid counts that exceed the parent grid. */\nexport function resolveTableGridSkipCount(count: number | undefined, gridColumnCount: number): number {\n const value = Number.isFinite(count) && (count as number) >= 0 ? Math.floor(count as number) : 0;\n return Number.isFinite(gridColumnCount) && gridColumnCount >= value ? value : 0;\n}\n\nexport function tableRowGridSkipCount(\n table: Pick<TableNode, \"style\" | \"rows\">,\n row: TableRowNode,\n edge: \"before\" | \"after\"\n): number {\n return resolveTableGridSkipCount(\n edge === \"before\" ? row.style?.gridBefore : row.style?.gridAfter,\n tableGridColumnBound(table)\n );\n}\n","import type { DocModel, DocNode, TableCellContentNode } from \"./types\";\n\nlet nextBlockIdValue = 1;\n\n/** Returns a fresh block id, unique for the lifetime of this module instance. */\nexport function allocateBlockId(): string {\n const value = nextBlockIdValue;\n nextBlockIdValue += 1;\n return `b${value}`;\n}\n\nfunction ensureNodeBlockIds(node: DocNode | TableCellContentNode): void {\n if (!node.blockId) {\n node.blockId = allocateBlockId();\n }\n\n if (node.type !== \"table\") {\n return;\n }\n\n for (const row of node.rows) {\n for (const cell of row.cells) {\n for (const child of cell.nodes) {\n ensureNodeBlockIds(child);\n }\n }\n }\n}\n\n/**\n * Assigns a fresh block id to every paragraph/table node (body, headers,\n * footers, footnotes, endnotes, nested table content) that does not already\n * have one. Mutates the model in place and returns it.\n */\nexport function ensureDocModelBlockIds(model: DocModel): DocModel {\n model.nodes.forEach(ensureNodeBlockIds);\n\n for (const section of model.metadata.headerSections ?? []) {\n section.nodes.forEach(ensureNodeBlockIds);\n }\n for (const section of model.metadata.footerSections ?? []) {\n section.nodes.forEach(ensureNodeBlockIds);\n }\n for (const section of model.metadata.sections ?? []) {\n for (const headerSection of section.headerSections ?? []) {\n headerSection.nodes.forEach(ensureNodeBlockIds);\n }\n for (const footerSection of section.footerSections ?? []) {\n footerSection.nodes.forEach(ensureNodeBlockIds);\n }\n }\n for (const note of model.metadata.footnotes ?? []) {\n note.nodes?.forEach(ensureNodeBlockIds);\n }\n for (const note of model.metadata.endnotes ?? []) {\n note.nodes?.forEach(ensureNodeBlockIds);\n }\n\n return model;\n}\n\nfunction collectNodeBlockIds(\n node: DocNode | TableCellContentNode,\n seen: Set<string>,\n duplicates: Set<string>\n): void {\n if (node.blockId) {\n if (seen.has(node.blockId)) {\n duplicates.add(node.blockId);\n }\n seen.add(node.blockId);\n }\n\n if (node.type !== \"table\") {\n return;\n }\n\n for (const row of node.rows) {\n for (const cell of row.cells) {\n for (const child of cell.nodes) {\n collectNodeBlockIds(child, seen, duplicates);\n }\n }\n }\n}\n\n/**\n * Returns block ids that appear on more than one node within the same\n * container (body, a header/footer part, a note). Nodes without ids are\n * ignored, and the same id may legitimately recur across containers (section\n * views reference the same header/footer parts as the flat metadata lists).\n */\nexport function collectDuplicateDocModelBlockIds(model: DocModel): string[] {\n const duplicates = new Set<string>();\n\n const visitContainer = (nodes: DocNode[] | undefined): void => {\n if (!nodes) {\n return;\n }\n const seen = new Set<string>();\n nodes.forEach((node) => collectNodeBlockIds(node, seen, duplicates));\n };\n\n visitContainer(model.nodes);\n for (const section of model.metadata.headerSections ?? []) {\n visitContainer(section.nodes);\n }\n for (const section of model.metadata.footerSections ?? []) {\n visitContainer(section.nodes);\n }\n for (const note of model.metadata.footnotes ?? []) {\n visitContainer(note.nodes);\n }\n for (const note of model.metadata.endnotes ?? []) {\n visitContainer(note.nodes);\n }\n\n return Array.from(duplicates);\n}\n","import type {\n DocModel,\n DocNode,\n FooterSection,\n HeaderSection,\n NumberingDefinitionSet,\n ParagraphBorderSet,\n ParagraphBorderStyle,\n ParagraphIndent,\n ParagraphMarkFormattingSource,\n ParagraphNode,\n ParagraphNumbering,\n ParagraphSpacing,\n ParagraphStyle,\n ParagraphStyleDefinition,\n TableBorderSet,\n TableBorderStyle,\n TableBoxSpacing,\n TableCellContentNode,\n TableNode,\n TablePreferredWidth,\n TableWidthSource,\n TableRowStyle,\n TableStyle,\n TextStyle,\n} from \"./types\";\n\nfunction isParagraphCellContent(\n node: TableCellContentNode\n): node is ParagraphNode {\n return node.type === \"paragraph\";\n}\n\nfunction isTableCellContentTable(\n node: TableCellContentNode\n): node is TableNode {\n return node.type === \"table\";\n}\n\nfunction cloneTableCellContent(\n nodes: TableCellContentNode[]\n): TableCellContentNode[] {\n return nodes.map((node) => {\n if (isParagraphCellContent(node)) {\n return cloneParagraph(node);\n }\n\n if (isTableCellContentTable(node)) {\n return cloneTable(node);\n }\n\n return node;\n });\n}\n\nfunction cloneParagraphNumbering(\n numbering?: ParagraphNumbering\n): ParagraphNumbering | undefined {\n return numbering ? { ...numbering } : undefined;\n}\n\nfunction cloneParagraphSpacing(\n spacing?: ParagraphSpacing\n): ParagraphSpacing | undefined {\n return spacing ? { ...spacing } : undefined;\n}\n\nfunction cloneParagraphIndent(\n indent?: ParagraphIndent\n): ParagraphIndent | undefined {\n return indent ? { ...indent } : undefined;\n}\n\nfunction cloneParagraphBorderStyle(\n border?: ParagraphBorderStyle\n): ParagraphBorderStyle | undefined {\n return border ? { ...border } : undefined;\n}\n\nfunction cloneParagraphBorderSet(\n borders?: ParagraphBorderSet\n): ParagraphBorderSet | undefined {\n if (!borders) {\n return undefined;\n }\n\n return {\n top: cloneParagraphBorderStyle(borders.top),\n right: cloneParagraphBorderStyle(borders.right),\n bottom: cloneParagraphBorderStyle(borders.bottom),\n left: cloneParagraphBorderStyle(borders.left),\n between: cloneParagraphBorderStyle(borders.between),\n bar: cloneParagraphBorderStyle(borders.bar),\n };\n}\n\nfunction cloneParagraphStyle(\n style?: ParagraphStyle\n): ParagraphStyle | undefined {\n if (!style) {\n return undefined;\n }\n\n return {\n ...style,\n numbering: cloneParagraphNumbering(style.numbering),\n spacing: cloneParagraphSpacing(style.spacing),\n indent: cloneParagraphIndent(style.indent),\n borders: cloneParagraphBorderSet(style.borders),\n tabStops: style.tabStops?.map((stop) => ({ ...stop })),\n dropCap: style.dropCap\n ? {\n ...style.dropCap,\n }\n : undefined,\n };\n}\n\nfunction cloneTextStyle(style?: TextStyle): TextStyle | undefined {\n return style\n ? {\n ...style,\n runBorder: style.runBorder ? { ...style.runBorder } : undefined,\n }\n : undefined;\n}\n\nexport function cloneParagraphMarkFormatting(\n formatting?: ParagraphMarkFormattingSource\n): ParagraphMarkFormattingSource | undefined {\n return formatting\n ? {\n defaultStyle: cloneTextStyle(formatting.defaultStyle),\n characterStyle: cloneTextStyle(formatting.characterStyle),\n directStyle: cloneTextStyle(formatting.directStyle),\n }\n : undefined;\n}\n\nexport function cloneParagraphNode(paragraph: ParagraphNode): ParagraphNode {\n return cloneParagraph(paragraph);\n}\n\nexport function cloneTableNode(table: TableNode): TableNode {\n return cloneTable(table);\n}\n\nfunction cloneParagraph(paragraph: ParagraphNode): ParagraphNode {\n return {\n type: \"paragraph\",\n blockId: paragraph.blockId,\n style: cloneParagraphStyle(paragraph.style),\n paragraphMarkStyle: cloneTextStyle(paragraph.paragraphMarkStyle),\n sourceParagraphMarkStyle: cloneTextStyle(paragraph.sourceParagraphMarkStyle),\n sourceParagraphMarkFormatting: cloneParagraphMarkFormatting(\n paragraph.sourceParagraphMarkFormatting\n ),\n sourceParagraphMarkPropertiesXml: paragraph.sourceParagraphMarkPropertiesXml,\n paragraphMarkDeleted: paragraph.paragraphMarkDeleted,\n sourceXml: paragraph.sourceXml,\n sourceTextPatch: paragraph.sourceTextPatch\n ? {\n runs: paragraph.sourceTextPatch.runs.map((run) => ({\n style: cloneTextStyle(run.style),\n link: run.link,\n noteReference: run.noteReference\n ? { ...run.noteReference }\n : undefined,\n })),\n }\n : undefined,\n sourceRunProvenance: paragraph.sourceRunProvenance\n ? {\n runs: paragraph.sourceRunProvenance.runs.map((run) => ({\n style: cloneTextStyle(run.style),\n link: run.link,\n noteReference: run.noteReference\n ? { ...run.noteReference }\n : undefined,\n })),\n }\n : undefined,\n children: paragraph.children.map((child) => {\n if (child.type === \"text\") {\n return {\n type: \"text\" as const,\n text: child.text,\n style: cloneTextStyle(child.style),\n link: child.link,\n noteReference: child.noteReference\n ? { ...child.noteReference }\n : undefined,\n };\n }\n\n if (child.type === \"form-field\") {\n return {\n type: \"form-field\" as const,\n fieldType: child.fieldType,\n sourceKind: child.sourceKind,\n id: child.id,\n tag: child.tag,\n title: child.title,\n placeholder: child.placeholder,\n checked: child.checked,\n value: child.value,\n options: child.options?.map((option) => ({\n displayText: option.displayText,\n value: option.value,\n })),\n widget: child.widget\n ? {\n name: child.widget.name,\n enabled: child.widget.enabled,\n calcOnExit: child.widget.calcOnExit,\n text: child.widget.text\n ? {\n inputType: child.widget.text.inputType,\n defaultText: child.widget.text.defaultText,\n maxLength: child.widget.text.maxLength,\n textFormat: child.widget.text.textFormat,\n }\n : undefined,\n checkbox: child.widget.checkbox\n ? {\n defaultChecked: child.widget.checkbox.defaultChecked,\n sizeMode: child.widget.checkbox.sizeMode,\n sizePt: child.widget.checkbox.sizePt,\n }\n : undefined,\n dropdown: child.widget.dropdown\n ? {\n defaultValue: child.widget.dropdown.defaultValue,\n }\n : undefined,\n }\n : undefined,\n checkedSymbol: child.checkedSymbol,\n uncheckedSymbol: child.uncheckedSymbol,\n style: child.style ? { ...child.style } : undefined,\n link: child.link,\n sourceXml: child.sourceXml,\n };\n }\n\n return {\n type: \"image\" as const,\n src: child.src,\n alt: child.alt,\n widthPx: child.widthPx,\n heightPx: child.heightPx,\n partName: child.partName,\n contentType: child.contentType,\n data: child.data ? new Uint8Array(child.data) : undefined,\n sourceXml: child.sourceXml,\n crop: child.crop ? { ...child.crop } : undefined,\n cssFilter: child.cssFilter,\n cssOpacity: child.cssOpacity,\n floating: child.floating ? { ...child.floating } : undefined,\n syntheticTextBox: child.syntheticTextBox,\n textBoxText: child.textBoxText,\n };\n }),\n };\n}\n\nfunction cloneTableBoxSpacing(\n spacing?: TableBoxSpacing\n): TableBoxSpacing | undefined {\n if (!spacing) {\n return undefined;\n }\n\n return {\n topTwips: spacing.topTwips,\n rightTwips: spacing.rightTwips,\n bottomTwips: spacing.bottomTwips,\n leftTwips: spacing.leftTwips,\n };\n}\n\nfunction cloneTableBorderStyle(\n border?: TableBorderStyle\n): TableBorderStyle | undefined {\n if (!border) {\n return undefined;\n }\n\n return {\n type: border.type,\n color: border.color,\n sizeEighthPt: border.sizeEighthPt,\n };\n}\n\nfunction cloneTableBorderSet(\n borders?: TableBorderSet\n): TableBorderSet | undefined {\n if (!borders) {\n return undefined;\n }\n\n return {\n top: cloneTableBorderStyle(borders.top),\n right: cloneTableBorderStyle(borders.right),\n bottom: cloneTableBorderStyle(borders.bottom),\n left: cloneTableBorderStyle(borders.left),\n insideH: cloneTableBorderStyle(borders.insideH),\n insideV: cloneTableBorderStyle(borders.insideV),\n tl2br: cloneTableBorderStyle(borders.tl2br),\n tr2bl: cloneTableBorderStyle(borders.tr2bl),\n };\n}\n\nfunction cloneTableFloatingStyle(\n floating?: NonNullable<TableStyle[\"floating\"]>\n): NonNullable<TableStyle[\"floating\"]> | undefined {\n if (!floating) {\n return undefined;\n }\n\n return {\n xTwips: floating.xTwips,\n yTwips: floating.yTwips,\n leftFromTextTwips: floating.leftFromTextTwips,\n rightFromTextTwips: floating.rightFromTextTwips,\n topFromTextTwips: floating.topFromTextTwips,\n bottomFromTextTwips: floating.bottomFromTextTwips,\n horizontalAnchor: floating.horizontalAnchor,\n verticalAnchor: floating.verticalAnchor,\n horizontalAlign: floating.horizontalAlign,\n verticalAlign: floating.verticalAlign,\n };\n}\n\nfunction cloneTablePreferredWidth(\n width?: TablePreferredWidth\n): TablePreferredWidth | undefined {\n return width ? { ...width } : undefined;\n}\n\nfunction cloneTableWidthSource(\n source?: TableWidthSource\n): TableWidthSource | undefined {\n return source ? {\n ...source,\n preferredWidth: cloneTablePreferredWidth(source.preferredWidth),\n inheritedPreferredWidth: cloneTablePreferredWidth(source.inheritedPreferredWidth),\n } : undefined;\n}\n\nfunction cloneTableRowStyle(style?: TableRowStyle): TableRowStyle | undefined {\n return style ? {\n ...style,\n widthBefore: cloneTablePreferredWidth(style.widthBefore),\n widthAfter: cloneTablePreferredWidth(style.widthAfter),\n sourceRowGeometry: style.sourceRowGeometry ? {\n ...style.sourceRowGeometry,\n widthBefore: cloneTablePreferredWidth(style.sourceRowGeometry.widthBefore),\n widthAfter: cloneTablePreferredWidth(style.sourceRowGeometry.widthAfter),\n } : undefined,\n } : undefined;\n}\n\nfunction cloneTable(table: TableNode): TableNode {\n return {\n type: \"table\",\n blockId: table.blockId,\n sourceXml: table.sourceXml,\n sourceTextPatches: table.sourceTextPatches?.map((patch) => ({\n sourceParagraphXml: patch.sourceParagraphXml,\n paragraph: cloneParagraph(patch.paragraph),\n })),\n style: table.style\n ? {\n styleId: table.style.styleId,\n sourceStyleId: table.style.sourceStyleId,\n widthTwips: table.style.widthTwips,\n preferredWidth: cloneTablePreferredWidth(table.style.preferredWidth),\n sourceWidth: cloneTableWidthSource(table.style.sourceWidth),\n alignment: table.style.alignment,\n sourceAlignment: table.style.sourceAlignment,\n sourceInheritedAlignment: table.style.sourceInheritedAlignment,\n bidiVisual: table.style.bidiVisual,\n sourceBidiVisual: table.style.sourceBidiVisual,\n sourceInheritedBidiVisual: table.style.sourceInheritedBidiVisual,\n indentTwips: table.style.indentTwips,\n layout: table.style.layout,\n cellSpacingTwips: table.style.cellSpacingTwips,\n floating: cloneTableFloatingStyle(table.style.floating),\n cellMarginTwips: cloneTableBoxSpacing(table.style.cellMarginTwips),\n columnWidthsTwips: table.style.columnWidthsTwips\n ? [...table.style.columnWidthsTwips]\n : undefined,\n borders: cloneTableBorderSet(table.style.borders),\n }\n : undefined,\n rows: table.rows.map((row) => ({\n type: \"table-row\",\n style: cloneTableRowStyle(row.style),\n cells: row.cells.map((cell) => ({\n type: \"table-cell\",\n style: cell.style\n ? {\n ...cell.style,\n preferredWidth: cloneTablePreferredWidth(cell.style.preferredWidth),\n sourceWidth: cloneTableWidthSource(cell.style.sourceWidth),\n marginTwips: cloneTableBoxSpacing(cell.style.marginTwips),\n borders: cloneTableBorderSet(cell.style.borders),\n }\n : undefined,\n nodes: cloneTableCellContent(cell.nodes),\n })),\n })),\n };\n}\n\nfunction cloneDocNode(node: DocNode): DocNode {\n return node.type === \"paragraph\" ? cloneParagraph(node) : cloneTable(node);\n}\n\nfunction cloneNumberingDefinitions(\n numberingDefinitions?: NumberingDefinitionSet\n): NumberingDefinitionSet | undefined {\n if (!numberingDefinitions) {\n return undefined;\n }\n\n return {\n abstracts: numberingDefinitions.abstracts.map((abstractDefinition) => ({\n abstractNumId: abstractDefinition.abstractNumId,\n levels: abstractDefinition.levels.map((level) => ({\n ...level,\n runStyle: level.runStyle ? { ...level.runStyle } : undefined,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n })),\n })),\n instances: numberingDefinitions.instances.map((instanceDefinition) => ({\n numId: instanceDefinition.numId,\n abstractNumId: instanceDefinition.abstractNumId,\n levelStartOverrides: instanceDefinition.levelStartOverrides\n ? { ...instanceDefinition.levelStartOverrides }\n : undefined,\n levelOverrides: instanceDefinition.levelOverrides\n ? instanceDefinition.levelOverrides.map((level) => ({\n ...level,\n runStyle: level.runStyle ? { ...level.runStyle } : undefined,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n }))\n : undefined,\n })),\n };\n}\n\nexport function cloneDocModel(model: DocModel): DocModel {\n return {\n nodes: model.nodes.map(cloneDocNode),\n metadata: {\n sourceParts: model.metadata.sourceParts,\n warnings: [...model.metadata.warnings],\n documentPageCount: model.metadata.documentPageCount,\n documentOpenTag: model.metadata.documentOpenTag,\n documentBackgroundColor: model.metadata.documentBackgroundColor,\n sectionPropertiesXml: model.metadata.sectionPropertiesXml,\n sections: model.metadata.sections?.map((section) => ({\n startNodeIndex: section.startNodeIndex,\n sectionPropertiesXml: section.sectionPropertiesXml,\n headerSections: (section.headerSections ?? []).map((headerSection) => ({\n partName: headerSection.partName,\n referenceType: headerSection.referenceType,\n nodes: headerSection.nodes.map(cloneDocNode),\n })),\n footerSections: (section.footerSections ?? []).map((footerSection) => ({\n partName: footerSection.partName,\n referenceType: footerSection.referenceType,\n nodes: footerSection.nodes.map(cloneDocNode),\n })),\n })),\n headerSections: (model.metadata.headerSections ?? []).map((section) => ({\n partName: section.partName,\n referenceType: section.referenceType,\n nodes: section.nodes.map(cloneDocNode),\n })),\n footerSections: (model.metadata.footerSections ?? []).map((section) => ({\n partName: section.partName,\n referenceType: section.referenceType,\n nodes: section.nodes.map(cloneDocNode),\n })),\n paragraphStyles: (model.metadata.paragraphStyles ?? []).map((style) => ({\n ...style,\n runStyle: style.runStyle ? { ...style.runStyle } : undefined,\n numbering: cloneParagraphNumbering(style.numbering),\n spacing: cloneParagraphSpacing(style.spacing),\n indent: cloneParagraphIndent(style.indent),\n borders: cloneParagraphBorderSet(style.borders),\n })),\n defaultParagraphStyleId: model.metadata.defaultParagraphStyleId,\n defaultTabStopTwips: model.metadata.defaultTabStopTwips,\n documentSettingsImported: model.metadata.documentSettingsImported,\n lineSpacingCompatibilityImported: model.metadata.lineSpacingCompatibilityImported,\n numberingDefinitions: cloneNumberingDefinitions(\n model.metadata.numberingDefinitions\n ),\n compatibility: model.metadata.compatibility\n ? { ...model.metadata.compatibility }\n : undefined,\n footnotes: model.metadata.footnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n })),\n endnotes: model.metadata.endnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n })),\n comments: model.metadata.comments?.map((comment) => ({ ...comment })),\n },\n };\n}\n","import type { DocModel } from \"./types\";\n\nfunction deepFreezeValue(value: unknown): void {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n // Freezing a typed array throws; image byte payloads stay unfrozen.\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return;\n }\n if (Object.isFrozen(value)) {\n return;\n }\n\n Object.freeze(value);\n if (Array.isArray(value)) {\n for (const entry of value) {\n deepFreezeValue(entry);\n }\n return;\n }\n\n for (const key of Object.keys(value)) {\n deepFreezeValue((value as Record<string, unknown>)[key]);\n }\n}\n\n/**\n * Dev-only commit guard: freezes a committed model so in-place mutation of\n * structure shared with history snapshots throws instead of corrupting them.\n * Already-frozen subtrees are skipped, so once a model is frozen, freezing a\n * structurally shared successor only pays for the changed nodes.\n */\nexport function deepFreezeDocModel(model: DocModel): DocModel {\n deepFreezeValue(model);\n return model;\n}\n","import type { OoxmlPackage } from \"@extend-ai/react-docx-ooxml-core\";\nimport {\n mapsToWasmPackage,\n wasmBuildDocModelFromBytes,\n wasmBuildDocModelFromPackage,\n wasmPackageToMaps\n} from \"@extend-ai/react-docx-wasm\";\n\nimport { normalizeDocModel } from \"./normalize\";\nimport type { DocModel } from \"./types\";\n\nexport * from \"./types\";\nexport { resolveTableGridSkipCount, tableGridColumnBound, tableRowGridSkipCount } from \"./table-grid\";\nexport {\n allocateBlockId,\n collectDuplicateDocModelBlockIds,\n ensureDocModelBlockIds\n} from \"./block-id\";\nexport { cloneDocModel, cloneParagraphMarkFormatting, cloneParagraphNode, cloneTableNode } from \"./clone\";\nexport { deepFreezeDocModel } from \"./freeze\";\nexport { normalizeDocModel } from \"./normalize\";\n\nexport async function buildDocModel(pkg: OoxmlPackage): Promise<DocModel> {\n const wasmPackage = mapsToWasmPackage({\n parts: pkg.parts,\n binaryAssets: pkg.binaryAssets,\n warnings: pkg.warnings\n });\n const model = (await wasmBuildDocModelFromPackage(wasmPackage)) as DocModel;\n return normalizeDocModel(model);\n}\n\nexport async function buildDocModelFromBytes(bytes: ArrayBuffer | Uint8Array): Promise<{\n package: OoxmlPackage;\n model: DocModel;\n timings: { parseMs: number; buildModelMs: number; totalMs: number };\n}> {\n const startedAt = performance.now();\n const result = await wasmBuildDocModelFromBytes(bytes);\n const builtAt = performance.now();\n const { parts, binaryAssets, warnings } = wasmPackageToMaps(result.package);\n const pkg = { parts, binaryAssets, ...(warnings.length > 0 ? { warnings } : {}) };\n const model = normalizeDocModel(result.model as DocModel);\n const finishedAt = performance.now();\n const buildModelMs = result.timings.buildModelMs + finishedAt - builtAt;\n return {\n package: pkg,\n model,\n timings: {\n parseMs: Math.max(0, builtAt - startedAt - result.timings.buildModelMs),\n buildModelMs,\n totalMs: finishedAt - startedAt,\n },\n };\n}\n"],"mappings":"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","names":[]}