react-next-editor-js 0.1.0 → 0.2.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
@@ -195,6 +195,22 @@ content is unchanged.
195
195
  <Editor initialContent={docJson} readOnly /> // or mode="readonly"
196
196
  ```
197
197
 
198
+ **Display-only (no editor) — `DocumentView`.** To merely *show* a document —
199
+ in a card, a list, a preview — use `DocumentView` instead of a read-only
200
+ `Editor`. It renders the document to HTML with the shared serializer and does
201
+ **not** mount a ProseMirror `EditorView`, so it is dramatically cheaper per
202
+ instance (ideal when many documents appear on one screen). Its HTML is produced
203
+ by the package's sanitizing serializer and DOMPurify-hardened, so it is safe even
204
+ for untrusted stored JSON.
205
+
206
+ ```tsx
207
+ import { DocumentView } from 'react-next-editor-js';
208
+ import 'react-next-editor-js/styles.css';
209
+
210
+ <DocumentView value={docJson} /> // DocumentJSON, a JSON string, or null
211
+ <DocumentView value={jsonString} className="my-doc" />
212
+ ```
213
+
198
214
  **Plain-text or empty start.** `initialContent` also accepts a plain string
199
215
  (split into paragraphs) or `null` (empty document).
200
216
 
@@ -103,7 +103,20 @@ function serializeInline(content, opts) {
103
103
  // src/export/docx.ts
104
104
  var docxModulePromise = null;
105
105
  async function loadDocx() {
106
- if (!docxModulePromise) docxModulePromise = import('docx');
106
+ if (!docxModulePromise) {
107
+ const specifier = "docx";
108
+ docxModulePromise = import(
109
+ /* webpackIgnore: true */
110
+ /* @vite-ignore */
111
+ specifier
112
+ ).catch(
113
+ () => {
114
+ throw new Error(
115
+ "react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx)."
116
+ );
117
+ }
118
+ );
119
+ }
107
120
  return docxModulePromise;
108
121
  }
109
122
  var HALF_POINT = 2;
@@ -446,5 +459,5 @@ async function documentToDocxBuffer(doc, options = {}) {
446
459
  }
447
460
 
448
461
  export { documentToDocxBlob, documentToDocxBuffer, documentToText };
449
- //# sourceMappingURL=chunk-QROUNVQK.js.map
450
- //# sourceMappingURL=chunk-QROUNVQK.js.map
462
+ //# sourceMappingURL=chunk-65YACENL.js.map
463
+ //# sourceMappingURL=chunk-65YACENL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":[],"mappings":"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","file":"chunk-65YACENL.js","sourcesContent":["import type { DocumentJSON } from '../config/types';\n\n/**\n * Options governing plain-text conversion (F-6.20). Defaults follow the\n * documented structure rules: blocks separated by blank lines, list items on\n * their own lines, table cells tab-delimited, images replaced by alt text,\n * links rendered as their text.\n */\nexport interface TextConversionOptions {\n /** Append the URL after link text as \" (url)\". Default false. */\n includeLinkUrls?: boolean;\n /** Replacement for images: 'alt' uses alt text, 'omit' drops them. Default 'alt'. */\n images?: 'alt' | 'omit';\n /** Newline sequence. Default '\\n'. */\n newline?: string;\n}\n\ninterface ResolvedOptions {\n includeLinkUrls: boolean;\n images: 'alt' | 'omit';\n newline: string;\n}\n\n/**\n * Convert a ProseMirror document (JSON) to plain text (F-6.18). Pure and\n * isomorphic: identical output in the browser and on the server (F-6.19).\n */\nexport function documentToText(doc: DocumentJSON, options: TextConversionOptions = {}): string {\n const opts: ResolvedOptions = {\n includeLinkUrls: options.includeLinkUrls ?? false,\n images: options.images ?? 'alt',\n newline: options.newline ?? '\\n',\n };\n const blocks = (doc.content ?? []).map((node) => serializeBlock(node, opts, 0));\n return blocks\n .filter((b) => b !== null)\n .join(opts.newline + opts.newline)\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction serializeBlock(node: DocumentJSON, opts: ResolvedOptions, depth: number): string | null {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return serializeInline(node.content ?? [], opts);\n case 'blockquote':\n return (node.content ?? [])\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .map((line) => `> ${line}`)\n .join(opts.newline);\n case 'bullet_list':\n case 'ordered_list':\n return serializeList(node, opts, depth);\n case 'horizontal_rule':\n return '---';\n case 'page_break':\n return '\\f';\n case 'table':\n return serializeTable(node, opts);\n default:\n // Unknown block: best-effort recurse so custom nodes still contribute text.\n if (node.content) {\n return node.content\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .join(opts.newline);\n }\n return node.text ?? null;\n }\n}\n\nfunction serializeList(node: DocumentJSON, opts: ResolvedOptions, depth: number): string {\n const ordered = node.type === 'ordered_list';\n const start = ordered ? Number(node.attrs?.order ?? 1) : 0;\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n let index = start;\n\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const checked = item.attrs?.checked;\n let marker: string;\n if (checked === true) marker = '[x]';\n else if (checked === false) marker = '[ ]';\n else if (ordered) marker = `${index}.`;\n else marker = '-';\n\n const children = item.content ?? [];\n const firstBlock = children[0];\n const firstText = firstBlock ? (serializeBlock(firstBlock, opts, depth) ?? '') : '';\n lines.push(`${indent}${marker} ${firstText}`.trimEnd());\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n lines.push(serializeList(child, opts, depth + 1));\n } else {\n const text = serializeBlock(child, opts, depth + 1);\n if (text) lines.push(`${indent} ${text}`);\n }\n }\n if (ordered) index++;\n }\n return lines.join(opts.newline);\n}\n\nfunction serializeTable(node: DocumentJSON, opts: ResolvedOptions): string {\n const rows: string[] = [];\n for (const row of node.content ?? []) {\n if (row.type !== 'table_row') continue;\n const cells = (row.content ?? []).map((cell) =>\n (cell.content ?? [])\n .map((block) => serializeBlock(block, opts, 0))\n .filter((b) => b !== null)\n .join(' ')\n .replace(/\\t/g, ' '),\n );\n rows.push(cells.join('\\t'));\n }\n return rows.join(opts.newline);\n}\n\nfunction serializeInline(content: DocumentJSON[], opts: ResolvedOptions): string {\n let out = '';\n for (const node of content) {\n if (node.type === 'text') {\n let text = node.text ?? '';\n if (opts.includeLinkUrls && node.marks) {\n const link = node.marks.find((m) => m.type === 'link');\n if (link?.attrs?.href) text = `${text} (${String(link.attrs.href)})`;\n }\n out += text;\n } else if (node.type === 'hard_break') {\n out += opts.newline;\n } else if (node.type === 'image') {\n if (opts.images === 'alt') {\n const alt = node.attrs?.alt;\n if (alt) out += String(alt);\n }\n } else if (node.content) {\n out += serializeInline(node.content, opts);\n }\n }\n return out;\n}\n","import type * as DocxNamespace from 'docx';\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE, resolvePageDimensions } from '../config/defaults';\nimport { sanitizeUrl } from '../security/sanitize';\n\n/**\n * Isomorphic DOCX serializer (§8.3). Walks the document JSON and emits OOXML via\n * the `docx` library, which runs in both the browser (Blob) and Node\n * (Buffer/Stream). A per-node mapping is used so custom nodes can register their\n * own conversion (F-6.16, F-10.14). The `docx` module is imported lazily so it\n * stays out of the initial bundle (NF-2) and remains optional.\n */\n\n/** A converter for a custom node type, returning docx block elements. */\nexport type DocxNodeConverter = (\n node: DocumentJSON,\n ctx: DocxContext,\n) => unknown[];\n\nexport interface DocxExportOptions {\n page?: PageConfig;\n title?: string;\n /** Custom node converters keyed by node type name (extension mapping). */\n nodeConverters?: Record<string, DocxNodeConverter>;\n}\n\nexport interface DocxContext {\n serializeBlocks: (nodes: DocumentJSON[]) => unknown[];\n docx: DocxModule;\n}\n\ntype DocxModule = typeof DocxNamespace;\n\nlet docxModulePromise: Promise<DocxModule> | null = null;\nasync function loadDocx(): Promise<DocxModule> {\n if (!docxModulePromise) {\n // Load `docx` through a variable specifier (with bundler-ignore hints) so\n // webpack/Vite/Next don't statically resolve it at build time. Consumers who\n // never export DOCX therefore don't need `docx` installed just to bundle the\n // editor — it is loaded on demand, and throws a clear error only if a DOCX\n // export is actually attempted without it.\n const specifier = 'docx';\n docxModulePromise = import(/* webpackIgnore: true */ /* @vite-ignore */ specifier).catch(\n () => {\n throw new Error(\n \"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx).\",\n );\n },\n ) as Promise<DocxModule>;\n }\n return docxModulePromise;\n}\n\nconst HALF_POINT = 2; // docx font sizes are in half-points\nconst INDENT_TWIP_PER_LEVEL = 720; // 0.5 inch\n\nfunction toHex(value: unknown): string | null {\n const v = String(value ?? '').trim();\n const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);\n if (!m) return null;\n const hex = m[1]!;\n return hex.length === 3\n ? hex\n .split('')\n .map((c) => c + c)\n .join('')\n : hex;\n}\n\ninterface MarkJSON {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nclass DocxSerializer {\n private docx!: DocxModule;\n private numberingConfigs: unknown[] = [];\n private refCounter = 0;\n private converters: Record<string, DocxNodeConverter>;\n\n constructor(converters: Record<string, DocxNodeConverter> = {}) {\n this.converters = converters;\n }\n\n private allocListRef(ordered: boolean): string {\n const d = this.docx;\n const reference = `rne-list-${this.refCounter++}`;\n const levels = Array.from({ length: 9 }, (_, level) => {\n if (ordered) {\n const formats = [\n d.LevelFormat.DECIMAL,\n d.LevelFormat.LOWER_LETTER,\n d.LevelFormat.LOWER_ROMAN,\n ];\n return {\n level,\n format: formats[level % 3]!,\n text: `%${level + 1}.`,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n }\n const bullets = ['•', '◦', '▪'];\n return {\n level,\n format: d.LevelFormat.BULLET,\n text: bullets[level % 3]!,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n });\n this.numberingConfigs.push({ reference, levels });\n return reference;\n }\n\n /** Build run options from a text node's marks. */\n private runOptions(marks: MarkJSON[]): Record<string, unknown> {\n const d = this.docx;\n const o: Record<string, unknown> = {};\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n o.bold = true;\n break;\n case 'em':\n o.italics = true;\n break;\n case 'underline':\n o.underline = {};\n break;\n case 'strikethrough':\n o.strike = true;\n break;\n case 'superscript':\n o.superScript = true;\n break;\n case 'subscript':\n o.subScript = true;\n break;\n case 'code':\n o.font = 'Courier New';\n break;\n case 'fontFamily':\n o.font = String(mark.attrs?.family ?? '');\n break;\n case 'fontSize': {\n const size = Number(mark.attrs?.size);\n if (Number.isFinite(size) && size > 0) o.size = Math.round(size * HALF_POINT);\n break;\n }\n case 'textColor': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.color = hex;\n break;\n }\n case 'highlight': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.shading = { type: d.ShadingType.CLEAR, fill: hex };\n break;\n }\n default:\n break;\n }\n }\n return o;\n }\n\n /** Serialize inline content into docx runs / hyperlinks. */\n private inlineChildren(content: DocumentJSON[] | undefined): unknown[] {\n const d = this.docx;\n if (!content) return [];\n const out: unknown[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const marks = (node.marks ?? []) as MarkJSON[];\n const link = marks.find((m) => m.type === 'link');\n const runOpts = this.runOptions(marks.filter((m) => m.type !== 'link'));\n const run = new d.TextRun({ text: node.text ?? '', ...runOpts });\n if (link?.attrs?.href) {\n const href = sanitizeUrl(String(link.attrs.href));\n if (href) {\n out.push(new d.ExternalHyperlink({ children: [run], link: href }));\n continue;\n }\n }\n out.push(run);\n } else if (node.type === 'hard_break') {\n out.push(new d.TextRun({ break: 1 }));\n } else if (node.type === 'image') {\n const img = this.imageRun(node);\n if (img) {\n out.push(img);\n } else {\n // Remote images can't be embedded synchronously; preserve the alt text\n // (or a placeholder) so information is not silently lost (F-6.17).\n const alt = node.attrs?.alt ? String(node.attrs.alt) : '[image]';\n out.push(new d.TextRun({ text: alt, italics: true }));\n }\n }\n }\n return out;\n }\n\n private imageRun(node: DocumentJSON): unknown | null {\n const d = this.docx;\n const src = String(node.attrs?.src ?? '');\n const match = /^data:image\\/(png|jpe?g|gif|bmp);base64,([A-Za-z0-9+/=]+)$/.exec(src);\n if (!match) return null; // remote images can't be fetched synchronously; skipped\n const raw = match[1]!;\n const type = raw === 'jpeg' ? 'jpg' : raw;\n const data = base64ToUint8(match[2]!);\n const width = Number(node.attrs?.width) || 300;\n const height = Math.round(width * 0.75);\n try {\n return new d.ImageRun({\n data,\n type: type as 'png' | 'jpg' | 'gif' | 'bmp',\n transformation: { width, height },\n });\n } catch {\n return null;\n }\n }\n\n private alignment(attrs: Record<string, unknown> | undefined): unknown {\n const d = this.docx;\n switch (attrs?.align) {\n case 'center':\n return d.AlignmentType.CENTER;\n case 'right':\n return d.AlignmentType.RIGHT;\n case 'justify':\n return d.AlignmentType.JUSTIFIED;\n case 'left':\n return d.AlignmentType.LEFT;\n default:\n return undefined;\n }\n }\n\n private paragraphProps(node: DocumentJSON): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const align = this.alignment(node.attrs);\n if (align !== undefined) props.alignment = align;\n const indent = Number(node.attrs?.indent ?? 0);\n if (indent > 0) props.indent = { left: indent * INDENT_TWIP_PER_LEVEL };\n const lineHeight = Number(node.attrs?.lineHeight);\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n props.spacing = { line: Math.round(lineHeight * 240), lineRule: 'auto' };\n }\n return props;\n }\n\n private headingLevel(level: number): unknown {\n const d = this.docx;\n const map = [\n d.HeadingLevel.HEADING_1,\n d.HeadingLevel.HEADING_2,\n d.HeadingLevel.HEADING_3,\n d.HeadingLevel.HEADING_4,\n d.HeadingLevel.HEADING_5,\n d.HeadingLevel.HEADING_6,\n ];\n return map[Math.min(5, Math.max(0, level - 1))];\n }\n\n serializeBlocks(nodes: DocumentJSON[]): unknown[] {\n const out: unknown[] = [];\n for (const node of nodes) out.push(...this.serializeBlock(node));\n return out;\n }\n\n private serializeBlock(node: DocumentJSON): unknown[] {\n const d = this.docx;\n const custom = this.converters[node.type];\n if (custom) {\n return custom(node, { serializeBlocks: (n) => this.serializeBlocks(n), docx: this.docx });\n }\n switch (node.type) {\n case 'paragraph':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'heading':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n heading: this.headingLevel(Number(node.attrs?.level ?? 1)) as never,\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'blockquote':\n return (node.content ?? []).flatMap((child) => {\n const blocks = this.serializeBlock(child);\n return blocks;\n });\n case 'horizontal_rule':\n return [\n new d.Paragraph({\n border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, space: 1, color: '999999' } },\n children: [],\n }),\n ];\n case 'page_break':\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case 'bullet_list':\n case 'ordered_list':\n return this.serializeList(node, node.type === 'ordered_list', 0);\n case 'table':\n return [this.serializeTable(node)];\n default:\n if (node.content) return this.serializeBlocks(node.content);\n return [];\n }\n }\n\n private serializeList(node: DocumentJSON, ordered: boolean, level: number): unknown[] {\n const d = this.docx;\n const reference = this.allocListRef(ordered);\n const out: unknown[] = [];\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const children = item.content ?? [];\n const checked = item.attrs?.checked;\n const prefix =\n checked === true ? '☑ ' : checked === false ? '☐ ' : '';\n\n children.forEach((child, idx) => {\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n out.push(...this.serializeList(child, child.type === 'ordered_list', level + 1));\n } else if (idx === 0) {\n const runs = this.inlineChildren(child.content);\n const first = prefix ? [new d.TextRun({ text: prefix }), ...runs] : runs;\n out.push(\n new d.Paragraph({\n numbering: { reference, level },\n children: first as never,\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n indent: { left: (level + 1) * INDENT_TWIP_PER_LEVEL },\n children: this.inlineChildren(child.content) as never,\n }),\n );\n }\n });\n }\n return out;\n }\n\n private serializeTable(node: DocumentJSON): unknown {\n const d = this.docx;\n const rows = (node.content ?? [])\n .filter((row) => row.type === 'table_row')\n .map((row) => {\n const cells = (row.content ?? []).map((cell) => {\n const fill = toHex(cell.attrs?.background);\n return new d.TableCell({\n children: this.serializeBlocks(cell.content ?? []) as never,\n columnSpan: Number(cell.attrs?.colspan ?? 1) || 1,\n rowSpan: Number(cell.attrs?.rowspan ?? 1) || 1,\n ...(fill ? { shading: { type: d.ShadingType.CLEAR, fill } } : {}),\n });\n });\n return new d.TableRow({ children: cells });\n });\n return new d.Table({\n rows,\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n });\n }\n\n async build(doc: DocumentJSON, options: DocxExportOptions): Promise<unknown> {\n this.docx = await loadDocx();\n const d = this.docx;\n const page = options.page ?? DEFAULT_PAGE;\n const { width, height } = resolvePageDimensions(page);\n const children = this.serializeBlocks(doc.content ?? []);\n const mmToTwip = (mm: number) => Math.round((mm / 25.4) * 1440);\n\n return new d.Document({\n numbering: { config: this.numberingConfigs as never },\n sections: [\n {\n properties: {\n page: {\n size: { width: mmToTwip(width), height: mmToTwip(height) },\n margin: {\n top: mmToTwip(page.margins.top),\n right: mmToTwip(page.margins.right),\n bottom: mmToTwip(page.margins.bottom),\n left: mmToTwip(page.margins.left),\n },\n },\n },\n children: children as never,\n },\n ],\n });\n }\n}\n\nfunction base64ToUint8(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const binary = atob(b64);\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 // Node fallback.\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Serialize a document to a DOCX Blob for client-side download (F-6.1, F-6.6). */\nexport async function documentToDocxBlob(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Blob> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBlob(document as never);\n}\n\n/** Serialize a document to a DOCX Buffer for server-side storage (F-6.10). */\nexport async function documentToDocxBuffer(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Buffer> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBuffer(document as never);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { documentToText, documentToDocxBlob } from './chunk-QROUNVQK.js';
1
+ import { documentToText, documentToDocxBlob } from './chunk-65YACENL.js';
2
2
  import { buildPrintDocument } from './chunk-7VYJDBH7.js';
3
3
  import { DEFAULT_PAGE } from './chunk-JQXTWLHL.js';
4
4
 
@@ -110,5 +110,5 @@ function ensureExt(name, ext) {
110
110
  }
111
111
 
112
112
  export { downloadBlob, downloadText, exportDocument, printDocumentToPdf };
113
- //# sourceMappingURL=chunk-IG2YLUFW.js.map
114
- //# sourceMappingURL=chunk-IG2YLUFW.js.map
113
+ //# sourceMappingURL=chunk-ABNK7F64.js.map
114
+ //# sourceMappingURL=chunk-ABNK7F64.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["buildPrintDocument"],"mappings":"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","file":"chunk-IG2YLUFW.js","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["buildPrintDocument"],"mappings":"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","file":"chunk-ABNK7F64.js","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkNJCEHQV3_cjs = require('./chunk-NJCEHQV3.cjs');
3
+ var chunkOESUMEV7_cjs = require('./chunk-OESUMEV7.cjs');
4
4
  var chunkTI44I654_cjs = require('./chunk-TI44I654.cjs');
5
5
  var chunkU3O54IYI_cjs = require('./chunk-U3O54IYI.cjs');
6
6
 
@@ -84,7 +84,7 @@ async function exportDocument(doc, format, options = {}) {
84
84
  const base = options.filename ?? options.title ?? "document";
85
85
  switch (format) {
86
86
  case "docx": {
87
- const blob = await chunkNJCEHQV3_cjs.documentToDocxBlob(doc, { page: options.page, title: options.title });
87
+ const blob = await chunkOESUMEV7_cjs.documentToDocxBlob(doc, { page: options.page, title: options.title });
88
88
  downloadBlob(blob, ensureExt(base, "docx"));
89
89
  return;
90
90
  }
@@ -92,7 +92,7 @@ async function exportDocument(doc, format, options = {}) {
92
92
  await printDocumentToPdf(doc, { page: options.page, title: options.title });
93
93
  return;
94
94
  case "txt":
95
- downloadText(chunkNJCEHQV3_cjs.documentToText(doc, options.text), ensureExt(base, "txt"));
95
+ downloadText(chunkOESUMEV7_cjs.documentToText(doc, options.text), ensureExt(base, "txt"));
96
96
  return;
97
97
  case "html": {
98
98
  const { buildPrintDocument: buildPrintDocument2 } = await import('./html-KU2KHLRF.cjs');
@@ -115,5 +115,5 @@ exports.downloadBlob = downloadBlob;
115
115
  exports.downloadText = downloadText;
116
116
  exports.exportDocument = exportDocument;
117
117
  exports.printDocumentToPdf = printDocumentToPdf;
118
- //# sourceMappingURL=chunk-GFNFJ3FL.cjs.map
119
- //# sourceMappingURL=chunk-GFNFJ3FL.cjs.map
118
+ //# sourceMappingURL=chunk-G7ELDC53.cjs.map
119
+ //# sourceMappingURL=chunk-G7ELDC53.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["DEFAULT_PAGE","buildPrintDocument","documentToDocxBlob","documentToText"],"mappings":"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","file":"chunk-GFNFJ3FL.cjs","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["DEFAULT_PAGE","buildPrintDocument","documentToDocxBlob","documentToText"],"mappings":"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","file":"chunk-G7ELDC53.cjs","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
@@ -105,7 +105,20 @@ function serializeInline(content, opts) {
105
105
  // src/export/docx.ts
106
106
  var docxModulePromise = null;
107
107
  async function loadDocx() {
108
- if (!docxModulePromise) docxModulePromise = import('docx');
108
+ if (!docxModulePromise) {
109
+ const specifier = "docx";
110
+ docxModulePromise = import(
111
+ /* webpackIgnore: true */
112
+ /* @vite-ignore */
113
+ specifier
114
+ ).catch(
115
+ () => {
116
+ throw new Error(
117
+ "react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx)."
118
+ );
119
+ }
120
+ );
121
+ }
109
122
  return docxModulePromise;
110
123
  }
111
124
  var HALF_POINT = 2;
@@ -450,5 +463,5 @@ async function documentToDocxBuffer(doc, options = {}) {
450
463
  exports.documentToDocxBlob = documentToDocxBlob;
451
464
  exports.documentToDocxBuffer = documentToDocxBuffer;
452
465
  exports.documentToText = documentToText;
453
- //# sourceMappingURL=chunk-NJCEHQV3.cjs.map
454
- //# sourceMappingURL=chunk-NJCEHQV3.cjs.map
466
+ //# sourceMappingURL=chunk-OESUMEV7.cjs.map
467
+ //# sourceMappingURL=chunk-OESUMEV7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":["sanitizeUrl","DEFAULT_PAGE","resolvePageDimensions"],"mappings":"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","file":"chunk-OESUMEV7.cjs","sourcesContent":["import type { DocumentJSON } from '../config/types';\n\n/**\n * Options governing plain-text conversion (F-6.20). Defaults follow the\n * documented structure rules: blocks separated by blank lines, list items on\n * their own lines, table cells tab-delimited, images replaced by alt text,\n * links rendered as their text.\n */\nexport interface TextConversionOptions {\n /** Append the URL after link text as \" (url)\". Default false. */\n includeLinkUrls?: boolean;\n /** Replacement for images: 'alt' uses alt text, 'omit' drops them. Default 'alt'. */\n images?: 'alt' | 'omit';\n /** Newline sequence. Default '\\n'. */\n newline?: string;\n}\n\ninterface ResolvedOptions {\n includeLinkUrls: boolean;\n images: 'alt' | 'omit';\n newline: string;\n}\n\n/**\n * Convert a ProseMirror document (JSON) to plain text (F-6.18). Pure and\n * isomorphic: identical output in the browser and on the server (F-6.19).\n */\nexport function documentToText(doc: DocumentJSON, options: TextConversionOptions = {}): string {\n const opts: ResolvedOptions = {\n includeLinkUrls: options.includeLinkUrls ?? false,\n images: options.images ?? 'alt',\n newline: options.newline ?? '\\n',\n };\n const blocks = (doc.content ?? []).map((node) => serializeBlock(node, opts, 0));\n return blocks\n .filter((b) => b !== null)\n .join(opts.newline + opts.newline)\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction serializeBlock(node: DocumentJSON, opts: ResolvedOptions, depth: number): string | null {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return serializeInline(node.content ?? [], opts);\n case 'blockquote':\n return (node.content ?? [])\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .map((line) => `> ${line}`)\n .join(opts.newline);\n case 'bullet_list':\n case 'ordered_list':\n return serializeList(node, opts, depth);\n case 'horizontal_rule':\n return '---';\n case 'page_break':\n return '\\f';\n case 'table':\n return serializeTable(node, opts);\n default:\n // Unknown block: best-effort recurse so custom nodes still contribute text.\n if (node.content) {\n return node.content\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .join(opts.newline);\n }\n return node.text ?? null;\n }\n}\n\nfunction serializeList(node: DocumentJSON, opts: ResolvedOptions, depth: number): string {\n const ordered = node.type === 'ordered_list';\n const start = ordered ? Number(node.attrs?.order ?? 1) : 0;\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n let index = start;\n\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const checked = item.attrs?.checked;\n let marker: string;\n if (checked === true) marker = '[x]';\n else if (checked === false) marker = '[ ]';\n else if (ordered) marker = `${index}.`;\n else marker = '-';\n\n const children = item.content ?? [];\n const firstBlock = children[0];\n const firstText = firstBlock ? (serializeBlock(firstBlock, opts, depth) ?? '') : '';\n lines.push(`${indent}${marker} ${firstText}`.trimEnd());\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n lines.push(serializeList(child, opts, depth + 1));\n } else {\n const text = serializeBlock(child, opts, depth + 1);\n if (text) lines.push(`${indent} ${text}`);\n }\n }\n if (ordered) index++;\n }\n return lines.join(opts.newline);\n}\n\nfunction serializeTable(node: DocumentJSON, opts: ResolvedOptions): string {\n const rows: string[] = [];\n for (const row of node.content ?? []) {\n if (row.type !== 'table_row') continue;\n const cells = (row.content ?? []).map((cell) =>\n (cell.content ?? [])\n .map((block) => serializeBlock(block, opts, 0))\n .filter((b) => b !== null)\n .join(' ')\n .replace(/\\t/g, ' '),\n );\n rows.push(cells.join('\\t'));\n }\n return rows.join(opts.newline);\n}\n\nfunction serializeInline(content: DocumentJSON[], opts: ResolvedOptions): string {\n let out = '';\n for (const node of content) {\n if (node.type === 'text') {\n let text = node.text ?? '';\n if (opts.includeLinkUrls && node.marks) {\n const link = node.marks.find((m) => m.type === 'link');\n if (link?.attrs?.href) text = `${text} (${String(link.attrs.href)})`;\n }\n out += text;\n } else if (node.type === 'hard_break') {\n out += opts.newline;\n } else if (node.type === 'image') {\n if (opts.images === 'alt') {\n const alt = node.attrs?.alt;\n if (alt) out += String(alt);\n }\n } else if (node.content) {\n out += serializeInline(node.content, opts);\n }\n }\n return out;\n}\n","import type * as DocxNamespace from 'docx';\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE, resolvePageDimensions } from '../config/defaults';\nimport { sanitizeUrl } from '../security/sanitize';\n\n/**\n * Isomorphic DOCX serializer (§8.3). Walks the document JSON and emits OOXML via\n * the `docx` library, which runs in both the browser (Blob) and Node\n * (Buffer/Stream). A per-node mapping is used so custom nodes can register their\n * own conversion (F-6.16, F-10.14). The `docx` module is imported lazily so it\n * stays out of the initial bundle (NF-2) and remains optional.\n */\n\n/** A converter for a custom node type, returning docx block elements. */\nexport type DocxNodeConverter = (\n node: DocumentJSON,\n ctx: DocxContext,\n) => unknown[];\n\nexport interface DocxExportOptions {\n page?: PageConfig;\n title?: string;\n /** Custom node converters keyed by node type name (extension mapping). */\n nodeConverters?: Record<string, DocxNodeConverter>;\n}\n\nexport interface DocxContext {\n serializeBlocks: (nodes: DocumentJSON[]) => unknown[];\n docx: DocxModule;\n}\n\ntype DocxModule = typeof DocxNamespace;\n\nlet docxModulePromise: Promise<DocxModule> | null = null;\nasync function loadDocx(): Promise<DocxModule> {\n if (!docxModulePromise) {\n // Load `docx` through a variable specifier (with bundler-ignore hints) so\n // webpack/Vite/Next don't statically resolve it at build time. Consumers who\n // never export DOCX therefore don't need `docx` installed just to bundle the\n // editor — it is loaded on demand, and throws a clear error only if a DOCX\n // export is actually attempted without it.\n const specifier = 'docx';\n docxModulePromise = import(/* webpackIgnore: true */ /* @vite-ignore */ specifier).catch(\n () => {\n throw new Error(\n \"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx).\",\n );\n },\n ) as Promise<DocxModule>;\n }\n return docxModulePromise;\n}\n\nconst HALF_POINT = 2; // docx font sizes are in half-points\nconst INDENT_TWIP_PER_LEVEL = 720; // 0.5 inch\n\nfunction toHex(value: unknown): string | null {\n const v = String(value ?? '').trim();\n const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);\n if (!m) return null;\n const hex = m[1]!;\n return hex.length === 3\n ? hex\n .split('')\n .map((c) => c + c)\n .join('')\n : hex;\n}\n\ninterface MarkJSON {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nclass DocxSerializer {\n private docx!: DocxModule;\n private numberingConfigs: unknown[] = [];\n private refCounter = 0;\n private converters: Record<string, DocxNodeConverter>;\n\n constructor(converters: Record<string, DocxNodeConverter> = {}) {\n this.converters = converters;\n }\n\n private allocListRef(ordered: boolean): string {\n const d = this.docx;\n const reference = `rne-list-${this.refCounter++}`;\n const levels = Array.from({ length: 9 }, (_, level) => {\n if (ordered) {\n const formats = [\n d.LevelFormat.DECIMAL,\n d.LevelFormat.LOWER_LETTER,\n d.LevelFormat.LOWER_ROMAN,\n ];\n return {\n level,\n format: formats[level % 3]!,\n text: `%${level + 1}.`,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n }\n const bullets = ['•', '◦', '▪'];\n return {\n level,\n format: d.LevelFormat.BULLET,\n text: bullets[level % 3]!,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n });\n this.numberingConfigs.push({ reference, levels });\n return reference;\n }\n\n /** Build run options from a text node's marks. */\n private runOptions(marks: MarkJSON[]): Record<string, unknown> {\n const d = this.docx;\n const o: Record<string, unknown> = {};\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n o.bold = true;\n break;\n case 'em':\n o.italics = true;\n break;\n case 'underline':\n o.underline = {};\n break;\n case 'strikethrough':\n o.strike = true;\n break;\n case 'superscript':\n o.superScript = true;\n break;\n case 'subscript':\n o.subScript = true;\n break;\n case 'code':\n o.font = 'Courier New';\n break;\n case 'fontFamily':\n o.font = String(mark.attrs?.family ?? '');\n break;\n case 'fontSize': {\n const size = Number(mark.attrs?.size);\n if (Number.isFinite(size) && size > 0) o.size = Math.round(size * HALF_POINT);\n break;\n }\n case 'textColor': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.color = hex;\n break;\n }\n case 'highlight': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.shading = { type: d.ShadingType.CLEAR, fill: hex };\n break;\n }\n default:\n break;\n }\n }\n return o;\n }\n\n /** Serialize inline content into docx runs / hyperlinks. */\n private inlineChildren(content: DocumentJSON[] | undefined): unknown[] {\n const d = this.docx;\n if (!content) return [];\n const out: unknown[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const marks = (node.marks ?? []) as MarkJSON[];\n const link = marks.find((m) => m.type === 'link');\n const runOpts = this.runOptions(marks.filter((m) => m.type !== 'link'));\n const run = new d.TextRun({ text: node.text ?? '', ...runOpts });\n if (link?.attrs?.href) {\n const href = sanitizeUrl(String(link.attrs.href));\n if (href) {\n out.push(new d.ExternalHyperlink({ children: [run], link: href }));\n continue;\n }\n }\n out.push(run);\n } else if (node.type === 'hard_break') {\n out.push(new d.TextRun({ break: 1 }));\n } else if (node.type === 'image') {\n const img = this.imageRun(node);\n if (img) {\n out.push(img);\n } else {\n // Remote images can't be embedded synchronously; preserve the alt text\n // (or a placeholder) so information is not silently lost (F-6.17).\n const alt = node.attrs?.alt ? String(node.attrs.alt) : '[image]';\n out.push(new d.TextRun({ text: alt, italics: true }));\n }\n }\n }\n return out;\n }\n\n private imageRun(node: DocumentJSON): unknown | null {\n const d = this.docx;\n const src = String(node.attrs?.src ?? '');\n const match = /^data:image\\/(png|jpe?g|gif|bmp);base64,([A-Za-z0-9+/=]+)$/.exec(src);\n if (!match) return null; // remote images can't be fetched synchronously; skipped\n const raw = match[1]!;\n const type = raw === 'jpeg' ? 'jpg' : raw;\n const data = base64ToUint8(match[2]!);\n const width = Number(node.attrs?.width) || 300;\n const height = Math.round(width * 0.75);\n try {\n return new d.ImageRun({\n data,\n type: type as 'png' | 'jpg' | 'gif' | 'bmp',\n transformation: { width, height },\n });\n } catch {\n return null;\n }\n }\n\n private alignment(attrs: Record<string, unknown> | undefined): unknown {\n const d = this.docx;\n switch (attrs?.align) {\n case 'center':\n return d.AlignmentType.CENTER;\n case 'right':\n return d.AlignmentType.RIGHT;\n case 'justify':\n return d.AlignmentType.JUSTIFIED;\n case 'left':\n return d.AlignmentType.LEFT;\n default:\n return undefined;\n }\n }\n\n private paragraphProps(node: DocumentJSON): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const align = this.alignment(node.attrs);\n if (align !== undefined) props.alignment = align;\n const indent = Number(node.attrs?.indent ?? 0);\n if (indent > 0) props.indent = { left: indent * INDENT_TWIP_PER_LEVEL };\n const lineHeight = Number(node.attrs?.lineHeight);\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n props.spacing = { line: Math.round(lineHeight * 240), lineRule: 'auto' };\n }\n return props;\n }\n\n private headingLevel(level: number): unknown {\n const d = this.docx;\n const map = [\n d.HeadingLevel.HEADING_1,\n d.HeadingLevel.HEADING_2,\n d.HeadingLevel.HEADING_3,\n d.HeadingLevel.HEADING_4,\n d.HeadingLevel.HEADING_5,\n d.HeadingLevel.HEADING_6,\n ];\n return map[Math.min(5, Math.max(0, level - 1))];\n }\n\n serializeBlocks(nodes: DocumentJSON[]): unknown[] {\n const out: unknown[] = [];\n for (const node of nodes) out.push(...this.serializeBlock(node));\n return out;\n }\n\n private serializeBlock(node: DocumentJSON): unknown[] {\n const d = this.docx;\n const custom = this.converters[node.type];\n if (custom) {\n return custom(node, { serializeBlocks: (n) => this.serializeBlocks(n), docx: this.docx });\n }\n switch (node.type) {\n case 'paragraph':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'heading':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n heading: this.headingLevel(Number(node.attrs?.level ?? 1)) as never,\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'blockquote':\n return (node.content ?? []).flatMap((child) => {\n const blocks = this.serializeBlock(child);\n return blocks;\n });\n case 'horizontal_rule':\n return [\n new d.Paragraph({\n border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, space: 1, color: '999999' } },\n children: [],\n }),\n ];\n case 'page_break':\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case 'bullet_list':\n case 'ordered_list':\n return this.serializeList(node, node.type === 'ordered_list', 0);\n case 'table':\n return [this.serializeTable(node)];\n default:\n if (node.content) return this.serializeBlocks(node.content);\n return [];\n }\n }\n\n private serializeList(node: DocumentJSON, ordered: boolean, level: number): unknown[] {\n const d = this.docx;\n const reference = this.allocListRef(ordered);\n const out: unknown[] = [];\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const children = item.content ?? [];\n const checked = item.attrs?.checked;\n const prefix =\n checked === true ? '☑ ' : checked === false ? '☐ ' : '';\n\n children.forEach((child, idx) => {\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n out.push(...this.serializeList(child, child.type === 'ordered_list', level + 1));\n } else if (idx === 0) {\n const runs = this.inlineChildren(child.content);\n const first = prefix ? [new d.TextRun({ text: prefix }), ...runs] : runs;\n out.push(\n new d.Paragraph({\n numbering: { reference, level },\n children: first as never,\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n indent: { left: (level + 1) * INDENT_TWIP_PER_LEVEL },\n children: this.inlineChildren(child.content) as never,\n }),\n );\n }\n });\n }\n return out;\n }\n\n private serializeTable(node: DocumentJSON): unknown {\n const d = this.docx;\n const rows = (node.content ?? [])\n .filter((row) => row.type === 'table_row')\n .map((row) => {\n const cells = (row.content ?? []).map((cell) => {\n const fill = toHex(cell.attrs?.background);\n return new d.TableCell({\n children: this.serializeBlocks(cell.content ?? []) as never,\n columnSpan: Number(cell.attrs?.colspan ?? 1) || 1,\n rowSpan: Number(cell.attrs?.rowspan ?? 1) || 1,\n ...(fill ? { shading: { type: d.ShadingType.CLEAR, fill } } : {}),\n });\n });\n return new d.TableRow({ children: cells });\n });\n return new d.Table({\n rows,\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n });\n }\n\n async build(doc: DocumentJSON, options: DocxExportOptions): Promise<unknown> {\n this.docx = await loadDocx();\n const d = this.docx;\n const page = options.page ?? DEFAULT_PAGE;\n const { width, height } = resolvePageDimensions(page);\n const children = this.serializeBlocks(doc.content ?? []);\n const mmToTwip = (mm: number) => Math.round((mm / 25.4) * 1440);\n\n return new d.Document({\n numbering: { config: this.numberingConfigs as never },\n sections: [\n {\n properties: {\n page: {\n size: { width: mmToTwip(width), height: mmToTwip(height) },\n margin: {\n top: mmToTwip(page.margins.top),\n right: mmToTwip(page.margins.right),\n bottom: mmToTwip(page.margins.bottom),\n left: mmToTwip(page.margins.left),\n },\n },\n },\n children: children as never,\n },\n ],\n });\n }\n}\n\nfunction base64ToUint8(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const binary = atob(b64);\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 // Node fallback.\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Serialize a document to a DOCX Blob for client-side download (F-6.1, F-6.6). */\nexport async function documentToDocxBlob(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Blob> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBlob(document as never);\n}\n\n/** Serialize a document to a DOCX Buffer for server-side storage (F-6.10). */\nexport async function documentToDocxBuffer(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Buffer> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBuffer(document as never);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkGFNFJ3FL_cjs = require('../chunk-GFNFJ3FL.cjs');
4
- var chunkNJCEHQV3_cjs = require('../chunk-NJCEHQV3.cjs');
3
+ var chunkG7ELDC53_cjs = require('../chunk-G7ELDC53.cjs');
4
+ var chunkOESUMEV7_cjs = require('../chunk-OESUMEV7.cjs');
5
5
  var chunkTI44I654_cjs = require('../chunk-TI44I654.cjs');
6
6
  require('../chunk-TXPLBAH5.cjs');
7
7
  require('../chunk-5F6SPYCN.cjs');
@@ -12,31 +12,31 @@ require('../chunk-Q7SFCCGT.cjs');
12
12
 
13
13
  Object.defineProperty(exports, "downloadBlob", {
14
14
  enumerable: true,
15
- get: function () { return chunkGFNFJ3FL_cjs.downloadBlob; }
15
+ get: function () { return chunkG7ELDC53_cjs.downloadBlob; }
16
16
  });
17
17
  Object.defineProperty(exports, "downloadText", {
18
18
  enumerable: true,
19
- get: function () { return chunkGFNFJ3FL_cjs.downloadText; }
19
+ get: function () { return chunkG7ELDC53_cjs.downloadText; }
20
20
  });
21
21
  Object.defineProperty(exports, "exportDocument", {
22
22
  enumerable: true,
23
- get: function () { return chunkGFNFJ3FL_cjs.exportDocument; }
23
+ get: function () { return chunkG7ELDC53_cjs.exportDocument; }
24
24
  });
25
25
  Object.defineProperty(exports, "printDocumentToPdf", {
26
26
  enumerable: true,
27
- get: function () { return chunkGFNFJ3FL_cjs.printDocumentToPdf; }
27
+ get: function () { return chunkG7ELDC53_cjs.printDocumentToPdf; }
28
28
  });
29
29
  Object.defineProperty(exports, "documentToDocxBlob", {
30
30
  enumerable: true,
31
- get: function () { return chunkNJCEHQV3_cjs.documentToDocxBlob; }
31
+ get: function () { return chunkOESUMEV7_cjs.documentToDocxBlob; }
32
32
  });
33
33
  Object.defineProperty(exports, "documentToDocxBuffer", {
34
34
  enumerable: true,
35
- get: function () { return chunkNJCEHQV3_cjs.documentToDocxBuffer; }
35
+ get: function () { return chunkOESUMEV7_cjs.documentToDocxBuffer; }
36
36
  });
37
37
  Object.defineProperty(exports, "documentToText", {
38
38
  enumerable: true,
39
- get: function () { return chunkNJCEHQV3_cjs.documentToText; }
39
+ get: function () { return chunkOESUMEV7_cjs.documentToText; }
40
40
  });
41
41
  Object.defineProperty(exports, "buildPrintDocument", {
42
42
  enumerable: true,
@@ -1,5 +1,5 @@
1
- export { downloadBlob, downloadText, exportDocument, printDocumentToPdf } from '../chunk-IG2YLUFW.js';
2
- export { documentToDocxBlob, documentToDocxBuffer, documentToText } from '../chunk-QROUNVQK.js';
1
+ export { downloadBlob, downloadText, exportDocument, printDocumentToPdf } from '../chunk-ABNK7F64.js';
2
+ export { documentToDocxBlob, documentToDocxBuffer, documentToText } from '../chunk-65YACENL.js';
3
3
  export { buildPrintDocument, documentToHtml, printStylesheet } from '../chunk-7VYJDBH7.js';
4
4
  import '../chunk-T6FR37IC.js';
5
5
  import '../chunk-6NTSXJX4.js';
package/dist/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkDBSFCCBG_cjs = require('./chunk-DBSFCCBG.cjs');
4
- var chunkGFNFJ3FL_cjs = require('./chunk-GFNFJ3FL.cjs');
4
+ var chunkG7ELDC53_cjs = require('./chunk-G7ELDC53.cjs');
5
5
  var chunk3QWXTDLY_cjs = require('./chunk-3QWXTDLY.cjs');
6
- var chunkNJCEHQV3_cjs = require('./chunk-NJCEHQV3.cjs');
6
+ var chunkOESUMEV7_cjs = require('./chunk-OESUMEV7.cjs');
7
7
  require('./chunk-EFE6RHDL.cjs');
8
8
  var chunkODHABIIC_cjs = require('./chunk-ODHABIIC.cjs');
9
9
  var chunkTI44I654_cjs = require('./chunk-TI44I654.cjs');
@@ -612,7 +612,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
612
612
  const handle = react.useMemo(
613
613
  () => ({
614
614
  getJSON,
615
- getText: (options) => chunkNJCEHQV3_cjs.documentToText(getJSON(), options),
615
+ getText: (options) => chunkOESUMEV7_cjs.documentToText(getJSON(), options),
616
616
  getHTML: () => chunkTI44I654_cjs.documentToHtml(getJSON()),
617
617
  setContent,
618
618
  importDocx: importDocxIntoEditor,
@@ -624,7 +624,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
624
624
  clearLocalData: async () => {
625
625
  await persistenceRef.current?.clearLocal();
626
626
  },
627
- exportAs: (format, filename) => chunkGFNFJ3FL_cjs.exportDocument(getJSON(), format, {
627
+ exportAs: (format, filename) => chunkG7ELDC53_cjs.exportDocument(getJSON(), format, {
628
628
  filename: filename ?? propsRef.current.documentId,
629
629
  page: cfgRef.current.page,
630
630
  title: filename ?? propsRef.current.documentId
@@ -874,6 +874,44 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
874
874
  var Editor = react.forwardRef(function Editor2(props, ref) {
875
875
  return /* @__PURE__ */ jsxRuntime.jsx(EditorErrorBoundary, { onError: props.onError, children: /* @__PURE__ */ jsxRuntime.jsx(EditorInner, { ...props, ref }) });
876
876
  });
877
+ function toDoc(value) {
878
+ if (!value) return null;
879
+ if (typeof value === "string") {
880
+ try {
881
+ const parsed = JSON.parse(value);
882
+ return parsed?.type === "doc" ? parsed : null;
883
+ } catch {
884
+ return null;
885
+ }
886
+ }
887
+ return value.type === "doc" ? value : null;
888
+ }
889
+ function DocumentView({ value, className, style }) {
890
+ const [sanitizerReady, setSanitizerReady] = react.useState(false);
891
+ react.useEffect(() => {
892
+ let alive = true;
893
+ void chunk5F6SPYCN_cjs.preloadSanitizer().then(() => {
894
+ if (alive) setSanitizerReady(true);
895
+ });
896
+ return () => {
897
+ alive = false;
898
+ };
899
+ }, []);
900
+ const html = react.useMemo(() => {
901
+ const doc = toDoc(value);
902
+ if (!doc) return "";
903
+ const raw = chunkTI44I654_cjs.documentToHtml(doc);
904
+ return sanitizerReady ? chunk5F6SPYCN_cjs.sanitizeHtmlSync(raw) : raw;
905
+ }, [value, sanitizerReady]);
906
+ return /* @__PURE__ */ jsxRuntime.jsx(
907
+ "div",
908
+ {
909
+ className: `rne-root rne-document-view${className ? ` ${className}` : ""}`,
910
+ style,
911
+ dangerouslySetInnerHTML: { __html: html }
912
+ }
913
+ );
914
+ }
877
915
 
878
916
  Object.defineProperty(exports, "buildPlugins", {
879
917
  enumerable: true,
@@ -905,19 +943,19 @@ Object.defineProperty(exports, "defaultSchema", {
905
943
  });
906
944
  Object.defineProperty(exports, "downloadBlob", {
907
945
  enumerable: true,
908
- get: function () { return chunkGFNFJ3FL_cjs.downloadBlob; }
946
+ get: function () { return chunkG7ELDC53_cjs.downloadBlob; }
909
947
  });
910
948
  Object.defineProperty(exports, "downloadText", {
911
949
  enumerable: true,
912
- get: function () { return chunkGFNFJ3FL_cjs.downloadText; }
950
+ get: function () { return chunkG7ELDC53_cjs.downloadText; }
913
951
  });
914
952
  Object.defineProperty(exports, "exportDocument", {
915
953
  enumerable: true,
916
- get: function () { return chunkGFNFJ3FL_cjs.exportDocument; }
954
+ get: function () { return chunkG7ELDC53_cjs.exportDocument; }
917
955
  });
918
956
  Object.defineProperty(exports, "printDocumentToPdf", {
919
957
  enumerable: true,
920
- get: function () { return chunkGFNFJ3FL_cjs.printDocumentToPdf; }
958
+ get: function () { return chunkG7ELDC53_cjs.printDocumentToPdf; }
921
959
  });
922
960
  Object.defineProperty(exports, "ConflictError", {
923
961
  enumerable: true,
@@ -949,15 +987,15 @@ Object.defineProperty(exports, "requestPersistentStorage", {
949
987
  });
950
988
  Object.defineProperty(exports, "documentToDocxBlob", {
951
989
  enumerable: true,
952
- get: function () { return chunkNJCEHQV3_cjs.documentToDocxBlob; }
990
+ get: function () { return chunkOESUMEV7_cjs.documentToDocxBlob; }
953
991
  });
954
992
  Object.defineProperty(exports, "documentToDocxBuffer", {
955
993
  enumerable: true,
956
- get: function () { return chunkNJCEHQV3_cjs.documentToDocxBuffer; }
994
+ get: function () { return chunkOESUMEV7_cjs.documentToDocxBuffer; }
957
995
  });
958
996
  Object.defineProperty(exports, "documentToText", {
959
997
  enumerable: true,
960
- get: function () { return chunkNJCEHQV3_cjs.documentToText; }
998
+ get: function () { return chunkOESUMEV7_cjs.documentToText; }
961
999
  });
962
1000
  Object.defineProperty(exports, "importDocx", {
963
1001
  enumerable: true,
@@ -1023,6 +1061,7 @@ Object.defineProperty(exports, "themeToCssVars", {
1023
1061
  enumerable: true,
1024
1062
  get: function () { return chunkU3O54IYI_cjs.themeToCssVars; }
1025
1063
  });
1064
+ exports.DocumentView = DocumentView;
1026
1065
  exports.Editor = Editor;
1027
1066
  exports.EditorContext = EditorContext;
1028
1067
  exports.EditorErrorBoundary = EditorErrorBoundary;