react-next-editor-js 0.1.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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +877 -0
  3. package/dist/chunk-3QWXTDLY.cjs +486 -0
  4. package/dist/chunk-3QWXTDLY.cjs.map +1 -0
  5. package/dist/chunk-5F6SPYCN.cjs +180 -0
  6. package/dist/chunk-5F6SPYCN.cjs.map +1 -0
  7. package/dist/chunk-6NTSXJX4.js +174 -0
  8. package/dist/chunk-6NTSXJX4.js.map +1 -0
  9. package/dist/chunk-7VYJDBH7.js +261 -0
  10. package/dist/chunk-7VYJDBH7.js.map +1 -0
  11. package/dist/chunk-DBSFCCBG.cjs +1712 -0
  12. package/dist/chunk-DBSFCCBG.cjs.map +1 -0
  13. package/dist/chunk-EFE6RHDL.cjs +4 -0
  14. package/dist/chunk-EFE6RHDL.cjs.map +1 -0
  15. package/dist/chunk-G6YRIEK4.js +3 -0
  16. package/dist/chunk-G6YRIEK4.js.map +1 -0
  17. package/dist/chunk-GFNFJ3FL.cjs +119 -0
  18. package/dist/chunk-GFNFJ3FL.cjs.map +1 -0
  19. package/dist/chunk-IG2YLUFW.js +114 -0
  20. package/dist/chunk-IG2YLUFW.js.map +1 -0
  21. package/dist/chunk-JQXTWLHL.js +176 -0
  22. package/dist/chunk-JQXTWLHL.js.map +1 -0
  23. package/dist/chunk-NJCEHQV3.cjs +454 -0
  24. package/dist/chunk-NJCEHQV3.cjs.map +1 -0
  25. package/dist/chunk-O4GTLC3T.js +478 -0
  26. package/dist/chunk-O4GTLC3T.js.map +1 -0
  27. package/dist/chunk-ODHABIIC.cjs +82 -0
  28. package/dist/chunk-ODHABIIC.cjs.map +1 -0
  29. package/dist/chunk-PZ5AY32C.js +9 -0
  30. package/dist/chunk-PZ5AY32C.js.map +1 -0
  31. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  32. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  33. package/dist/chunk-QIUIYBCZ.js +80 -0
  34. package/dist/chunk-QIUIYBCZ.js.map +1 -0
  35. package/dist/chunk-QROUNVQK.js +450 -0
  36. package/dist/chunk-QROUNVQK.js.map +1 -0
  37. package/dist/chunk-T6FR37IC.js +41 -0
  38. package/dist/chunk-T6FR37IC.js.map +1 -0
  39. package/dist/chunk-TI44I654.cjs +265 -0
  40. package/dist/chunk-TI44I654.cjs.map +1 -0
  41. package/dist/chunk-TXPLBAH5.cjs +47 -0
  42. package/dist/chunk-TXPLBAH5.cjs.map +1 -0
  43. package/dist/chunk-U3O54IYI.cjs +187 -0
  44. package/dist/chunk-U3O54IYI.cjs.map +1 -0
  45. package/dist/chunk-VLC7SZMT.js +1669 -0
  46. package/dist/chunk-VLC7SZMT.js.map +1 -0
  47. package/dist/core/index.cjs +232 -0
  48. package/dist/core/index.cjs.map +1 -0
  49. package/dist/core/index.d.cts +122 -0
  50. package/dist/core/index.d.ts +122 -0
  51. package/dist/core/index.js +7 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/defaults-EQD5QKCU.js +4 -0
  54. package/dist/defaults-EQD5QKCU.js.map +1 -0
  55. package/dist/defaults-MLYXD2BG.cjs +49 -0
  56. package/dist/defaults-MLYXD2BG.cjs.map +1 -0
  57. package/dist/docx-BUrf4PFj.d.ts +49 -0
  58. package/dist/docx-DLfSdvXm.d.cts +49 -0
  59. package/dist/docx-LDETXV3L.js +5 -0
  60. package/dist/docx-LDETXV3L.js.map +1 -0
  61. package/dist/docx-N2LKIOK3.cjs +14 -0
  62. package/dist/docx-N2LKIOK3.cjs.map +1 -0
  63. package/dist/export/index.cjs +54 -0
  64. package/dist/export/index.cjs.map +1 -0
  65. package/dist/export/index.d.cts +60 -0
  66. package/dist/export/index.d.ts +60 -0
  67. package/dist/export/index.js +9 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/html-5BXJPQU3.js +7 -0
  70. package/dist/html-5BXJPQU3.js.map +1 -0
  71. package/dist/html-KU2KHLRF.cjs +24 -0
  72. package/dist/html-KU2KHLRF.cjs.map +1 -0
  73. package/dist/import/index.cjs +15 -0
  74. package/dist/import/index.cjs.map +1 -0
  75. package/dist/import/index.d.cts +37 -0
  76. package/dist/import/index.d.ts +37 -0
  77. package/dist/import/index.js +6 -0
  78. package/dist/import/index.js.map +1 -0
  79. package/dist/index.cjs +1035 -0
  80. package/dist/index.cjs.map +1 -0
  81. package/dist/index.d.cts +248 -0
  82. package/dist/index.d.ts +248 -0
  83. package/dist/index.js +885 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/persistence/index.cjs +37 -0
  86. package/dist/persistence/index.cjs.map +1 -0
  87. package/dist/persistence/index.d.cts +279 -0
  88. package/dist/persistence/index.d.ts +279 -0
  89. package/dist/persistence/index.js +4 -0
  90. package/dist/persistence/index.js.map +1 -0
  91. package/dist/sanitize-7IZ-SW1f.d.ts +361 -0
  92. package/dist/sanitize-CvmgqbsA.d.cts +361 -0
  93. package/dist/server/index.cjs +400 -0
  94. package/dist/server/index.cjs.map +1 -0
  95. package/dist/server/index.d.cts +229 -0
  96. package/dist/server/index.d.ts +229 -0
  97. package/dist/server/index.js +390 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/styles.css +680 -0
  100. package/dist/types-B4z0Quvv.d.cts +193 -0
  101. package/dist/types-B4z0Quvv.d.ts +193 -0
  102. package/package.json +183 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/schema/nodes.ts","../src/core/schema/attrs.ts","../src/core/schema/marks.ts","../src/core/schema/schema.ts","../src/core/commands/helpers.ts","../src/core/commands/marks.ts","../src/core/commands/blocks.ts","../src/core/commands/lists.ts","../src/core/commands/format.ts","../src/core/commands/links.ts","../src/core/commands/insert.ts","../src/core/commands/index.ts","../src/core/plugins/inputrules.ts","../src/core/plugins/keymap.ts","../src/core/plugins/placeholder.ts","../src/core/plugins/taskList.ts","../src/core/pagination/compute.ts","../src/core/pagination/plugin.ts","../src/core/plugins/index.ts","../src/core/state/createEditorState.ts","../src/core/utils.ts"],"names":["__export","em","cssAlign","cssInteger","cssNumber","sanitizeImageSrc","sanitizeUrl","cssFontFamily","normalizeCssColor","DEFAULT_FEATURES","tableNodes","Schema","pmToggleMark","noop","setBlockType","wrapIn","lift","wrapInList","liftListItem","sinkListItem","text","addRowBefore","addRowAfter","deleteRow","addColumnBefore","addColumnAfter","deleteColumn","mergeCells","splitCell","toggleHeaderRow","toggleHeaderColumn","deleteTable","undo","redo","selectAll","selectParentNode","deleteSelection","joinBackward","joinForward","smartQuotes","ellipsis","emDash","wrappingInputRule","textblockTypeInputRule","inputRules","toggleMark","splitListItem","goToNextCell","chainCommands","exitCode","keymap","baseKeymap","Plugin","doc","Decoration","DecorationSet","PluginKey","sanitizeHtmlSync","history","dropCursor","gapCursor","columnResizing","tableEditing","PMNode","EditorState"],"mappings":"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","file":"chunk-DBSFCCBG.cjs","sourcesContent":["import type { Node as PMNode, NodeSpec } from 'prosemirror-model';\nimport { sanitizeImageSrc } from '../../security/sanitize';\nimport { cssInteger } from '../../security/css';\nimport { blockAttrs, blockDOMAttrs, readBlockAttrs } from './attrs';\n\n/**\n * Node specifications. Each is a self-contained {@link NodeSpec}. The schema is\n * assembled from these by {@link buildSchema} according to the enabled feature\n * flags, so disabling a feature removes its node entirely and the document can\n * never contain it (F-10.2, F-11.5).\n */\n\nexport const doc: NodeSpec = { content: 'block+' };\n\nexport const text: NodeSpec = { group: 'inline' };\n\nexport const paragraph: NodeSpec = {\n group: 'block',\n content: 'inline*',\n attrs: { ...blockAttrs },\n parseDOM: [{ tag: 'p', getAttrs: (dom) => readBlockAttrs(dom as HTMLElement) }],\n toDOM(node) {\n return ['p', blockDOMAttrs(node), 0];\n },\n};\n\nexport const heading: NodeSpec = {\n group: 'block',\n content: 'inline*',\n defining: true,\n attrs: { level: { default: 1 }, ...blockAttrs },\n parseDOM: [1, 2, 3, 4, 5, 6].map((level) => ({\n tag: `h${level}`,\n getAttrs: (dom: string | HTMLElement) => ({\n level,\n ...readBlockAttrs(dom as HTMLElement),\n }),\n })),\n toDOM(node) {\n const level = (node.attrs.level as number) || 1;\n return [`h${Math.min(6, Math.max(1, level))}`, blockDOMAttrs(node), 0];\n },\n};\n\nexport const blockquote: NodeSpec = {\n group: 'block',\n content: 'block+',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', { class: 'rne-blockquote' }, 0];\n },\n};\n\nexport const horizontal_rule: NodeSpec = {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr', { class: 'rne-hr' }];\n },\n};\n\n/** Custom manual page break (F-3.5). An atom that renders as a non-editable break. */\nexport const page_break: NodeSpec = {\n group: 'block',\n atom: true,\n selectable: true,\n parseDOM: [{ tag: 'div[data-page-break]' }, { tag: 'div.rne-page-break' }],\n toDOM() {\n return [\n 'div',\n { 'data-page-break': 'true', class: 'rne-page-break', contenteditable: 'false' },\n ];\n },\n};\n\nexport const hard_break: NodeSpec = {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n },\n};\n\nconst MAX_IMAGE_WIDTH = 2000;\n\nexport const image: NodeSpec = {\n inline: true,\n group: 'inline',\n draggable: true,\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n width: { default: null },\n },\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const src = sanitizeImageSrc(el.getAttribute('src'));\n if (!src) return false;\n const widthAttr = el.getAttribute('width') ?? el.style.width;\n let width: number | null = null;\n if (widthAttr) {\n const num = parseInt(widthAttr, 10);\n if (Number.isFinite(num) && num > 0) width = Math.min(MAX_IMAGE_WIDTH, num);\n }\n return {\n src,\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n width,\n };\n },\n },\n ],\n toDOM(node) {\n const { src, alt, title, width } = node.attrs as {\n src: string;\n alt: string | null;\n title: string | null;\n width: number | null;\n };\n const safeSrc = sanitizeImageSrc(src) ?? '';\n const attrs: Record<string, string> = { src: safeSrc, class: 'rne-image' };\n if (alt) attrs.alt = alt;\n if (title) attrs.title = title;\n // Re-validate width to a finite, bounded number so a crafted string value\n // cannot inject CSS via the style attribute (§5.12).\n const safeWidth = cssInteger(width, 1, MAX_IMAGE_WIDTH);\n if (safeWidth) attrs.style = `width: ${safeWidth}px`;\n return ['img', attrs];\n },\n};\n\n/** List item, with an optional `checked` attribute powering task lists (F-2.8). */\nexport const list_item: NodeSpec = {\n content: 'paragraph block*',\n defining: true,\n attrs: { checked: { default: null } },\n parseDOM: [\n {\n tag: 'li',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const dc = el.getAttribute('data-checked');\n if (dc === 'true') return { checked: true };\n if (dc === 'false') return { checked: false };\n return { checked: null };\n },\n },\n ],\n toDOM(node) {\n const checked = node.attrs.checked as boolean | null;\n if (checked === null) return ['li', 0];\n return [\n 'li',\n { 'data-checked': String(checked), class: 'rne-task-item' },\n ['span', { class: 'rne-task-checkbox', contenteditable: 'false' }],\n ['div', { class: 'rne-task-content' }, 0],\n ];\n },\n};\n\nexport const bullet_list: NodeSpec = {\n group: 'block',\n content: 'list_item+',\n attrs: { kind: { default: 'bullet' } },\n parseDOM: [\n {\n tag: 'ul',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const isTask =\n el.getAttribute('data-type') === 'task' ||\n el.classList.contains('rne-task-list') ||\n !!el.querySelector('li[data-checked]');\n return { kind: isTask ? 'task' : 'bullet' };\n },\n },\n ],\n toDOM(node) {\n const kind = node.attrs.kind as string;\n return kind === 'task'\n ? ['ul', { 'data-type': 'task', class: 'rne-task-list' }, 0]\n : ['ul', { class: 'rne-bullet-list' }, 0];\n },\n};\n\nexport const ordered_list: NodeSpec = {\n group: 'block',\n content: 'list_item+',\n attrs: { order: { default: 1 } },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const start = el.getAttribute('start');\n const order = start ? parseInt(start, 10) : 1;\n return { order: Number.isFinite(order) && order > 0 ? order : 1 };\n },\n },\n ],\n toDOM(node) {\n const order = (node.attrs.order as number) || 1;\n return order === 1\n ? ['ol', { class: 'rne-ordered-list' }, 0]\n : ['ol', { order, start: order, class: 'rne-ordered-list' }, 0];\n },\n};\n\n/** Return the text alignment attribute of a block node, if any. */\nexport function nodeAlign(node: PMNode): string | null {\n return (node.attrs?.align as string) ?? null;\n}\n","import type { Attrs, Node as PMNode } from 'prosemirror-model';\nimport { cssAlign, cssInteger, cssNumber } from '../../security/css';\n\n/** Permitted text-alignment values. `null` means \"inherit / default (left in LTR)\". */\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify' | null;\n\nconst ALIGN_VALUES: ReadonlyArray<Exclude<TextAlign, null>> = [\n 'left',\n 'center',\n 'right',\n 'justify',\n];\n\n/** Maximum indent levels, to bound the document and prevent runaway nesting. */\nexport const MAX_INDENT = 12;\n/** Indent step in em units, applied as `margin-left`. */\nexport const INDENT_STEP_EM = 3;\n\n/**\n * Shared block attributes for paragraph and heading nodes: text alignment,\n * indentation level, and line height. Validity is enforced here so the document\n * can never hold an out-of-range value (F-11.5).\n */\nexport const blockAttrs = {\n align: { default: null as TextAlign },\n indent: { default: 0 },\n lineHeight: { default: null as number | null },\n};\n\n/** Read block attributes from a DOM element during paste/parse. */\nexport function readBlockAttrs(dom: HTMLElement): {\n align: TextAlign;\n indent: number;\n lineHeight: number | null;\n} {\n const textAlign = dom.style.textAlign || dom.getAttribute('align') || '';\n const align = (ALIGN_VALUES as readonly string[]).includes(textAlign)\n ? (textAlign as TextAlign)\n : null;\n\n let indent = 0;\n const marginLeft = dom.style.marginLeft;\n if (marginLeft) {\n const em = parseFloat(marginLeft);\n if (Number.isFinite(em) && em > 0) {\n const unit = /px$/.test(marginLeft) ? em / 16 : em;\n indent = Math.min(MAX_INDENT, Math.max(0, Math.round(unit / INDENT_STEP_EM)));\n }\n }\n\n let lineHeight: number | null = null;\n const lh = dom.style.lineHeight;\n if (lh) {\n const value = parseFloat(lh);\n if (Number.isFinite(value) && value > 0 && value <= 10) {\n lineHeight = Math.round(value * 100) / 100;\n }\n }\n\n return { align, indent, lineHeight };\n}\n\n/** Build the DOM attribute object (style/class) for a block node's attributes. */\nexport function blockDOMAttrs(node: PMNode, extra?: Record<string, string>): Record<string, string> {\n const attrs = node.attrs as Attrs;\n const styles: string[] = [];\n // Every value is re-validated here (never trust attrs from loaded JSON) so a\n // crafted value such as \"left;background:url(...)\" cannot inject CSS (§5.12).\n const align = cssAlign(attrs.align);\n if (align) styles.push(`text-align: ${align}`);\n const indent = cssInteger(attrs.indent, 0, MAX_INDENT);\n if (indent && indent > 0) styles.push(`margin-left: ${indent * INDENT_STEP_EM}em`);\n const lineHeight = cssNumber(attrs.lineHeight, 0.1, 10);\n if (lineHeight) styles.push(`line-height: ${lineHeight}`);\n\n const out: Record<string, string> = { ...extra };\n if (styles.length) out.style = styles.join('; ');\n return out;\n}\n\n/** Clamp an indent value into the valid range. */\nexport function clampIndent(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.min(MAX_INDENT, Math.max(0, Math.round(value)));\n}\n\n/** Type guard for a valid alignment value. */\nexport function isTextAlign(value: unknown): value is Exclude<TextAlign, null> {\n return typeof value === 'string' && (ALIGN_VALUES as readonly string[]).includes(value);\n}\n","import type { MarkSpec } from 'prosemirror-model';\nimport { sanitizeUrl } from '../../security/sanitize';\nimport { cssFontFamily, cssNumber, normalizeCssColor } from '../../security/css';\n\n/**\n * Mark specifications. Each is a self-contained {@link MarkSpec} with parse and\n * serialize rules. Marks that carry style (font, size, colors) are attribute\n * marks; their `toDOM` emits inline styles only — never active content — and\n * their `parseDOM` reads from the corresponding CSS property so pasted content\n * round-trips (F-4.2, F-11.4).\n */\n\nexport const strong: MarkSpec = {\n parseDOM: [\n { tag: 'strong' },\n { tag: 'b', getAttrs: (node) => (node as HTMLElement).style.fontWeight !== 'normal' && null },\n { style: 'font-weight=400', clearMark: (m) => m.type.name === 'strong' },\n {\n style: 'font-weight',\n getAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n },\n ],\n toDOM() {\n return ['strong', 0];\n },\n};\n\nexport const em: MarkSpec = {\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n { style: 'font-style=normal', clearMark: (m) => m.type.name === 'em' },\n ],\n toDOM() {\n return ['em', 0];\n },\n};\n\nexport const underline: MarkSpec = {\n parseDOM: [\n { tag: 'u' },\n {\n style: 'text-decoration',\n getAttrs: (value) => (value as string).includes('underline') && null,\n },\n {\n style: 'text-decoration-line',\n getAttrs: (value) => (value as string).includes('underline') && null,\n },\n ],\n toDOM() {\n return ['u', 0];\n },\n};\n\nexport const strikethrough: MarkSpec = {\n parseDOM: [\n { tag: 's' },\n { tag: 'del' },\n { tag: 'strike' },\n {\n style: 'text-decoration',\n getAttrs: (value) => (value as string).includes('line-through') && null,\n },\n ],\n toDOM() {\n return ['s', 0];\n },\n};\n\nexport const superscript: MarkSpec = {\n excludes: 'subscript',\n parseDOM: [{ tag: 'sup' }, { style: 'vertical-align=super' }],\n toDOM() {\n return ['sup', 0];\n },\n};\n\nexport const subscript: MarkSpec = {\n excludes: 'superscript',\n parseDOM: [{ tag: 'sub' }, { style: 'vertical-align=sub' }],\n toDOM() {\n return ['sub', 0];\n },\n};\n\nexport const code: MarkSpec = {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', { class: 'rne-inline-code' }, 0];\n },\n};\n\nexport const link: MarkSpec = {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: '_blank' },\n },\n inclusive: false,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const rawHref = el.getAttribute('href');\n const href = sanitizeUrl(rawHref);\n // Drop the link entirely if the URL is unsafe (e.g. javascript:).\n if (!href) return false;\n return {\n href,\n title: el.getAttribute('title'),\n target: el.getAttribute('target') ?? '_blank',\n };\n },\n },\n ],\n toDOM(mark) {\n const href = sanitizeUrl(mark.attrs.href as string) ?? '';\n const target = (mark.attrs.target as string) || '_blank';\n return [\n 'a',\n {\n href,\n title: (mark.attrs.title as string) ?? null,\n target,\n rel: 'noopener noreferrer nofollow',\n },\n 0,\n ];\n },\n};\n\nexport const fontFamily: MarkSpec = {\n attrs: { family: {} },\n parseDOM: [\n {\n style: 'font-family',\n getAttrs: (value) => {\n const family = cssFontFamily(value);\n return family ? { family } : false;\n },\n },\n ],\n toDOM(mark) {\n const family = cssFontFamily(mark.attrs.family);\n return family ? ['span', { style: `font-family: ${family}` }, 0] : ['span', 0];\n },\n};\n\nexport const fontSize: MarkSpec = {\n attrs: { size: {} },\n parseDOM: [\n {\n style: 'font-size',\n getAttrs: (value) => {\n const size = parseFontSize(value as string);\n return size ? { size } : false;\n },\n },\n ],\n toDOM(mark) {\n const size = cssNumber(mark.attrs.size, 1, 1638);\n return size ? ['span', { style: `font-size: ${size}pt` }, 0] : ['span', 0];\n },\n};\n\nexport const textColor: MarkSpec = {\n attrs: { color: {} },\n parseDOM: [\n {\n style: 'color',\n getAttrs: (value) => {\n const color = normalizeCssColor(value);\n return color ? { color } : false;\n },\n },\n ],\n toDOM(mark) {\n const color = normalizeCssColor(mark.attrs.color);\n return color ? ['span', { style: `color: ${color}` }, 0] : ['span', 0];\n },\n};\n\nexport const highlight: MarkSpec = {\n attrs: { color: { default: '#fff2a8' } },\n parseDOM: [\n { tag: 'mark' },\n {\n style: 'background-color',\n getAttrs: (value) => {\n const color = normalizeCssColor(value);\n return color ? { color } : false;\n },\n },\n ],\n toDOM(mark) {\n const color = normalizeCssColor(mark.attrs.color) ?? '#fff2a8';\n return ['mark', { style: `background-color: ${color}` }, 0];\n },\n};\n\n/** Parse a CSS font-size (pt/px) into a clamped point value, or null. */\nfunction parseFontSize(value: string): number | null {\n const match = /(\\d+(?:\\.\\d+)?)\\s*(pt|px)?/.exec(value);\n if (!match) return null;\n const num = parseFloat(match[1]!);\n if (!Number.isFinite(num) || num <= 0) return null;\n // 1px ≈ 0.75pt\n const pt = (match[2] ?? 'pt') === 'px' ? num * 0.75 : num;\n return cssNumber(Math.round(pt * 100) / 100, 1, 1638);\n}\n","import { Schema, type MarkSpec, type NodeSpec } from 'prosemirror-model';\nimport { tableNodes } from 'prosemirror-tables';\nimport type { FeatureFlags } from '../../config/types';\nimport { DEFAULT_FEATURES } from '../../config/defaults';\nimport { cssAlign, normalizeCssColor } from '../../security/css';\nimport * as nodeSpecs from './nodes';\nimport * as markSpecs from './marks';\n\n/**\n * Build a ProseMirror {@link Schema} from a set of enabled features. The schema\n * is the backbone of the editor (NF-7): nodes/marks, commands, persistence and\n * the serializers all derive from it. Disabled features are omitted so an\n * invalid or unsupported document is structurally impossible (F-11.5).\n *\n * Core nodes (`doc`, `paragraph`, `text`, `hard_break`) are always present.\n */\nexport function buildSchema(features: Partial<FeatureFlags> = {}): Schema {\n const f: FeatureFlags = { ...DEFAULT_FEATURES, ...features };\n\n const nodes: Record<string, NodeSpec> = {\n doc: nodeSpecs.doc,\n paragraph: nodeSpecs.paragraph,\n };\n\n if (f.headings) nodes.heading = nodeSpecs.heading;\n if (f.blockquote) nodes.blockquote = nodeSpecs.blockquote;\n if (f.horizontalRule) nodes.horizontal_rule = nodeSpecs.horizontal_rule;\n\n // List nodes (bullet/ordered/task share list_item).\n if (f.bulletList || f.orderedList || f.taskList) {\n nodes.list_item = nodeSpecs.list_item;\n if (f.bulletList || f.taskList) nodes.bullet_list = nodeSpecs.bullet_list;\n if (f.orderedList) nodes.ordered_list = nodeSpecs.ordered_list;\n }\n\n // Tables via prosemirror-tables, with cell styling attributes (F-3.2).\n if (f.table) {\n const tnodes = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n background: {\n default: null,\n getFromDOM(dom) {\n return (dom as HTMLElement).style.backgroundColor || null;\n },\n setDOMAttr(value, attrs) {\n const color = normalizeCssColor(value);\n if (color) {\n attrs.style = `${(attrs.style as string) || ''}background-color: ${color};`;\n }\n },\n },\n align: {\n default: null,\n getFromDOM(dom) {\n return (dom as HTMLElement).style.textAlign || null;\n },\n setDOMAttr(value, attrs) {\n const align = cssAlign(value);\n if (align) {\n attrs.style = `${(attrs.style as string) || ''}text-align: ${align};`;\n }\n },\n },\n },\n });\n Object.assign(nodes, tnodes);\n }\n\n if (f.image) nodes.image = nodeSpecs.image;\n if (f.pageBreak) nodes.page_break = nodeSpecs.page_break;\n\n // text + hard_break always come after block nodes so block nodes win parse priority.\n nodes.text = nodeSpecs.text;\n nodes.hard_break = nodeSpecs.hard_break;\n\n const marks: Record<string, MarkSpec> = {};\n if (f.link) marks.link = markSpecs.link;\n if (f.bold) marks.strong = markSpecs.strong;\n if (f.italic) marks.em = markSpecs.em;\n if (f.underline) marks.underline = markSpecs.underline;\n if (f.strikethrough) marks.strikethrough = markSpecs.strikethrough;\n if (f.superscript) marks.superscript = markSpecs.superscript;\n if (f.subscript) marks.subscript = markSpecs.subscript;\n if (f.code) marks.code = markSpecs.code;\n if (f.fontFamily) marks.fontFamily = markSpecs.fontFamily;\n if (f.fontSize) marks.fontSize = markSpecs.fontSize;\n if (f.textColor) marks.textColor = markSpecs.textColor;\n if (f.highlight) marks.highlight = markSpecs.highlight;\n\n return new Schema({ nodes, marks });\n}\n\n/** A schema with all features enabled — convenient for tests and full editors. */\nexport const defaultSchema: Schema = buildSchema();\n","import type { MarkType, NodeType, Attrs } from 'prosemirror-model';\nimport type { EditorState, Command } from 'prosemirror-state';\n\n/**\n * A toolbar-aware command: the ProseMirror {@link Command} to dispatch plus\n * optional predicates the toolbar uses to reflect active and enabled state\n * (F-10.6, NF-4).\n */\nexport interface EditorCommand {\n run: Command;\n /** Whether the command's formatting is currently applied to the selection. */\n isActive?: (state: EditorState) => boolean;\n /** Whether the command can currently run. Defaults to `run(state)` (dry run). */\n isEnabled?: (state: EditorState) => boolean;\n}\n\n/** Determine whether a mark is active across the current selection. */\nexport function isMarkActive(state: EditorState, type: MarkType): boolean {\n const { from, $from, to, empty } = state.selection;\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n return state.doc.rangeHasMark(from, to, type);\n}\n\n/** Return the attributes of an active mark, or null if not present. */\nexport function getActiveMarkAttrs(state: EditorState, type: MarkType): Attrs | null {\n const { $from, empty } = state.selection;\n if (empty) {\n const mark = type.isInSet(state.storedMarks || $from.marks());\n return mark ? mark.attrs : null;\n }\n const { from, to } = state.selection;\n let attrs: Attrs | null = null;\n state.doc.nodesBetween(from, to, (node) => {\n if (attrs) return false;\n const mark = node.marks.find((m) => m.type === type);\n if (mark) attrs = mark.attrs;\n return true;\n });\n return attrs;\n}\n\n/**\n * Whether every selected top-level block is of `type` (optionally matching the\n * given attributes). Used to reflect heading/alignment/list active state.\n */\nexport function isBlockActive(\n state: EditorState,\n type: NodeType,\n attrs?: Record<string, unknown>,\n): boolean {\n const { from, to } = state.selection;\n let found = false;\n let allMatch = true;\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.isTextblock || node.type === type) {\n if (node.type === type && matchAttrs(node.attrs, attrs)) {\n found = true;\n } else if (node.type.isTextblock) {\n if (!(node.type === type && matchAttrs(node.attrs, attrs))) allMatch = false;\n }\n }\n return true;\n });\n return found && allMatch;\n}\n\nfunction matchAttrs(nodeAttrs: Attrs, attrs?: Record<string, unknown>): boolean {\n if (!attrs) return true;\n return Object.keys(attrs).every((key) => nodeAttrs[key] === attrs[key]);\n}\n\n/** Whether an ancestor of the selection is of the given node type. */\nexport function isInNode(state: EditorState, type: NodeType): boolean {\n const { $from } = state.selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n if ($from.node(depth).type === type) return true;\n }\n return false;\n}\n\n/** Default enabled-check: run the command without a dispatch function. */\nexport function defaultEnabled(run: Command): (state: EditorState) => boolean {\n return (state) => run(state, undefined, undefined);\n}\n","import type { MarkType, Schema } from 'prosemirror-model';\nimport type { Command } from 'prosemirror-state';\nimport { toggleMark as pmToggleMark } from 'prosemirror-commands';\nimport { type EditorCommand, getActiveMarkAttrs, isMarkActive } from './helpers';\n\n/**\n * Apply a mark (with attributes) across the selection, replacing any existing\n * mark of the same type. For an empty selection the mark is stored for the next\n * typed input. Used by attribute marks (font, size, color, highlight).\n */\nexport function setMark(type: MarkType, attrs?: Record<string, unknown>): Command {\n return (state, dispatch) => {\n const { selection } = state;\n if (dispatch) {\n const tr = state.tr;\n if (selection.empty) {\n tr.addStoredMark(type.create(attrs));\n } else {\n for (const range of selection.ranges) {\n const { $from, $to } = range;\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n }\n tr.scrollIntoView();\n }\n dispatch(tr);\n }\n return true;\n };\n}\n\n/** Remove a mark from the selection (and from stored marks when empty). */\nexport function unsetMark(type: MarkType): Command {\n return (state, dispatch) => {\n const { selection } = state;\n if (dispatch) {\n const tr = state.tr;\n if (selection.empty) {\n tr.removeStoredMark(type);\n } else {\n for (const range of selection.ranges) {\n tr.removeMark(range.$from.pos, range.$to.pos, type);\n }\n }\n dispatch(tr);\n }\n return true;\n };\n}\n\nfunction toggle(type: MarkType): EditorCommand {\n const run = pmToggleMark(type);\n return {\n run,\n isActive: (state) => isMarkActive(state, type),\n isEnabled: (state) => run(state, undefined, undefined),\n };\n}\n\n/**\n * Build all mark-related commands for a schema. Commands whose mark is absent\n * from the schema (feature disabled) are simply omitted.\n */\nexport function createMarkCommands(schema: Schema): Record<string, EditorCommand> {\n const cmds: Record<string, EditorCommand> = {};\n const m = schema.marks;\n\n if (m.strong) cmds.bold = toggle(m.strong);\n if (m.em) cmds.italic = toggle(m.em);\n if (m.underline) cmds.underline = toggle(m.underline);\n if (m.strikethrough) cmds.strikethrough = toggle(m.strikethrough);\n if (m.superscript) cmds.superscript = toggle(m.superscript);\n if (m.subscript) cmds.subscript = toggle(m.subscript);\n if (m.code) cmds.code = toggle(m.code);\n\n return cmds;\n}\n\n/** Parametric mark commands (need a runtime value from the UI). */\nexport function createParametricMarkCommands(schema: Schema) {\n const m = schema.marks;\n return {\n setFontFamily: (family: string): Command =>\n m.fontFamily ? setMark(m.fontFamily, { family }) : noop,\n clearFontFamily: (): Command => (m.fontFamily ? unsetMark(m.fontFamily) : noop),\n setFontSize: (size: number): Command => (m.fontSize ? setMark(m.fontSize, { size }) : noop),\n clearFontSize: (): Command => (m.fontSize ? unsetMark(m.fontSize) : noop),\n setTextColor: (color: string): Command =>\n m.textColor ? setMark(m.textColor, { color }) : noop,\n clearTextColor: (): Command => (m.textColor ? unsetMark(m.textColor) : noop),\n setHighlight: (color: string): Command =>\n m.highlight ? setMark(m.highlight, { color }) : noop,\n clearHighlight: (): Command => (m.highlight ? unsetMark(m.highlight) : noop),\n getActiveFontFamily: (state: Parameters<typeof getActiveMarkAttrs>[0]): string | null =>\n m.fontFamily ? ((getActiveMarkAttrs(state, m.fontFamily)?.family as string) ?? null) : null,\n getActiveFontSize: (state: Parameters<typeof getActiveMarkAttrs>[0]): number | null =>\n m.fontSize ? ((getActiveMarkAttrs(state, m.fontSize)?.size as number) ?? null) : null,\n getActiveTextColor: (state: Parameters<typeof getActiveMarkAttrs>[0]): string | null =>\n m.textColor ? ((getActiveMarkAttrs(state, m.textColor)?.color as string) ?? null) : null,\n };\n}\n\nconst noop: Command = () => false;\n","import type { NodeType, Schema } from 'prosemirror-model';\nimport type { Command, EditorState } from 'prosemirror-state';\nimport { setBlockType, wrapIn, lift } from 'prosemirror-commands';\nimport { clampIndent, type TextAlign } from '../schema/attrs';\nimport { type EditorCommand, isBlockActive, isInNode } from './helpers';\n\nconst noop: Command = () => false;\n\n/** Set an attribute on every textblock in the selection that supports it. */\nexport function setTextblockAttr(attr: string, value: unknown): Command {\n return (state, dispatch) => {\n const { from, to } = state.selection;\n let applicable = false;\n const tr = state.tr;\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && attr in (node.type.spec.attrs ?? {})) {\n applicable = true;\n if (dispatch) tr.setNodeAttribute(pos, attr, value);\n }\n return true;\n });\n if (!applicable) return false;\n if (dispatch) dispatch(tr.scrollIntoView());\n return true;\n };\n}\n\n/** Whether every selected textblock has the given attribute value. */\nexport function isTextblockAttrActive(state: EditorState, attr: string, value: unknown): boolean {\n const { from, to } = state.selection;\n let any = false;\n let all = true;\n state.doc.nodesBetween(from, to, (node) => {\n if (node.isTextblock && attr in (node.type.spec.attrs ?? {})) {\n any = true;\n if (node.attrs[attr] !== value) all = false;\n }\n return true;\n });\n return any && all;\n}\n\n/** Shift indentation of selected textblocks by `delta`, clamped to valid range. */\nexport function changeIndent(delta: number): Command {\n return (state, dispatch) => {\n const { from, to } = state.selection;\n let changed = false;\n const tr = state.tr;\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && 'indent' in (node.type.spec.attrs ?? {})) {\n const next = clampIndent((node.attrs.indent as number) + delta);\n if (next !== node.attrs.indent) {\n changed = true;\n if (dispatch) tr.setNodeAttribute(pos, 'indent', next);\n }\n }\n return true;\n });\n if (!changed) return false;\n if (dispatch) dispatch(tr.scrollIntoView());\n return true;\n };\n}\n\n/** Insert an atom block (horizontal rule, page break) at the selection. */\nfunction insertBlock(type: NodeType): Command {\n return (state, dispatch) => {\n if (!type) return false;\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView());\n }\n return true;\n };\n}\n\nexport function createBlockCommands(schema: Schema): Record<string, EditorCommand> {\n const n = schema.nodes;\n const cmds: Record<string, EditorCommand> = {};\n\n if (n.paragraph) {\n const run = setBlockType(n.paragraph);\n cmds.paragraph = {\n run,\n isActive: (state) => isBlockActive(state, n.paragraph),\n isEnabled: (state) => run(state, undefined, undefined),\n };\n }\n\n if (schema.nodes.blockquote) {\n const wrap = wrapIn(schema.nodes.blockquote);\n cmds.blockquote = {\n run: (state, dispatch, view) => {\n if (isInNode(state, schema.nodes.blockquote)) return lift(state, dispatch);\n return wrap(state, dispatch, view);\n },\n isActive: (state) => isInNode(state, schema.nodes.blockquote),\n };\n }\n\n if (n.horizontal_rule) {\n const run = insertBlock(n.horizontal_rule);\n cmds.horizontalRule = { run, isEnabled: (state) => run(state, undefined, undefined) };\n }\n if (n.page_break) {\n const run = insertBlock(n.page_break);\n cmds.pageBreak = { run, isEnabled: (state) => run(state, undefined, undefined) };\n }\n\n // Alignment commands.\n if (n.paragraph?.spec.attrs && 'align' in n.paragraph.spec.attrs) {\n const aligns: Array<[string, Exclude<TextAlign, null>]> = [\n ['alignLeft', 'left'],\n ['alignCenter', 'center'],\n ['alignRight', 'right'],\n ['alignJustify', 'justify'],\n ];\n for (const [name, value] of aligns) {\n const run = setTextblockAttr('align', value);\n cmds[name] = {\n run,\n isActive: (state) => isTextblockAttrActive(state, 'align', value),\n isEnabled: (state) => run(state, undefined, undefined),\n };\n }\n\n const indentRun = changeIndent(1);\n const outdentRun = changeIndent(-1);\n cmds.indent = { run: indentRun, isEnabled: (state) => indentRun(state, undefined, undefined) };\n cmds.outdent = {\n run: outdentRun,\n isEnabled: (state) => outdentRun(state, undefined, undefined),\n };\n }\n\n return cmds;\n}\n\n/** Parametric block commands needing a runtime value. */\nexport function createParametricBlockCommands(schema: Schema) {\n const n = schema.nodes;\n return {\n setParagraph: (): Command => (n.paragraph ? setBlockType(n.paragraph) : noop),\n setHeading: (level: number): Command =>\n n.heading ? setBlockType(n.heading, { level }) : noop,\n setAlign: (align: Exclude<TextAlign, null>): Command => setTextblockAttr('align', align),\n setLineHeight: (lineHeight: number | null): Command => setTextblockAttr('lineHeight', lineHeight),\n };\n}\n","import type { NodeType, Schema, Node as PMNode } from 'prosemirror-model';\nimport type { Command, EditorState, Transaction } from 'prosemirror-state';\nimport { liftListItem, sinkListItem, wrapInList } from 'prosemirror-schema-list';\nimport type { EditorCommand } from './helpers';\n\ninterface ParentList {\n node: PMNode;\n pos: number;\n depth: number;\n}\n\n/** Find the nearest ancestor list node (bullet or ordered) of the selection. */\nfunction findParentList(state: EditorState, listTypes: NodeType[]): ParentList | null {\n const { $from } = state.selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n if (listTypes.includes(node.type)) {\n return { node, pos: $from.before(depth), depth };\n }\n }\n return null;\n}\n\n/** Set `checked` on each immediate list_item child of the list at `listPos`. */\nfunction setItemsChecked(tr: Transaction, list: PMNode, listPos: number, checked: boolean | null) {\n let offset = listPos + 1;\n list.forEach((child) => {\n if (child.type.name === 'list_item' && child.attrs.checked !== checked) {\n tr.setNodeAttribute(offset, 'checked', checked);\n }\n offset += child.nodeSize;\n });\n}\n\n/**\n * Toggle a list of the given type/kind on the current selection:\n * - not in a list → wrap into the target list;\n * - in a list of the same type/kind → lift out (remove the list);\n * - in a list of a different type/kind → convert the list to the target.\n */\nfunction toggleList(\n schema: Schema,\n targetType: NodeType,\n targetAttrs: Record<string, unknown>,\n): Command {\n const listItem = schema.nodes.list_item;\n const listTypes = [schema.nodes.bullet_list, schema.nodes.ordered_list].filter(\n Boolean,\n ) as NodeType[];\n\n return (state, dispatch, view) => {\n const parent = findParentList(state, listTypes);\n\n if (!parent) {\n const wrap = wrapInList(targetType, targetAttrs);\n if (targetAttrs.kind === 'task') {\n // Wrap, then mark the produced items as task items.\n return wrap(\n state,\n (tr) => {\n if (!dispatch) return;\n const next = tr.doc.resolve(tr.selection.from);\n for (let depth = next.depth; depth > 0; depth--) {\n const node = next.node(depth);\n if (node.type === targetType) {\n setItemsChecked(tr, node, next.before(depth), false);\n break;\n }\n }\n dispatch(tr);\n },\n view,\n );\n }\n return wrap(state, dispatch, view);\n }\n\n const sameType = parent.node.type === targetType;\n const sameKind =\n targetType.name !== 'bullet_list' || parent.node.attrs.kind === targetAttrs.kind;\n\n if (sameType && sameKind) {\n return liftListItem(listItem)(state, dispatch, view);\n }\n\n // Convert the existing list to the target type/kind.\n if (dispatch) {\n const tr = state.tr.setNodeMarkup(parent.pos, targetType, targetAttrs);\n const checked = targetAttrs.kind === 'task' ? false : null;\n setItemsChecked(tr, parent.node, parent.pos, checked);\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\n\n/** Whether the selection is inside a list of the given type/kind. */\nfunction isInList(state: EditorState, type: NodeType, kind?: string): boolean {\n const { $from } = state.selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n if (node.type === type && (kind === undefined || node.attrs.kind === kind)) return true;\n }\n return false;\n}\n\nexport function createListCommands(schema: Schema): Record<string, EditorCommand> {\n const n = schema.nodes;\n const cmds: Record<string, EditorCommand> = {};\n if (!n.list_item) return cmds;\n\n if (n.bullet_list) {\n const run = toggleList(schema, n.bullet_list, { kind: 'bullet' });\n cmds.bulletList = {\n run,\n isActive: (state) => isInList(state, n.bullet_list, 'bullet'),\n };\n }\n if (n.ordered_list) {\n const run = toggleList(schema, n.ordered_list, { order: 1 });\n cmds.orderedList = {\n run,\n isActive: (state) => isInList(state, n.ordered_list),\n };\n }\n if (n.bullet_list) {\n const run = toggleList(schema, n.bullet_list, { kind: 'task' });\n cmds.taskList = {\n run,\n isActive: (state) => isInList(state, n.bullet_list, 'task'),\n };\n }\n\n const sink = sinkListItem(n.list_item);\n const liftItem = liftListItem(n.list_item);\n cmds.sinkListItem = { run: sink, isEnabled: (state) => sink(state, undefined, undefined) };\n cmds.liftListItem = { run: liftItem, isEnabled: (state) => liftItem(state, undefined, undefined) };\n\n return cmds;\n}\n\n/** The split-list-item command, for Enter handling inside lists. */\nexport { splitListItem } from 'prosemirror-schema-list';\n","import type { Schema } from 'prosemirror-model';\nimport type { Command } from 'prosemirror-state';\nimport type { EditorCommand } from './helpers';\n\n/**\n * Clear character and paragraph formatting across the selection (F-1.8):\n * removes all inline marks, resets alignment/indent/line-height, and converts\n * headings back to normal paragraphs. Node sizes are unchanged so the iteration\n * over the original document stays position-stable.\n */\nexport function clearFormatting(schema: Schema): Command {\n return (state, dispatch) => {\n const { from, to, empty } = state.selection;\n if (empty) return false;\n if (dispatch) {\n const tr = state.tr;\n tr.removeMark(from, to);\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isTextblock) return true;\n const specAttrs = node.type.spec.attrs ?? {};\n if (schema.nodes.heading && node.type === schema.nodes.heading && schema.nodes.paragraph) {\n tr.setNodeMarkup(pos, schema.nodes.paragraph, {\n align: null,\n indent: 0,\n lineHeight: null,\n });\n } else {\n const attrs = { ...node.attrs };\n if ('align' in specAttrs) attrs.align = null;\n if ('indent' in specAttrs) attrs.indent = 0;\n if ('lineHeight' in specAttrs) attrs.lineHeight = null;\n tr.setNodeMarkup(pos, undefined, attrs);\n }\n return true;\n });\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\n\nexport function createFormatCommands(schema: Schema): Record<string, EditorCommand> {\n const run = clearFormatting(schema);\n return {\n clearFormatting: {\n run,\n isEnabled: (state) => !state.selection.empty,\n },\n };\n}\n","import type { MarkType, Schema } from 'prosemirror-model';\nimport type { Command, EditorState } from 'prosemirror-state';\nimport { sanitizeUrl } from '../../security/sanitize';\nimport { type EditorCommand, getActiveMarkAttrs, isMarkActive } from './helpers';\n\nexport interface LinkAttrs {\n href: string;\n title?: string | null;\n target?: string;\n}\n\n/** Find the document range covered by a link mark around a position. */\nfunction linkRangeAt(\n state: EditorState,\n type: MarkType,\n pos: number,\n): { from: number; to: number } | null {\n const $pos = state.doc.resolve(pos);\n const mark = type.isInSet($pos.marks());\n if (!mark) return null;\n let start = pos;\n let end = pos;\n // Walk left and right while the same link mark is present.\n while (start > 0 && mark.isInSet(state.doc.resolve(start - 1).marks())) start--;\n const docSize = state.doc.content.size;\n while (end < docSize && mark.isInSet(state.doc.resolve(end + 1).marks())) end++;\n return { from: start, to: end };\n}\n\n/** Apply or update a link over the selection (or insert the URL as linked text). */\nexport function setLink(type: MarkType, attrs: LinkAttrs): Command {\n return (state, dispatch) => {\n const href = sanitizeUrl(attrs.href);\n if (!href) return false;\n const markAttrs = { href, title: attrs.title ?? null, target: attrs.target ?? '_blank' };\n const { empty, from, to } = state.selection;\n\n if (dispatch) {\n const tr = state.tr;\n if (empty) {\n const text = state.schema.text(href, [type.create(markAttrs)]);\n tr.replaceSelectionWith(text, false);\n } else {\n tr.addMark(from, to, type.create(markAttrs));\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\n\n/** Remove the link mark, expanding an empty selection to the full link range. */\nexport function removeLink(type: MarkType): Command {\n return (state, dispatch) => {\n const { empty, from, to } = state.selection;\n if (empty) {\n const range = linkRangeAt(state, type, from);\n if (!range) return false;\n if (dispatch) dispatch(state.tr.removeMark(range.from, range.to, type));\n return true;\n }\n if (!state.doc.rangeHasMark(from, to, type)) return false;\n if (dispatch) dispatch(state.tr.removeMark(from, to, type));\n return true;\n };\n}\n\nexport function createLinkCommands(schema: Schema) {\n const type = schema.marks.link;\n if (!type) {\n const noop: Command = () => false;\n return {\n commands: {} as Record<string, EditorCommand>,\n setLink: (_attrs: LinkAttrs): Command => noop,\n removeLink: noop,\n getActiveLink: (_state: EditorState): LinkAttrs | null => null,\n isLinkActive: (_state: EditorState): boolean => false,\n };\n }\n const commands: Record<string, EditorCommand> = {\n removeLink: {\n run: removeLink(type),\n isEnabled: (state) => isMarkActive(state, type),\n },\n };\n return {\n commands,\n setLink: (attrs: LinkAttrs): Command => setLink(type, attrs),\n removeLink: removeLink(type),\n getActiveLink: (state: EditorState): LinkAttrs | null =>\n getActiveMarkAttrs(state, type) as LinkAttrs | null,\n isLinkActive: (state: EditorState): boolean => isMarkActive(state, type),\n };\n}\n","import type { Node as PMNode, Schema } from 'prosemirror-model';\nimport type { Command } from 'prosemirror-state';\nimport {\n addColumnAfter,\n addColumnBefore,\n addRowAfter,\n addRowBefore,\n deleteColumn,\n deleteRow,\n deleteTable,\n mergeCells,\n splitCell,\n toggleHeaderColumn,\n toggleHeaderRow,\n} from 'prosemirror-tables';\nimport { sanitizeImageSrc } from '../../security/sanitize';\nimport type { EditorCommand } from './helpers';\n\nexport interface ImageAttrs {\n src: string;\n alt?: string | null;\n title?: string | null;\n width?: number | null;\n}\n\n/** Insert an inline image at the selection, after validating the source. */\nexport function insertImage(schema: Schema, attrs: ImageAttrs): Command {\n return (state, dispatch) => {\n const type = schema.nodes.image;\n if (!type) return false;\n const src = sanitizeImageSrc(attrs.src);\n if (!src) return false;\n if (dispatch) {\n const node = type.create({\n src,\n alt: attrs.alt ?? null,\n title: attrs.title ?? null,\n width: attrs.width ?? null,\n });\n dispatch(state.tr.replaceSelectionWith(node).scrollIntoView());\n }\n return true;\n };\n}\n\n/** Build a `rows × cols` table node, optionally with a header row. */\nexport function createTableNode(\n schema: Schema,\n rows: number,\n cols: number,\n withHeaderRow: boolean,\n): PMNode | null {\n const { table, table_row, table_cell, table_header } = schema.nodes;\n if (!table || !table_row || !table_cell) return null;\n const headerType = table_header ?? table_cell;\n\n const rowNodes: PMNode[] = [];\n for (let r = 0; r < rows; r++) {\n const cells: PMNode[] = [];\n for (let c = 0; c < cols; c++) {\n const cellType = withHeaderRow && r === 0 ? headerType : table_cell;\n const cell = cellType.createAndFill();\n if (!cell) return null;\n cells.push(cell);\n }\n rowNodes.push(table_row.create(null, cells));\n }\n return table.create(null, rowNodes);\n}\n\n/** Insert a table at the selection. */\nexport function insertTable(schema: Schema, rows = 3, cols = 3, withHeaderRow = true): Command {\n return (state, dispatch) => {\n const node = createTableNode(schema, rows, cols, withHeaderRow);\n if (!node) return false;\n if (dispatch) dispatch(state.tr.replaceSelectionWith(node).scrollIntoView());\n return true;\n };\n}\n\n/** Re-export the prosemirror-tables editing commands, gated by schema support. */\nexport function createTableCommands(schema: Schema): Record<string, EditorCommand> {\n if (!schema.nodes.table) return {};\n const wrap = (run: Command): EditorCommand => ({\n run,\n isEnabled: (state) => run(state, undefined, undefined),\n });\n return {\n addRowBefore: wrap(addRowBefore),\n addRowAfter: wrap(addRowAfter),\n deleteRow: wrap(deleteRow),\n addColumnBefore: wrap(addColumnBefore),\n addColumnAfter: wrap(addColumnAfter),\n deleteColumn: wrap(deleteColumn),\n mergeCells: wrap(mergeCells),\n splitCell: wrap(splitCell),\n toggleHeaderRow: wrap(toggleHeaderRow),\n toggleHeaderColumn: wrap(toggleHeaderColumn),\n deleteTable: wrap(deleteTable),\n };\n}\n","import type { Schema } from 'prosemirror-model';\nimport { redo, undo } from 'prosemirror-history';\nimport {\n selectParentNode,\n deleteSelection,\n joinBackward,\n joinForward,\n selectAll,\n} from 'prosemirror-commands';\nimport type { EditorCommand } from './helpers';\nimport { createMarkCommands, createParametricMarkCommands } from './marks';\nimport { createBlockCommands, createParametricBlockCommands } from './blocks';\nimport { createListCommands } from './lists';\nimport { createFormatCommands } from './format';\nimport { createLinkCommands } from './links';\nimport { createTableCommands, insertImage, insertTable, type ImageAttrs } from './insert';\n\nexport * from './helpers';\nexport { setMark, unsetMark } from './marks';\nexport { setTextblockAttr, changeIndent, isTextblockAttrActive } from './blocks';\nexport { splitListItem } from './lists';\nexport { setLink, removeLink, type LinkAttrs } from './links';\nexport {\n insertImage,\n insertTable,\n createTableNode,\n type ImageAttrs,\n} from './insert';\nexport { clearFormatting } from './format';\n\n/** The full set of commands derived from a schema, ready for toolbar/keymap use. */\nexport interface CommandSet {\n /** Static, parameter-free commands keyed by toolbar item id. */\n registry: Record<string, EditorCommand>;\n /** Parametric mark commands (font family/size, colors). */\n marks: ReturnType<typeof createParametricMarkCommands>;\n /** Parametric block commands (heading level, alignment, line height). */\n blocks: ReturnType<typeof createParametricBlockCommands>;\n /** Link commands (set/remove/inspect). */\n links: ReturnType<typeof createLinkCommands>;\n /** Insert helpers needing arguments. */\n insert: {\n image: (attrs: ImageAttrs) => ReturnType<typeof insertImage>;\n table: (rows?: number, cols?: number, withHeaderRow?: boolean) => ReturnType<typeof insertTable>;\n };\n}\n\n/**\n * Assemble every command for a schema. Commands whose feature is disabled are\n * omitted from the registry, so the toolbar and keymap reference only what the\n * document can actually contain.\n */\nexport function createCommands(schema: Schema): CommandSet {\n const registry: Record<string, EditorCommand> = {\n undo: { run: undo, isEnabled: (state) => undo(state) },\n redo: { run: redo, isEnabled: (state) => redo(state) },\n ...createMarkCommands(schema),\n ...createBlockCommands(schema),\n ...createListCommands(schema),\n ...createFormatCommands(schema),\n ...createTableCommands(schema),\n };\n\n const linkApi = createLinkCommands(schema);\n Object.assign(registry, linkApi.commands);\n\n return {\n registry,\n marks: createParametricMarkCommands(schema),\n blocks: createParametricBlockCommands(schema),\n links: linkApi,\n insert: {\n image: (attrs: ImageAttrs) => insertImage(schema, attrs),\n table: (rows = 3, cols = 3, withHeaderRow = true) =>\n insertTable(schema, rows, cols, withHeaderRow),\n },\n };\n}\n\n/** Generic editing commands occasionally useful to consumers. */\nexport const editingCommands = {\n selectAll,\n selectParentNode,\n deleteSelection,\n joinBackward,\n joinForward,\n};\n","import type { Schema } from 'prosemirror-model';\nimport {\n type InputRule,\n inputRules,\n smartQuotes,\n ellipsis,\n emDash,\n wrappingInputRule,\n textblockTypeInputRule,\n} from 'prosemirror-inputrules';\nimport type { Plugin } from 'prosemirror-state';\n\n/**\n * Markdown-style input rules (F-4.x convenience): typing `# `, `> `, `- `, `1. `\n * etc. transforms the current block. Rules are added only for nodes present in\n * the schema, and typography rules (smart quotes, ellipsis, em-dash) are always\n * safe to include.\n */\nexport function buildInputRules(schema: Schema): Plugin {\n const rules: InputRule[] = [...smartQuotes, ellipsis, emDash];\n const n = schema.nodes;\n\n if (n.blockquote) {\n rules.push(wrappingInputRule(/^\\s*>\\s$/, n.blockquote));\n }\n if (n.ordered_list) {\n rules.push(\n wrappingInputRule(\n /^(\\d+)\\.\\s$/,\n n.ordered_list,\n (match) => ({ order: +match[1]! }),\n (match, node) => node.childCount + (node.attrs.order as number) === +match[1]!,\n ),\n );\n }\n if (n.bullet_list) {\n rules.push(wrappingInputRule(/^\\s*([-+*])\\s$/, n.bullet_list));\n }\n if (n.heading) {\n rules.push(\n textblockTypeInputRule(/^(#{1,6})\\s$/, n.heading, (match) => ({\n level: match[1]!.length,\n })),\n );\n }\n\n return inputRules({ rules });\n}\n","import type { Schema } from 'prosemirror-model';\nimport type { Command, Plugin } from 'prosemirror-state';\nimport { keymap } from 'prosemirror-keymap';\nimport {\n baseKeymap,\n chainCommands,\n exitCode,\n setBlockType,\n toggleMark,\n} from 'prosemirror-commands';\nimport { redo, undo } from 'prosemirror-history';\nimport { liftListItem, sinkListItem, splitListItem } from 'prosemirror-schema-list';\nimport { goToNextCell } from 'prosemirror-tables';\nimport { changeIndent } from '../commands/blocks';\n\n/**\n * Build the editor keymaps (F-4.3). Returns two plugins: the custom bindings\n * (formatting, structure) and the ProseMirror base keymap, in that priority\n * order. Bindings reference only commands whose nodes/marks exist in the schema.\n */\nexport function buildKeymapPlugins(schema: Schema): Plugin[] {\n const bindings: Record<string, Command> = {};\n const m = schema.marks;\n const n = schema.nodes;\n\n const bind = (key: string, cmd: Command | undefined) => {\n if (cmd) bindings[key] = cmd;\n };\n\n // History.\n bind('Mod-z', undo);\n bind('Shift-Mod-z', redo);\n bind('Mod-y', redo);\n\n // Inline marks.\n if (m.strong) bind('Mod-b', toggleMark(m.strong));\n if (m.em) bind('Mod-i', toggleMark(m.em));\n if (m.underline) bind('Mod-u', toggleMark(m.underline));\n if (m.strikethrough) bind('Mod-Shift-s', toggleMark(m.strikethrough));\n if (m.code) bind('Mod-e', toggleMark(m.code));\n if (m.superscript) bind('Mod-.', toggleMark(m.superscript));\n if (m.subscript) bind('Mod-,', toggleMark(m.subscript));\n\n // Block types.\n if (n.paragraph) bind('Shift-Mod-0', setBlockType(n.paragraph));\n if (n.heading) {\n for (let level = 1; level <= 6; level++) {\n bind(`Shift-Mod-${level}`, setBlockType(n.heading, { level }));\n }\n }\n\n // Lists: split on Enter, indent/outdent on Tab.\n const listItem = n.list_item;\n if (listItem) {\n bind('Enter', splitListItem(listItem));\n }\n\n const tabChain: Command[] = [];\n const shiftTabChain: Command[] = [];\n if (n.table) {\n tabChain.push(goToNextCell(1));\n shiftTabChain.push(goToNextCell(-1));\n }\n if (listItem) {\n tabChain.push(sinkListItem(listItem));\n shiftTabChain.push(liftListItem(listItem));\n }\n tabChain.push(changeIndent(1));\n shiftTabChain.push(changeIndent(-1));\n bindings['Tab'] = chainCommands(...tabChain);\n bindings['Shift-Tab'] = chainCommands(...shiftTabChain);\n\n // Hard break.\n if (n.hard_break) {\n const br = n.hard_break;\n const insertBreak: Command = chainCommands(exitCode, (state, dispatch) => {\n if (dispatch) dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n bind('Shift-Enter', insertBreak);\n bind('Mod-Enter', insertBreak);\n }\n\n return [keymap(bindings), keymap(baseKeymap)];\n}\n","import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\n/**\n * Show placeholder text in an empty document (F-4.7). Adds a node decoration\n * carrying the placeholder as a `data-placeholder` attribute, which the\n * stylesheet renders as ghost text. Purely decorative — never mutates the doc.\n */\nexport function placeholderPlugin(text: string): Plugin {\n return new Plugin({\n props: {\n decorations(state) {\n const { doc } = state;\n const isEmpty =\n doc.childCount === 1 &&\n doc.firstChild != null &&\n doc.firstChild.isTextblock &&\n doc.firstChild.content.size === 0;\n if (!isEmpty) return null;\n const decoration = Decoration.node(0, doc.firstChild!.nodeSize, {\n class: 'rne-empty',\n 'data-placeholder': text,\n });\n return DecorationSet.create(doc, [decoration]);\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\nimport type { Schema } from 'prosemirror-model';\n\n/**\n * Make task-list checkboxes interactive. Clicking the rendered checkbox toggles\n * the `checked` attribute of the enclosing `list_item`. Implemented via a DOM\n * mousedown handler so it works without a custom node view. No-op when the\n * editor is not editable.\n */\nexport function taskListPlugin(schema: Schema): Plugin {\n return new Plugin({\n props: {\n handleDOMEvents: {\n mousedown(view, event) {\n if (!view.editable) return false;\n const target = event.target as HTMLElement | null;\n if (!target || !target.classList?.contains('rne-task-checkbox')) return false;\n\n // posAtDOM / resolve can throw for a transiently-detached node; never\n // let a stray click break the editor (F-11.1).\n try {\n const pos = view.posAtDOM(target, 0);\n if (pos == null || pos < 0) return false;\n\n const $pos = view.state.doc.resolve(pos);\n for (let depth = $pos.depth; depth > 0; depth--) {\n const node = $pos.node(depth);\n if (node.type === schema.nodes.list_item && node.attrs.checked !== null) {\n const itemPos = $pos.before(depth);\n const tr = view.state.tr.setNodeAttribute(itemPos, 'checked', !node.attrs.checked);\n view.dispatch(tr);\n event.preventDefault();\n return true;\n }\n }\n } catch {\n return false;\n }\n return false;\n },\n },\n },\n });\n}\n","/**\n * Pure page-break computation for visual pagination (F-5.3). Given the measured\n * positions/heights of the document's content (in a single, un-paginated flow)\n * and the page geometry, it computes where pages break and where each page's\n * content sits in the rendered (spaced) layout.\n *\n * This function is intentionally DOM-free and deterministic so it can be tested\n * exhaustively. The plugin supplies real measurements; here we only do math.\n *\n * Breaking is **unit-based**. A short block is a single unit (it moves to the\n * next page whole). A tall text block supplies its individual **lines**, so the\n * algorithm can break *inside* it at a line boundary — content flows across\n * pages instead of overflowing (line-level splitting). The document model is\n * never touched; breaks are realized as widget-decoration spacers.\n *\n * The only residual case is a *single unit* (one line, or an unsplittable atom\n * such as an image or table row) taller than a whole page: it cannot be divided\n * and is left to overflow in place.\n */\n\n/** A breakable unit: either a whole block or one line within a tall block. */\nexport interface LineMetric {\n /** ProseMirror position where a spacer mounts to push this line down. */\n pos: number;\n /** Natural top offset of the line (px), in the un-paginated flow. */\n top: number;\n /** Line height (px). */\n height: number;\n}\n\nexport interface BlockMetric {\n /** ProseMirror position immediately before the block (where a spacer mounts). */\n pos: number;\n /** Natural top offset of the block (px), in the un-paginated flow. */\n top: number;\n /** Block height (px), including its own vertical margins. */\n height: number;\n /**\n * Optional line metrics for a tall, splittable text block. When present (and\n * containing more than one line) the block is broken at line boundaries rather\n * than moved whole.\n */\n lines?: LineMetric[];\n}\n\nexport interface PageGeometry {\n /** Usable content height per page (px) = page height − top/bottom margins. */\n contentHeight: number;\n /**\n * Vertical distance (px) between one page's content bottom and the next page's\n * content top in the rendered layout = bottom margin + page gap + top margin.\n */\n interPageOffset: number;\n}\n\nexport interface PageBreak {\n /** Position before the unit that starts the new page. */\n pos: number;\n /** Height of the spacer widget to insert before that unit (px). */\n spacerHeight: number;\n /** 0-based index of the page this break begins. */\n pageIndex: number;\n /** True when the break falls inside a block (between lines) rather than at a block boundary. */\n inline: boolean;\n}\n\nexport interface PaginationResult {\n breaks: PageBreak[];\n pageCount: number;\n /** Rendered Y (px) where each page's content begins (page 0 at 0). */\n pageContentTops: number[];\n}\n\ninterface Unit {\n pos: number;\n top: number;\n height: number;\n inline: boolean;\n}\n\nconst EPS = 0.5;\n\n/** Flatten blocks into an ordered list of breakable units (lines or blocks). */\nfunction toUnits(blocks: BlockMetric[]): Unit[] {\n const units: Unit[] = [];\n for (const block of blocks) {\n if (!Number.isFinite(block.top) || !Number.isFinite(block.height)) continue;\n if (block.lines && block.lines.length > 1) {\n block.lines.forEach((line, i) => {\n if (!Number.isFinite(line.top) || !Number.isFinite(line.height)) return;\n // The first line breaks at the block boundary; later lines break inline.\n units.push({ pos: line.pos, top: line.top, height: line.height, inline: i > 0 });\n });\n } else {\n units.push({ pos: block.pos, top: block.top, height: block.height, inline: false });\n }\n }\n units.sort((a, b) => a.top - b.top);\n return units;\n}\n\nexport function computePagination(blocks: BlockMetric[], geo: PageGeometry): PaginationResult {\n const contentHeight = Math.max(1, geo.contentHeight);\n const interPageOffset = Math.max(0, geo.interPageOffset);\n\n const units = toUnits(blocks);\n const breaks: PageBreak[] = [];\n const pageContentTops: number[] = [0];\n\n let pageStart = 0; // natural top where the current page's content begins\n let cumSpacer = 0; // total spacer height inserted so far\n let pageIndex = 0;\n\n for (const unit of units) {\n const bottom = unit.top + unit.height;\n const overflows = bottom - pageStart > contentHeight + EPS;\n const startsBelowPageTop = unit.top - pageStart > EPS;\n\n if (overflows && startsBelowPageTop) {\n const usedHeight = unit.top - pageStart;\n const spacerHeight = Math.max(0, contentHeight - usedHeight) + interPageOffset;\n pageIndex += 1;\n cumSpacer += spacerHeight;\n breaks.push({ pos: unit.pos, spacerHeight, pageIndex, inline: unit.inline });\n // The new page's content begins at this unit; its rendered top is the\n // unit's natural top plus all spacers inserted up to and including this one.\n pageContentTops.push(unit.top + cumSpacer);\n pageStart = unit.top;\n }\n }\n\n return { breaks, pageCount: pageIndex + 1, pageContentTops };\n}\n\n/** Whether two pagination results are equivalent (avoids redundant re-renders). */\nexport function paginationEquals(a: PaginationResult | null, b: PaginationResult | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.pageCount !== b.pageCount || a.breaks.length !== b.breaks.length) return false;\n for (let i = 0; i < a.breaks.length; i++) {\n const x = a.breaks[i]!;\n const y = b.breaks[i]!;\n if (x.pos !== y.pos || Math.abs(x.spacerHeight - y.spacerHeight) > 1) return false;\n }\n return true;\n}\n","import type { Node as PMNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type EditorState } from 'prosemirror-state';\nimport { Decoration, DecorationSet, type EditorView } from 'prosemirror-view';\nimport {\n type BlockMetric,\n type LineMetric,\n type PaginationResult,\n computePagination,\n paginationEquals,\n} from './compute';\n\n/**\n * Only blocks at least this fraction of a page tall are line-measured; shorter\n * blocks that straddle a boundary are moved whole (a small, acceptable gap),\n * which bounds the cost of line measurement to a few large blocks.\n */\nconst LINE_SPLIT_MIN_RATIO = 0.25;\n/** Safety bound on lines measured per block. */\nconst MAX_LINES_PER_BLOCK = 4000;\n\n/**\n * Visual pagination plugin (F-5.3–F-5.5). Measures the document's top-level\n * blocks, computes page breaks at block boundaries, inserts transparent spacer\n * widget decorations so content visually flows across discrete page sheets, and\n * imperatively renders the page-sheet background layer with repeating\n * headers/footers and live page numbers.\n *\n * It NEVER mutates the document — pagination is purely visual (widget\n * decorations + a sibling background layer). All measurement is wrapped so a\n * failure degrades gracefully to single-flow rendering (F-11.1).\n */\n\nexport const paginationKey = new PluginKey<PaginationPluginState>('rne-pagination');\n\n/** Concrete pixel geometry for the current page configuration. */\nexport interface PaginationGeometry {\n pageWidthPx: number;\n pageHeightPx: number;\n marginTopPx: number;\n marginBottomPx: number;\n marginLeftPx: number;\n contentWidthPx: number;\n /** Usable content height per page (page height − top/bottom margins). */\n contentHeightPx: number;\n /** bottom margin + page gap + top margin. */\n interPageOffsetPx: number;\n}\n\nexport interface PaginationRunningElement {\n show?: boolean;\n /** Static text; `{page}` and `{pages}` are replaced with the live numbers. */\n text?: string;\n /** Horizontal alignment within the content width. Default: header left, footer center. */\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface PaginationOptions {\n /** Returns the current pixel geometry, or null to disable pagination. */\n getGeometry: () => PaginationGeometry | null;\n /** Returns the background-layer element the plugin renders sheets into. */\n getBackgroundLayer: () => HTMLElement | null;\n header?: PaginationRunningElement;\n footer?: PaginationRunningElement & { pageNumbers?: boolean };\n /** Called when the page count changes. */\n onPageCount?: (count: number) => void;\n /**\n * Receives a `requestMeasure` callback the consumer can invoke to force a\n * re-measure (e.g. after changing page geometry at runtime).\n */\n register?: (requestMeasure: () => void) => void;\n}\n\ninterface PaginationPluginState {\n result: PaginationResult | null;\n decorations: DecorationSet;\n}\n\nfunction buildDecorations(doc: PMNode, result: PaginationResult | null) {\n if (!result || result.breaks.length === 0) return DecorationSet.empty;\n const decorations = result.breaks.map((br) =>\n Decoration.widget(\n br.pos,\n () => {\n // A block-display span breaks the inline flow cleanly whether the spacer\n // sits at a block boundary or inside a paragraph (line-level split).\n const el = document.createElement('span');\n el.className = `rne-page-spacer${br.inline ? ' rne-page-spacer--inline' : ''}`;\n el.style.display = 'block';\n el.style.width = '100%';\n el.style.height = `${Math.max(0, br.spacerHeight)}px`;\n el.setAttribute('contenteditable', 'false');\n el.setAttribute('aria-hidden', 'true');\n return el;\n },\n {\n side: -1,\n key: `rne-pb:${br.pos}:${Math.round(br.spacerHeight)}`,\n ignoreSelection: true,\n marks: [],\n },\n ),\n );\n return DecorationSet.create(doc, decorations);\n}\n\nexport function paginationPlugin(options: PaginationOptions): Plugin<PaginationPluginState> {\n return new Plugin<PaginationPluginState>({\n key: paginationKey,\n state: {\n init: () => ({ result: null, decorations: DecorationSet.empty }),\n apply(tr, prev) {\n const meta = tr.getMeta(paginationKey) as { result: PaginationResult } | undefined;\n if (meta) {\n return { result: meta.result, decorations: buildDecorations(tr.doc, meta.result) };\n }\n if (tr.docChanged) {\n // Keep the stored break positions in sync with the mapped decorations\n // so natural-coordinate measurement stays accurate between re-measures.\n const result = prev.result\n ? {\n ...prev.result,\n breaks: prev.result.breaks.map((b) => ({ ...b, pos: tr.mapping.map(b.pos) })),\n }\n : prev.result;\n return { result, decorations: prev.decorations.map(tr.mapping, tr.doc) };\n }\n return prev;\n },\n },\n props: {\n decorations(state) {\n return paginationKey.getState(state)?.decorations ?? DecorationSet.empty;\n },\n },\n view(view) {\n return new PaginationView(view, options);\n },\n });\n}\n\nclass PaginationView {\n private view: EditorView;\n private readonly options: PaginationOptions;\n private scheduled = false;\n private destroyed = false;\n private resizeObserver: ResizeObserver | null = null;\n\n constructor(view: EditorView, options: PaginationOptions) {\n this.view = view;\n this.options = options;\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.schedule());\n this.resizeObserver.observe(view.dom);\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', this.onWindowResize);\n }\n // Images change block heights after they load.\n view.dom.addEventListener('load', this.onAssetLoad, true);\n\n options.register?.(() => this.schedule());\n this.schedule();\n }\n\n private readonly onWindowResize = () => this.schedule();\n private readonly onAssetLoad = (e: Event) => {\n if ((e.target as HTMLElement | null)?.tagName === 'IMG') this.schedule();\n };\n\n update(view: EditorView, prevState: EditorState) {\n this.view = view;\n if (view.state.doc !== prevState.doc) this.schedule();\n }\n\n private schedule() {\n if (this.scheduled || this.destroyed) return;\n this.scheduled = true;\n const raf =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(0), 16);\n raf(() => {\n this.scheduled = false;\n if (!this.destroyed) this.measure();\n });\n }\n\n private measure() {\n try {\n const geo = this.options.getGeometry();\n const bg = this.options.getBackgroundLayer();\n if (!geo || !bg || geo.contentHeightPx <= 0 || geo.pageHeightPx <= 0) {\n this.clearBackground(bg);\n return;\n }\n\n const current = paginationKey.getState(this.view.state)?.result ?? null;\n const blocks = this.measureBlocks(geo, current);\n const result = computePagination(blocks, {\n contentHeight: geo.contentHeightPx,\n interPageOffset: geo.interPageOffsetPx,\n });\n\n this.renderBackground(bg, geo, result);\n this.options.onPageCount?.(result.pageCount);\n\n if (!paginationEquals(result, current)) {\n this.view.dispatch(this.view.state.tr.setMeta(paginationKey, { result }));\n }\n } catch {\n // Measurement must never break editing — fall back to single-flow.\n }\n }\n\n /** Measure top-level blocks in spacer-independent natural coordinates. */\n private measureBlocks(geo: PaginationGeometry, current: PaginationResult | null): BlockMetric[] {\n const view = this.view;\n const contentRect = view.dom.getBoundingClientRect();\n const paddingTop = geo.marginTopPx;\n const currentBreaks = current?.breaks ?? [];\n const lineSplitThreshold = geo.contentHeightPx * LINE_SPLIT_MIN_RATIO;\n\n const offsets: number[] = [];\n const naturalTops: number[] = [];\n const rectHeights: number[] = [];\n const elements: HTMLElement[] = [];\n const splittable: boolean[] = [];\n\n view.state.doc.forEach((node, offset) => {\n let dom: Node | null = null;\n try {\n dom = view.nodeDOM(offset);\n } catch {\n dom = null;\n }\n if (!(dom instanceof HTMLElement)) return;\n const rect = dom.getBoundingClientRect();\n const renderedTop = rect.top - contentRect.top;\n let spacerBefore = 0;\n for (const br of currentBreaks) if (br.pos <= offset) spacerBefore += br.spacerHeight;\n offsets.push(offset);\n naturalTops.push(renderedTop - spacerBefore - paddingTop);\n rectHeights.push(rect.height);\n elements.push(dom);\n // Tables and leaf atoms (images, rules) cannot be line-split safely.\n splittable.push(!node.isAtom && node.type.name !== 'table');\n });\n\n const blocks: BlockMetric[] = [];\n for (let i = 0; i < offsets.length; i++) {\n // Use the gap to the next block (captures collapsed margins) as the height;\n // the last block uses its own rect height.\n const height =\n i < offsets.length - 1\n ? Math.max(rectHeights[i]!, naturalTops[i + 1]! - naturalTops[i]!)\n : rectHeights[i]!;\n\n let lines: LineMetric[] | undefined;\n if (splittable[i] && rectHeights[i]! > lineSplitThreshold) {\n lines = this.measureLines(elements[i]!, offsets[i]!, contentRect, paddingTop, currentBreaks);\n }\n\n blocks.push({ pos: offsets[i]!, top: naturalTops[i]!, height, lines });\n }\n return blocks;\n }\n\n /**\n * Measure the line boxes of a tall, splittable block in spacer-independent\n * natural coordinates so the block can break across pages at line boundaries.\n * Returns `undefined` (block moves whole) if measurement is unavailable or a\n * line position cannot be resolved — never throws.\n */\n private measureLines(\n dom: HTMLElement,\n blockOffset: number,\n contentRect: DOMRect,\n paddingTop: number,\n currentBreaks: PaginationResult['breaks'],\n ): LineMetric[] | undefined {\n try {\n if (typeof document === 'undefined' || typeof document.createRange !== 'function') {\n return undefined;\n }\n const range = document.createRange();\n range.selectNodeContents(dom);\n const rects = range.getClientRects();\n if (!rects || rects.length === 0) return undefined;\n\n // Merge fragment rects that share a baseline into single visual lines.\n const rawLines: Array<{ top: number; bottom: number; left: number }> = [];\n for (let i = 0; i < rects.length && rawLines.length < MAX_LINES_PER_BLOCK; i++) {\n const r = rects[i]!;\n if (r.width <= 0 || r.height <= 0) continue;\n const last = rawLines[rawLines.length - 1];\n if (last && Math.abs(last.top - r.top) < 3) {\n last.bottom = Math.max(last.bottom, r.bottom);\n last.left = Math.min(last.left, r.left);\n } else {\n rawLines.push({ top: r.top, bottom: r.bottom, left: r.left });\n }\n }\n if (rawLines.length < 2) return undefined;\n\n const spacerBeforePos = (pos: number) => {\n let total = 0;\n for (const br of currentBreaks) if (br.pos <= pos) total += br.spacerHeight;\n return total;\n };\n\n const lines: LineMetric[] = [];\n for (let i = 0; i < rawLines.length; i++) {\n const rl = rawLines[i]!;\n let pos: number;\n if (i === 0) {\n pos = blockOffset;\n } else {\n const at = this.view.posAtCoords({ left: rl.left + 1, top: (rl.top + rl.bottom) / 2 });\n if (!at) continue; // unresolvable line → not a break candidate\n pos = at.pos;\n }\n const naturalTop = rl.top - contentRect.top - spacerBeforePos(pos) - paddingTop;\n lines.push({ pos, top: naturalTop, height: rl.bottom - rl.top });\n }\n return lines.length >= 2 ? lines : undefined;\n } catch {\n return undefined;\n }\n }\n\n private renderBackground(bg: HTMLElement, geo: PaginationGeometry, result: PaginationResult) {\n while (bg.firstChild) bg.removeChild(bg.firstChild);\n\n const { pageContentTops, pageCount } = result;\n const headerCfg = this.options.header;\n const footerCfg = this.options.footer;\n\n for (let p = 0; p < pageCount; p++) {\n const sheetTop = pageContentTops[p] ?? p * (geo.contentHeightPx + geo.interPageOffsetPx);\n\n const sheet = document.createElement('div');\n sheet.className = 'rne-page-sheet';\n sheet.style.top = `${sheetTop}px`;\n sheet.style.height = `${geo.pageHeightPx}px`;\n sheet.style.width = `${geo.pageWidthPx}px`;\n bg.appendChild(sheet);\n\n if (headerCfg?.show && headerCfg.text) {\n bg.appendChild(\n this.runningElement(\n 'rne-page-header',\n interpolate(headerCfg.text, p + 1, pageCount),\n sheetTop + geo.marginTopPx * 0.35,\n geo,\n headerCfg.align ?? 'left',\n ),\n );\n }\n\n const footerText =\n footerCfg?.text ?? (footerCfg?.pageNumbers ? 'Page {page} of {pages}' : undefined);\n if ((footerCfg?.show || footerCfg?.pageNumbers) && footerText) {\n bg.appendChild(\n this.runningElement(\n 'rne-page-footer',\n interpolate(footerText, p + 1, pageCount),\n sheetTop + geo.pageHeightPx - geo.marginBottomPx * 0.6,\n geo,\n footerCfg.align ?? 'center',\n ),\n );\n }\n }\n\n const lastTop = pageContentTops[pageCount - 1] ?? 0;\n const totalHeight = lastTop + geo.pageHeightPx;\n bg.style.height = `${totalHeight}px`;\n const container = bg.parentElement;\n if (container) container.style.minHeight = `${totalHeight}px`;\n }\n\n private runningElement(\n className: string,\n text: string,\n top: number,\n geo: PaginationGeometry,\n align: 'left' | 'center' | 'right',\n ): HTMLElement {\n const el = document.createElement('div');\n el.className = className;\n el.textContent = text;\n el.style.position = 'absolute';\n el.style.top = `${top}px`;\n el.style.left = `${geo.marginLeftPx}px`;\n el.style.width = `${geo.contentWidthPx}px`;\n el.style.textAlign = align;\n el.setAttribute('aria-hidden', 'true');\n return el;\n }\n\n private clearBackground(bg: HTMLElement | null) {\n if (!bg) return;\n while (bg.firstChild) bg.removeChild(bg.firstChild);\n bg.style.height = '';\n const container = bg.parentElement;\n if (container) container.style.minHeight = '';\n }\n\n destroy() {\n this.destroyed = true;\n this.resizeObserver?.disconnect();\n if (typeof window !== 'undefined') window.removeEventListener('resize', this.onWindowResize);\n this.view.dom.removeEventListener('load', this.onAssetLoad, true);\n }\n}\n\nfunction interpolate(text: string, page: number, pages: number): string {\n return text.replace(/\\{page\\}/g, String(page)).replace(/\\{pages\\}/g, String(pages));\n}\n","import { Plugin, type EditorState, type Transaction } from 'prosemirror-state';\nimport type { Schema } from 'prosemirror-model';\nimport { history } from 'prosemirror-history';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\nimport { columnResizing, tableEditing } from 'prosemirror-tables';\nimport { sanitizeHtmlSync } from '../../security/sanitize';\nimport { buildInputRules } from './inputrules';\nimport { buildKeymapPlugins } from './keymap';\nimport { placeholderPlugin } from './placeholder';\nimport { taskListPlugin } from './taskList';\nimport { paginationPlugin, type PaginationOptions } from '../pagination/plugin';\n\nexport { buildInputRules } from './inputrules';\nexport { buildKeymapPlugins } from './keymap';\nexport { placeholderPlugin } from './placeholder';\nexport { taskListPlugin } from './taskList';\nexport {\n paginationPlugin,\n paginationKey,\n type PaginationOptions,\n type PaginationGeometry,\n} from '../pagination/plugin';\n\n/** Sanitize pasted HTML before ProseMirror parses it (F-11.4, F-12.1). */\nfunction pasteSanitizerPlugin(): Plugin {\n return new Plugin({\n props: {\n transformPastedHTML(html) {\n return sanitizeHtmlSync(html);\n },\n },\n });\n}\n\nexport interface BuildPluginsOptions {\n /** Placeholder text shown when the document is empty. */\n placeholder?: string;\n /** Enable undo/redo history (default true). */\n history?: boolean;\n /** Additional plugins appended after the built-ins (extension API). */\n extraPlugins?: Plugin[];\n /** Visual pagination options. When provided, the pagination plugin is added. */\n pagination?: PaginationOptions;\n /**\n * Optional hook invoked for every dispatched transaction (used by the React\n * layer to surface change/selection events without re-rendering the surface).\n */\n appendTransaction?: (\n transactions: readonly Transaction[],\n oldState: EditorState,\n newState: EditorState,\n ) => Transaction | null | undefined;\n}\n\n/**\n * Assemble the full plugin stack for a schema. The stack is feature-aware: table\n * and history plugins are only added when supported. The order places input\n * rules and keymaps first, structural helpers next, and table editing last.\n */\nexport function buildPlugins(schema: Schema, options: BuildPluginsOptions = {}): Plugin[] {\n const plugins: Plugin[] = [];\n\n if (options.history !== false) {\n plugins.push(history());\n }\n\n plugins.push(buildInputRules(schema));\n plugins.push(...buildKeymapPlugins(schema));\n plugins.push(dropCursor({ color: 'var(--rne-accent, #df4a36)', width: 2 }));\n plugins.push(gapCursor());\n\n if (schema.nodes.table) {\n plugins.push(columnResizing());\n plugins.push(tableEditing());\n }\n\n plugins.push(taskListPlugin(schema));\n plugins.push(pasteSanitizerPlugin());\n\n if (options.placeholder) {\n plugins.push(placeholderPlugin(options.placeholder));\n }\n\n if (options.pagination) {\n plugins.push(paginationPlugin(options.pagination));\n }\n\n if (options.appendTransaction) {\n const hook = options.appendTransaction;\n plugins.push(new Plugin({ appendTransaction: (trs, oldS, newS) => hook(trs, oldS, newS) ?? null }));\n }\n\n if (options.extraPlugins?.length) {\n plugins.push(...options.extraPlugins);\n }\n\n return plugins;\n}\n","import { Node as PMNode, type Schema } from 'prosemirror-model';\nimport { EditorState, type Plugin } from 'prosemirror-state';\nimport type { DocumentJSON } from '../../config/types';\n\nexport type EditorContent = DocumentJSON | string | null | undefined;\n\n/**\n * Build a document node from arbitrary initial content, defensively (F-11.4):\n * - `null`/`undefined` → an empty document;\n * - a string → paragraphs split on newlines (plain-text initial content);\n * - ProseMirror JSON → parsed and integrity-checked, falling back to empty on\n * any error so malformed input can never crash the editor.\n */\nexport function createDoc(schema: Schema, content: EditorContent): PMNode {\n if (content == null) return emptyDoc(schema);\n\n if (typeof content === 'string') {\n return docFromText(schema, content);\n }\n\n try {\n const node = PMNode.fromJSON(schema, content as Record<string, unknown>);\n node.check();\n return node;\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] Invalid initial content, using empty document.', err);\n return emptyDoc(schema);\n }\n}\n\nfunction emptyDoc(schema: Schema): PMNode {\n const doc = schema.nodes.doc.createAndFill();\n if (!doc) throw new Error('Schema cannot create an empty document.');\n return doc;\n}\n\nfunction docFromText(schema: Schema, text: string): PMNode {\n const paragraphType = schema.nodes.paragraph;\n const lines = text.split(/\\r\\n|\\r|\\n/);\n const paragraphs = lines.map((line) =>\n line ? paragraphType.create(null, schema.text(line)) : paragraphType.createAndFill()!,\n );\n if (paragraphs.length === 0) return emptyDoc(schema);\n return schema.nodes.doc.create(null, paragraphs);\n}\n\nexport interface CreateEditorStateOptions {\n schema: Schema;\n plugins: Plugin[];\n content?: EditorContent;\n}\n\n/** Construct the initial {@link EditorState} for the editor. */\nexport function createEditorState(options: CreateEditorStateOptions): EditorState {\n const { schema, plugins, content } = options;\n return EditorState.create({\n doc: createDoc(schema, content),\n plugins,\n });\n}\n","import type { Node as PMNode } from 'prosemirror-model';\n\nexport interface DocumentStats {\n words: number;\n characters: number;\n charactersNoSpaces: number;\n}\n\n/**\n * Compute word and character counts for a document (F-4.5). Walks text nodes\n * directly — cheap and lean for large documents (NF-1).\n */\nexport function countDocument(doc: PMNode): DocumentStats {\n let text = '';\n doc.descendants((node) => {\n if (node.isText && node.text) {\n text += node.text;\n } else if (node.type.name === 'hard_break') {\n text += ' ';\n }\n return true;\n });\n const trimmed = text.trim();\n const words = trimmed ? trimmed.split(/\\s+/).length : 0;\n return {\n words,\n characters: text.length,\n charactersNoSpaces: text.replace(/\\s/g, '').length,\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-EFE6RHDL.cjs.map
4
+ //# sourceMappingURL=chunk-EFE6RHDL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-EFE6RHDL.cjs"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-G6YRIEK4.js.map
3
+ //# sourceMappingURL=chunk-G6YRIEK4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-G6YRIEK4.js"}
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ var chunkNJCEHQV3_cjs = require('./chunk-NJCEHQV3.cjs');
4
+ var chunkTI44I654_cjs = require('./chunk-TI44I654.cjs');
5
+ var chunkU3O54IYI_cjs = require('./chunk-U3O54IYI.cjs');
6
+
7
+ // src/export/pdf.ts
8
+ function printDocumentToPdf(doc, options = {}) {
9
+ if (typeof document === "undefined") {
10
+ return Promise.reject(new Error("printDocumentToPdf requires a browser environment."));
11
+ }
12
+ const page = options.page ?? chunkU3O54IYI_cjs.DEFAULT_PAGE;
13
+ const html = chunkTI44I654_cjs.buildPrintDocument(doc, page, options.title);
14
+ return new Promise((resolve, reject) => {
15
+ try {
16
+ const iframe = document.createElement("iframe");
17
+ iframe.setAttribute("aria-hidden", "true");
18
+ iframe.style.position = "fixed";
19
+ iframe.style.right = "0";
20
+ iframe.style.bottom = "0";
21
+ iframe.style.width = "0";
22
+ iframe.style.height = "0";
23
+ iframe.style.border = "0";
24
+ document.body.appendChild(iframe);
25
+ const cleanup = () => {
26
+ setTimeout(() => {
27
+ if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
28
+ }, 1e3);
29
+ };
30
+ const win = iframe.contentWindow;
31
+ const docu = iframe.contentDocument || win?.document;
32
+ if (!win || !docu) {
33
+ cleanup();
34
+ reject(new Error("Unable to access print frame document."));
35
+ return;
36
+ }
37
+ docu.open();
38
+ docu.write(html);
39
+ docu.close();
40
+ const doPrint = () => {
41
+ try {
42
+ win.focus();
43
+ win.print();
44
+ resolve();
45
+ } catch (err) {
46
+ reject(err);
47
+ } finally {
48
+ cleanup();
49
+ }
50
+ };
51
+ if (docu.readyState === "complete") {
52
+ setTimeout(doPrint, 50);
53
+ } else {
54
+ iframe.addEventListener("load", () => setTimeout(doPrint, 50), { once: true });
55
+ }
56
+ } catch (err) {
57
+ reject(err);
58
+ }
59
+ });
60
+ }
61
+
62
+ // src/export/download.ts
63
+ function downloadBlob(blob, filename) {
64
+ if (typeof document === "undefined" || typeof URL === "undefined") {
65
+ throw new Error("downloadBlob requires a browser environment.");
66
+ }
67
+ const url = URL.createObjectURL(blob);
68
+ const anchor = document.createElement("a");
69
+ anchor.href = url;
70
+ anchor.download = filename;
71
+ anchor.rel = "noopener";
72
+ anchor.style.display = "none";
73
+ document.body.appendChild(anchor);
74
+ anchor.click();
75
+ document.body.removeChild(anchor);
76
+ setTimeout(() => URL.revokeObjectURL(url), 1e3);
77
+ }
78
+ function downloadText(text, filename, mime = "text/plain") {
79
+ downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);
80
+ }
81
+
82
+ // src/export/index.ts
83
+ async function exportDocument(doc, format, options = {}) {
84
+ const base = options.filename ?? options.title ?? "document";
85
+ switch (format) {
86
+ case "docx": {
87
+ const blob = await chunkNJCEHQV3_cjs.documentToDocxBlob(doc, { page: options.page, title: options.title });
88
+ downloadBlob(blob, ensureExt(base, "docx"));
89
+ return;
90
+ }
91
+ case "pdf":
92
+ await printDocumentToPdf(doc, { page: options.page, title: options.title });
93
+ return;
94
+ case "txt":
95
+ downloadText(chunkNJCEHQV3_cjs.documentToText(doc, options.text), ensureExt(base, "txt"));
96
+ return;
97
+ case "html": {
98
+ const { buildPrintDocument: buildPrintDocument2 } = await import('./html-KU2KHLRF.cjs');
99
+ downloadText(
100
+ buildPrintDocument2(doc, options.page ?? (await import('./defaults-MLYXD2BG.cjs')).DEFAULT_PAGE, options.title),
101
+ ensureExt(base, "html"),
102
+ "text/html"
103
+ );
104
+ return;
105
+ }
106
+ default:
107
+ throw new Error(`Unsupported export format: ${String(format)}`);
108
+ }
109
+ }
110
+ function ensureExt(name, ext) {
111
+ return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;
112
+ }
113
+
114
+ exports.downloadBlob = downloadBlob;
115
+ exports.downloadText = downloadText;
116
+ exports.exportDocument = exportDocument;
117
+ exports.printDocumentToPdf = printDocumentToPdf;
118
+ //# sourceMappingURL=chunk-GFNFJ3FL.cjs.map
119
+ //# sourceMappingURL=chunk-GFNFJ3FL.cjs.map
@@ -0,0 +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"]}