@pixerate/editor 0.23.0 → 0.25.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 (187) hide show
  1. package/README.md +167 -2
  2. package/THIRD_PARTY_NOTICES.md +80 -0
  3. package/dist/agent/index.cjs +10 -8
  4. package/dist/agent/index.cjs.map +1 -1
  5. package/dist/agent/index.d.cts +4 -3
  6. package/dist/agent/index.d.ts +4 -3
  7. package/dist/agent/index.js +4 -2
  8. package/dist/agent/index.js.map +1 -1
  9. package/dist/canvas/index.cjs +4437 -411
  10. package/dist/canvas/index.cjs.map +1 -1
  11. package/dist/canvas/index.d.cts +934 -4
  12. package/dist/canvas/index.d.ts +934 -4
  13. package/dist/canvas/index.js +4309 -283
  14. package/dist/canvas/index.js.map +1 -1
  15. package/dist/chunk-4BVP64JJ.cjs +1406 -0
  16. package/dist/chunk-4BVP64JJ.cjs.map +1 -0
  17. package/dist/chunk-664LQYFJ.js +115 -0
  18. package/dist/chunk-664LQYFJ.js.map +1 -0
  19. package/dist/chunk-7WISYZFO.cjs +740 -0
  20. package/dist/chunk-7WISYZFO.cjs.map +1 -0
  21. package/dist/chunk-AL6JMGWW.cjs +783 -0
  22. package/dist/chunk-AL6JMGWW.cjs.map +1 -0
  23. package/dist/chunk-BVP3TSLH.cjs +69 -0
  24. package/dist/chunk-BVP3TSLH.cjs.map +1 -0
  25. package/dist/{chunk-RIKBJLS2.cjs → chunk-C7P22VIP.cjs} +2001 -279
  26. package/dist/chunk-C7P22VIP.cjs.map +1 -0
  27. package/dist/chunk-D6FH2YAX.cjs +131 -0
  28. package/dist/chunk-D6FH2YAX.cjs.map +1 -0
  29. package/dist/chunk-ECCCYKGL.js +740 -0
  30. package/dist/chunk-ECCCYKGL.js.map +1 -0
  31. package/dist/{chunk-4SUNJZWB.cjs → chunk-FD4LPFAE.cjs} +48 -200
  32. package/dist/chunk-FD4LPFAE.cjs.map +1 -0
  33. package/dist/{chunk-QBJ22YZR.js → chunk-FH6F67DN.js} +1999 -277
  34. package/dist/chunk-FH6F67DN.js.map +1 -0
  35. package/dist/{chunk-OYXSKQFR.js → chunk-FPENXAEJ.js} +35 -187
  36. package/dist/chunk-FPENXAEJ.js.map +1 -0
  37. package/dist/chunk-HLIMTC6N.js +1 -0
  38. package/dist/chunk-HLIMTC6N.js.map +1 -0
  39. package/dist/chunk-HRMEDT2L.js +1406 -0
  40. package/dist/chunk-HRMEDT2L.js.map +1 -0
  41. package/dist/{chunk-QGHGJ56O.js → chunk-IXHSYOVY.js} +2518 -122
  42. package/dist/chunk-IXHSYOVY.js.map +1 -0
  43. package/dist/chunk-MKA3AHLV.cjs +256 -0
  44. package/dist/chunk-MKA3AHLV.cjs.map +1 -0
  45. package/dist/chunk-NAXVVS5I.js +783 -0
  46. package/dist/chunk-NAXVVS5I.js.map +1 -0
  47. package/dist/chunk-O5RYH2PG.js +69 -0
  48. package/dist/chunk-O5RYH2PG.js.map +1 -0
  49. package/dist/chunk-OXSV64JX.js +689 -0
  50. package/dist/chunk-OXSV64JX.js.map +1 -0
  51. package/dist/chunk-P3RQ5UJE.cjs +689 -0
  52. package/dist/chunk-P3RQ5UJE.cjs.map +1 -0
  53. package/dist/chunk-P6ODPZ4W.js +256 -0
  54. package/dist/chunk-P6ODPZ4W.js.map +1 -0
  55. package/dist/chunk-PL4JB3BF.cjs +1 -0
  56. package/dist/chunk-PL4JB3BF.cjs.map +1 -0
  57. package/dist/{chunk-GVSMRPHB.cjs → chunk-PO6A6QQH.cjs} +2607 -211
  58. package/dist/chunk-PO6A6QQH.cjs.map +1 -0
  59. package/dist/{chunk-JJDLPEWL.js → chunk-QGYDWPRM.js} +2 -2
  60. package/dist/chunk-RR7F5GUM.js +5726 -0
  61. package/dist/chunk-RR7F5GUM.js.map +1 -0
  62. package/dist/chunk-TNNJXF46.cjs +115 -0
  63. package/dist/chunk-TNNJXF46.cjs.map +1 -0
  64. package/dist/chunk-U5HZSFCS.js +131 -0
  65. package/dist/chunk-U5HZSFCS.js.map +1 -0
  66. package/dist/{chunk-MJZBNWG7.js → chunk-UAKDG62Z.js} +309 -581
  67. package/dist/chunk-UAKDG62Z.js.map +1 -0
  68. package/dist/{chunk-CL37JGFW.cjs → chunk-V3CHHWOE.cjs} +4 -4
  69. package/dist/{chunk-CL37JGFW.cjs.map → chunk-V3CHHWOE.cjs.map} +1 -1
  70. package/dist/chunk-WSQKHXW7.cjs +5726 -0
  71. package/dist/chunk-WSQKHXW7.cjs.map +1 -0
  72. package/dist/{chunk-AA4ZEVCC.cjs → chunk-X4N4WUKB.cjs} +336 -608
  73. package/dist/chunk-X4N4WUKB.cjs.map +1 -0
  74. package/dist/commands/index.cjs +74 -1
  75. package/dist/commands/index.cjs.map +1 -1
  76. package/dist/commands/index.d.cts +38 -353
  77. package/dist/commands/index.d.ts +38 -353
  78. package/dist/commands/index.js +73 -0
  79. package/dist/commands/index.js.map +1 -1
  80. package/dist/comment-store-BEMgVlAA.d.cts +135 -0
  81. package/dist/comment-store-BEMgVlAA.d.ts +135 -0
  82. package/dist/compare/index.cjs +15 -0
  83. package/dist/compare/index.cjs.map +1 -0
  84. package/dist/compare/index.d.cts +58 -0
  85. package/dist/compare/index.d.ts +58 -0
  86. package/dist/compare/index.js +15 -0
  87. package/dist/compare/index.js.map +1 -0
  88. package/dist/controller-BIJiNoVs.d.cts +1842 -0
  89. package/dist/controller-BIJiNoVs.d.ts +1842 -0
  90. package/dist/documents-CHT1U5Vs.d.ts +86 -0
  91. package/dist/documents-Gp7wb0Me.d.cts +86 -0
  92. package/dist/extensions/index.cjs +100 -5
  93. package/dist/extensions/index.cjs.map +1 -1
  94. package/dist/extensions/index.d.cts +16 -4
  95. package/dist/extensions/index.d.ts +16 -4
  96. package/dist/extensions/index.js +100 -5
  97. package/dist/generation/index.cjs +2317 -0
  98. package/dist/generation/index.cjs.map +1 -0
  99. package/dist/generation/index.d.cts +1015 -0
  100. package/dist/generation/index.d.ts +1015 -0
  101. package/dist/generation/index.js +2317 -0
  102. package/dist/generation/index.js.map +1 -0
  103. package/dist/grammar/index.cjs +48 -3
  104. package/dist/grammar/index.cjs.map +1 -1
  105. package/dist/grammar/index.d.cts +322 -100
  106. package/dist/grammar/index.d.ts +322 -100
  107. package/dist/grammar/index.js +54 -9
  108. package/dist/image-editor/index.cjs +4392 -481
  109. package/dist/image-editor/index.cjs.map +1 -1
  110. package/dist/image-editor/index.d.cts +1249 -97
  111. package/dist/image-editor/index.d.ts +1249 -97
  112. package/dist/image-editor/index.js +4281 -370
  113. package/dist/image-editor/index.js.map +1 -1
  114. package/dist/index-7a6bHTLy.d.ts +1754 -0
  115. package/dist/index-Csd5qI8u.d.cts +1754 -0
  116. package/dist/index.cjs +1682 -99
  117. package/dist/index.cjs.map +1 -1
  118. package/dist/index.d.cts +118 -21
  119. package/dist/index.d.ts +118 -21
  120. package/dist/index.js +1630 -47
  121. package/dist/index.js.map +1 -1
  122. package/dist/mention-text-CDnCFd3c.d.cts +53 -0
  123. package/dist/mention-text-CDnCFd3c.d.ts +53 -0
  124. package/dist/migrate-iTlm3a8h.d.cts +112 -0
  125. package/dist/migrate-iTlm3a8h.d.ts +112 -0
  126. package/dist/model-C1zApQM8.d.cts +219 -0
  127. package/dist/model-C1zApQM8.d.ts +219 -0
  128. package/dist/persistence/index.cjs +676 -0
  129. package/dist/persistence/index.cjs.map +1 -0
  130. package/dist/persistence/index.d.cts +230 -0
  131. package/dist/persistence/index.d.ts +230 -0
  132. package/dist/persistence/index.js +676 -0
  133. package/dist/persistence/index.js.map +1 -0
  134. package/dist/{registry-D5-R90p0.d.cts → registry-BDe-vlv3.d.ts} +2 -40
  135. package/dist/{registry-GJI4gToU.d.ts → registry-CEgwXED1.d.cts} +12 -1
  136. package/dist/{registry-GJI4gToU.d.cts → registry-CEgwXED1.d.ts} +12 -1
  137. package/dist/registry-D32LpIc4.d.cts +354 -0
  138. package/dist/{registry-D5-R90p0.d.ts → registry-DnzpgY27.d.cts} +2 -40
  139. package/dist/registry-evKTP4ls.d.ts +354 -0
  140. package/dist/schema-DYDGdYL9.d.cts +41 -0
  141. package/dist/schema-DYDGdYL9.d.ts +41 -0
  142. package/dist/serializers/index.cjs +12 -3
  143. package/dist/serializers/index.cjs.map +1 -1
  144. package/dist/serializers/index.d.cts +40 -12
  145. package/dist/serializers/index.d.ts +40 -12
  146. package/dist/serializers/index.js +12 -3
  147. package/dist/sourcemap-C8AH3MBQ.d.cts +91 -0
  148. package/dist/sourcemap-DA1Evhrv.d.ts +91 -0
  149. package/dist/spreadsheet/index.cjs +161 -3
  150. package/dist/spreadsheet/index.cjs.map +1 -1
  151. package/dist/spreadsheet/index.d.cts +611 -20
  152. package/dist/spreadsheet/index.d.ts +611 -20
  153. package/dist/spreadsheet/index.js +168 -10
  154. package/dist/storage-BpFfspHm.d.cts +120 -0
  155. package/dist/storage-BpFfspHm.d.ts +120 -0
  156. package/dist/tokens/index.cjs +115 -0
  157. package/dist/tokens/index.cjs.map +1 -0
  158. package/dist/tokens/index.d.cts +212 -0
  159. package/dist/tokens/index.d.ts +212 -0
  160. package/dist/tokens/index.js +115 -0
  161. package/dist/tokens/index.js.map +1 -0
  162. package/dist/{tokens-CyLZmIei.d.cts → tokens-D7yXvUU6.d.cts} +15 -2
  163. package/dist/{tokens-CyLZmIei.d.ts → tokens-D7yXvUU6.d.ts} +15 -2
  164. package/dist/{track-changes-BSF58RK0.d.cts → track-changes-D_VAPELi.d.cts} +110 -144
  165. package/dist/{track-changes-BSF58RK0.d.ts → track-changes-Db_fGEvx.d.ts} +110 -144
  166. package/package.json +21 -1
  167. package/dist/chunk-4SUNJZWB.cjs.map +0 -1
  168. package/dist/chunk-AA4ZEVCC.cjs.map +0 -1
  169. package/dist/chunk-AXV2ZW34.cjs +0 -118
  170. package/dist/chunk-AXV2ZW34.cjs.map +0 -1
  171. package/dist/chunk-B2ZRLN4S.js +0 -118
  172. package/dist/chunk-B2ZRLN4S.js.map +0 -1
  173. package/dist/chunk-GVSMRPHB.cjs.map +0 -1
  174. package/dist/chunk-K3R5NG2D.js +0 -3100
  175. package/dist/chunk-K3R5NG2D.js.map +0 -1
  176. package/dist/chunk-MJZBNWG7.js.map +0 -1
  177. package/dist/chunk-OYXSKQFR.js.map +0 -1
  178. package/dist/chunk-QBJ22YZR.js.map +0 -1
  179. package/dist/chunk-QGHGJ56O.js.map +0 -1
  180. package/dist/chunk-RIKBJLS2.cjs.map +0 -1
  181. package/dist/chunk-XDMXXC4Z.cjs +0 -3100
  182. package/dist/chunk-XDMXXC4Z.cjs.map +0 -1
  183. package/dist/controller-pePCJLT1.d.cts +0 -959
  184. package/dist/controller-pePCJLT1.d.ts +0 -959
  185. package/dist/index-CCr_z9kF.d.cts +0 -899
  186. package/dist/index-Ck6ajwXh.d.ts +0 -899
  187. /package/dist/{chunk-JJDLPEWL.js.map → chunk-QGYDWPRM.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/gradient-text.ts","../src/extensions/slash-commands.ts","../src/extensions/template-suggestions.ts","../src/extensions/loading-node.ts","../src/extensions/SmilieReplacer.ts","../src/extensions/ColorHighlighter.ts","../src/extensions/FontSize.ts","../src/extensions/rich-text-preset.ts","../src/extensions/mention.ts","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/tiptap/tight-lists.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/util/markdown.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/serialize/state.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/html.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/util/dom.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/html.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/blockquote.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/bullet-list.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/code-block.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/hard-break.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/heading.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/horizontal-rule.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/image.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/list-item.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/ordered-list.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/paragraph.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/util/prosemirror.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/table.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/task-item.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/task-list.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/nodes/text.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/bold.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/code.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/italic.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/link.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/marks/strike.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/index.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/util/extensions.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/serialize/MarkdownSerializer.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/parse/MarkdownParser.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/extensions/tiptap/clipboard.js","../../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/src/Markdown.js","../src/extensions/markdown.ts","../src/extensions/image.ts","../src/extensions/comments.ts","../src/extensions/document-compare.ts","../src/extensions/file-import.ts","../src/import/registry.ts","../src/import/zip.ts","../src/import/docx.ts","../src/import/adapters.ts","../src/import/editor.ts","../src/extensions/rich-clipboard.ts","../src/extensions/autocorrect.ts","../src/extensions/document-structure/outline.ts","../src/extensions/document-structure/utils.ts","../src/extensions/document-structure/table-of-contents.ts","../src/extensions/document-structure/markdown-it.ts","../src/extensions/document-structure/footnotes.ts","../src/extensions/document-structure/bookmarks.ts","../src/extensions/document-structure/cross-reference.ts","../src/extensions/document-structure/command-items.ts","../src/extensions/find-replace/extension.ts","../src/extensions/find-replace/pattern.ts","../src/extensions/find-replace/search.ts","../src/extensions/paragraph-styles/extension.ts","../src/extensions/paragraph-styles/registry.ts","../src/extensions/find-replace/commands.ts"],"sourcesContent":["import { Mark } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport { TEMPLATE_REGEX, VARIABLE_REGEX, INSTRUCTION_REGEX, ColorGradient } from \"../grammar/tokens\";\nimport {\n matchConditionalTags,\n parseVariableBody,\n type ConditionalTagLike,\n} from \"../grammar/variables\";\n\nexport interface GradientTextOptions {\n templateColorMap: Map<string, ColorGradient>;\n speed?: number;\n jsonVariables?: string[] | Set<string>;\n onTemplateClick?: (templateName: string, event: MouseEvent) => void;\n}\n\nconst createGradientDecorations = (\n doc: ProsemirrorNode,\n options: GradientTextOptions,\n): Decoration[] => {\n const decorations: Decoration[] = [];\n const speed = options.speed ?? 1;\n const jsonVarSet = options.jsonVariables\n ? options.jsonVariables instanceof Set\n ? options.jsonVariables\n : new Set(options.jsonVariables)\n : null;\n const conditionalTags: (ConditionalTagLike & { start: number; end: number })[] =\n [];\n\n doc.descendants((node, pos) => {\n if (node.isText) {\n const text = node.text || \"\";\n let match: RegExpExecArray | null;\n\n // 1. Template: {{templateName}}\n const tmplRegex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n while ((match = tmplRegex.exec(text)) !== null) {\n const templateName = match[1].trim();\n const colors = options.templateColorMap?.get(templateName);\n\n if (colors) {\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, ${colorFrom}, ${colorTo}, ${colorFrom}); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent border border-(--color-to)/20 px-1 py-0.5 rounded-sm cursor-pointer\",\n style,\n \"data-template\": templateName,\n }),\n );\n }\n }\n\n // 2. Instruction: __text__\n const instRegex = new RegExp(\n INSTRUCTION_REGEX.source,\n INSTRUCTION_REGEX.flags,\n );\n while ((match = instRegex.exec(text)) !== null) {\n const content = match[1].trim();\n const colors = options.templateColorMap?.get(content) || {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, #fb7185, #8b5cf6, #fb7185); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"italic animate-gradient bg-gradient-to-r from-rose-400 from-50% to-violet-500 to-50% bg-size-[200%_100%] bg-clip-text text-transparent inline-flex items-baseline gap-0.5\",\n style,\n }),\n );\n }\n\n // 3. Variable: {variableName}, {name|default|description}, and the\n // conditional tags {?name} / {!name} / {/name} (paired below).\n const varRegex = new RegExp(\n VARIABLE_REGEX.source,\n VARIABLE_REGEX.flags,\n );\n while ((match = varRegex.exec(text)) !== null) {\n const parsed = parseVariableBody(match[1]);\n const start = pos + match.index;\n const end = start + match[0].length;\n\n if (parsed.kind === \"conditional\") {\n conditionalTags.push({\n conditional: parsed.conditional,\n name: parsed.name,\n start,\n end,\n });\n continue;\n }\n\n const variableName = parsed.name;\n const isJsonVar = jsonVarSet?.has(variableName);\n const attrs: Record<string, string> = {\n class: isJsonVar\n ? \"bg-violet-400/40 border-b-4 border-rose-300 dark:border-rose-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\"\n : \"bg-rose-400/40 border-b-4 border-violet-300 dark:border-violet-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\",\n \"data-variable\": variableName,\n };\n if (parsed.defaultValue !== undefined) {\n // A dashed underline marks slots that fall back to a default.\n attrs.class += \" border-dashed\";\n attrs[\"data-default\"] = parsed.defaultValue;\n }\n if (parsed.description !== undefined) {\n attrs[\"data-description\"] = parsed.description;\n }\n const title = [\n parsed.description,\n parsed.defaultValue !== undefined\n ? `Default: ${parsed.defaultValue || \"(empty)\"}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\" · \");\n if (title) attrs.title = title;\n\n decorations.push(Decoration.inline(start, end, attrs));\n }\n }\n });\n\n // Sections may span paragraphs, so tags are paired across the whole doc.\n matchConditionalTags(conditionalTags).forEach((result, i) => {\n const tag = conditionalTags[i];\n decorations.push(\n Decoration.inline(\n tag.start,\n tag.end,\n result.error\n ? {\n class:\n \"underline decoration-wavy decoration-red-500 text-red-600 dark:text-red-400\",\n \"data-conditional-error\": result.error,\n title:\n result.error === \"invalid-condition\"\n ? `Invalid condition: ${result.comparison?.error ?? tag.name}`\n : result.error === \"unclosed-section\"\n ? `Section \"${tag.name}\" is never closed with {/${tag.name}}`\n : `{/${tag.name}} does not close any open section`,\n }\n : {\n class:\n \"bg-amber-400/30 text-amber-700 dark:text-amber-300 font-medium px-0.5 rounded-xs\",\n \"data-conditional\": tag.conditional,\n // A comparison (`{?amount>100}`) names its subject variable.\n \"data-variable-condition\": result.comparison?.subject ?? tag.name,\n },\n ),\n );\n });\n\n return decorations;\n};\n\nexport const GradientText = Mark.create<GradientTextOptions>({\n name: \"gradientText\",\n\n addOptions() {\n return {\n templateColorMap: new Map(),\n speed: 1,\n jsonVariables: undefined,\n onTemplateClick: undefined,\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const defaultColors = {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n const speed = this.options.speed ?? 1;\n const style = `--bg-size: ${speed * 300}%; --color-from: ${\n defaultColors.from\n }; --color-to: ${defaultColors.to}; caret-color: #111 !important;`;\n\n return [\n \"span\",\n {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent\",\n style,\n ...HTMLAttributes,\n },\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: \"span\",\n getAttrs: (node) =>\n (node as HTMLElement).classList.contains(\"animate-gradient\") &&\n (node as HTMLElement).classList.contains(\"bg-clip-text\") &&\n null,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markOptions = this.options;\n\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return DecorationSet.create(\n doc,\n createGradientDecorations(doc, markOptions),\n );\n },\n apply(tr, value: DecorationSet) {\n const newDoc = tr.doc;\n if (tr.docChanged) {\n return DecorationSet.create(\n newDoc,\n createGradientDecorations(newDoc, markOptions),\n );\n }\n return value.map(tr.mapping, newDoc);\n },\n },\n props: {\n decorations(state: EditorState) {\n return (this as any).getState(state) as DecorationSet;\n },\n handleClickOn(view, pos, _node, _nodePos, event) {\n const decorationSet = (this as any).getState(\n view.state,\n ) as DecorationSet;\n const decorations = decorationSet.find(pos, pos + 1);\n\n for (const decoration of decorations) {\n const decorationWithAttrs = decoration as any;\n const templateName =\n decorationWithAttrs.type?.attrs?.[\"data-template\"];\n if (templateName) {\n if (markOptions.onTemplateClick) {\n markOptions.onTemplateClick(templateName, event as MouseEvent);\n }\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"show-gradient-popover\", {\n detail: {\n templateName,\n target: event.target,\n },\n }),\n );\n }\n return true;\n }\n }\n return false;\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\n\nexport interface SlashCommandMatchData {\n match: RegExpMatchArray;\n query: string;\n from: number;\n to: number;\n coords: { top: number; left: number; bottom: number; right: number };\n}\n\nexport interface SlashCommandsOptions {\n trigger?: string;\n onMatch?: (data: SlashCommandMatchData) => void;\n onClear?: () => void;\n containerId?: string;\n}\n\nexport const SlashCommands = Extension.create<SlashCommandsOptions>({\n name: \"slashCommands\",\n\n addOptions() {\n return {\n trigger: \"/\",\n onMatch: undefined,\n onClear: undefined,\n containerId: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n return [\n new Plugin({\n view() {\n return {\n update(view) {\n const { state } = view;\n const { selection } = state;\n const { $from } = selection;\n\n if (!$from.parent.isTextblock) {\n opts.onClear?.();\n return;\n }\n\n const textBeforeCursor = $from.parent.textBetween(\n 0,\n $from.parentOffset,\n );\n\n const slashMatch = textBeforeCursor.match(\n /(?:^|\\s)\\/([a-zA-Z0-9_-]*)$/,\n );\n\n if (slashMatch) {\n const matchIndex = slashMatch.index ?? 0;\n const offsetInParent =\n matchIndex + (slashMatch[0].startsWith(\" \") ? 1 : 0);\n const matchFrom = $from.start() + offsetInParent;\n const matchTo = $from.pos;\n const coords = view.coordsAtPos($from.pos);\n\n let relativeCoords = {\n top: coords.top,\n left: coords.left,\n bottom: coords.bottom,\n right: coords.right,\n };\n\n if (opts.containerId && typeof document !== \"undefined\") {\n const container = document.getElementById(opts.containerId);\n if (container) {\n const rect = container.getBoundingClientRect();\n relativeCoords = {\n top: coords.bottom - rect.top + 5,\n left: coords.left - rect.left,\n bottom: coords.bottom - rect.top,\n right: coords.right - rect.left,\n };\n }\n }\n\n opts.onMatch?.({\n match: slashMatch,\n query: slashMatch[1] || \"\",\n from: matchFrom,\n to: matchTo,\n coords: relativeCoords,\n });\n } else {\n opts.onClear?.();\n }\n },\n };\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport Suggestion, { SuggestionOptions } from \"@tiptap/suggestion\";\nimport { Template } from \"../grammar/tokens\";\n\nexport interface TemplateSuggestionsOptions {\n templates: Template[];\n char?: string;\n onSuggestion?: (props: {\n query: string;\n range: { from: number; to: number };\n clientRect?: (() => DOMRect | null) | null;\n items: Template[];\n command: (props: { name: string }) => void;\n }) => void;\n}\n\nexport const TemplateSuggestions = Extension.create<TemplateSuggestionsOptions>({\n name: \"templateSuggestions\",\n\n addOptions() {\n return {\n templates: [],\n char: \"{{\",\n onSuggestion: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n const suggestionConfig: Omit<SuggestionOptions<Template>, \"editor\"> = {\n char: opts.char || \"{{\",\n items: ({ query }) => {\n const lower = query.toLowerCase();\n return (opts.templates || []).filter((t) =>\n t.name.toLowerCase().includes(lower),\n );\n },\n command: ({ editor, range, props }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent(`{{${props.name}}}`)\n .run();\n },\n render: () => {\n return {\n onStart: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onUpdate: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onExit: () => {\n opts.onSuggestion?.({\n query: \"\",\n range: { from: 0, to: 0 },\n items: [],\n command: () => {},\n });\n },\n };\n },\n };\n\n const SuggestionFn =\n typeof Suggestion === \"function\"\n ? Suggestion\n : (Suggestion as any)?.default || (Suggestion as any)?.Suggestion;\n\n return [\n SuggestionFn({\n editor: this.editor,\n ...suggestionConfig,\n }),\n ];\n },\n});\n","import { Node, mergeAttributes } from \"@tiptap/core\";\n\nexport const LoadingNode = Node.create({\n name: \"loadingNode\",\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) return {};\n return { \"data-id\": attributes.id };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-type=\"loading\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"loading\",\n class: \"inline-flex items-center px-1.5 py-0.5 text-xs text-muted-foreground animate-pulse\",\n }),\n \"⏳\",\n ];\n },\n});\n","import { Extension, textInputRule } from \"@tiptap/core\";\nimport type { AutocorrectRule } from \"./autocorrect\";\n\n/**\n * Smilie patterns (each ending in a typed space) and their replacements.\n * Longer patterns come first so they win over their prefixes.\n */\nexport const SMILIE_REPLACEMENTS: ReadonlyArray<readonly [RegExp, string]> = [\n [/-___- $/, \"😑 \"],\n [/:'-\\) $/, \"😂 \"],\n [/':-\\) $/, \"😅 \"],\n [/':-D $/, \"😅 \"],\n [/>:-\\) $/, \"😆 \"],\n [/-__- $/, \"😑 \"],\n [/':-\\( $/, \"😓 \"],\n [/:'-\\( $/, \"😢 \"],\n [/>:-\\( $/, \"😠 \"],\n [/O:-\\) $/, \"😇 \"],\n [/:'\\) $/, \"😂 \"],\n [/:-D $/, \"😃 \"],\n [/':\\) $/, \"😅 \"],\n [/;-\\) $/, \"😉 \"],\n [/B-\\) $/, \"😎 \"],\n [/:-\\* $/, \"😘 \"],\n [/:-\\) $/, \"🙂 \"],\n [/-_- $/, \"😑 \"],\n [/:-O $/, \"😮 \"],\n [/:-P $/, \"😛 \"],\n [/:-p $/, \"😛 \"],\n [/:-\\/ $/, \"😕 \"],\n [/:-\\( $/, \"😞 \"],\n [/:'\\( $/, \"😢 \"],\n [/:D $/, \"😃 \"],\n [/=D $/, \"😃 \"],\n [/;\\) $/, \"😉 \"],\n [/B\\) $/, \"😎 \"],\n [/:\\) $/, \"🙂 \"],\n [/=\\) $/, \"🙂 \"],\n [/:O $/, \"😮 \"],\n [/:P $/, \"😛 \"],\n [/:p $/, \"😛 \"],\n [/:\\/ $/, \"😕 \"],\n [/:\\( $/, \"😞 \"],\n [/<3 $/, \"❤️ \"],\n [/<\\/3 $/, \"💔 \"],\n [/\\/shrug $/, \"¯\\\\_(ツ)_/¯ \"],\n];\n\n/**\n * The smilies as `Autocorrect` rules. Straight apostrophes in the patterns\n * also match curly `‘` and `’`, because the smart-quote rule converts `'` as soon as\n * it is typed.\n */\nexport const smilieAutocorrectRules: AutocorrectRule[] = SMILIE_REPLACEMENTS.map(\n ([find, replace], index) => ({\n id: `smilie:${index}`,\n find: new RegExp(find.source.replace(/'/g, \"['\\u2018\\u2019]\"), find.flags),\n replace,\n }),\n);\n\nexport const SmilieReplacer = Extension.create({\n name: \"smilieReplacer\",\n\n addInputRules() {\n return SMILIE_REPLACEMENTS.map(([find, replace]) =>\n textInputRule({ find, replace }),\n );\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\n\nexport function findHexColors(doc: ProsemirrorNode): DecorationSet {\n const hexColorRegex = /(#[0-9a-fA-F]{3,8})\\b/g;\n const decorations: Decoration[] = [];\n\n doc.descendants((node, position) => {\n if (!node.text) return;\n\n let match: RegExpExecArray | null;\n while ((match = hexColorRegex.exec(node.text)) !== null) {\n const color = match[0];\n const from = position + match.index;\n const to = from + color.length;\n\n decorations.push(\n Decoration.inline(from, to, {\n class: \"color-highlight px-1 py-0.5 rounded text-xs font-mono border\",\n style: `--color: ${color}; background-color: ${color}20; border-color: ${color}; color: ${color};`,\n }),\n );\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport const ColorHighlighter = Extension.create({\n name: \"colorHighlighter\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return findHexColors(doc);\n },\n apply(transaction, oldState) {\n return transaction.docChanged ? findHexColors(transaction.doc) : oldState;\n },\n },\n props: {\n decorations(state) {\n return (this as any).getState(state);\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport \"@tiptap/extension-text-style\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize.replace(/['\"]+/g, \"\"),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontSize }).run(),\n unsetFontSize:\n () =>\n ({ chain }) =>\n chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run(),\n };\n },\n});\n\nexport default FontSize;\n","import {\n wrappingInputRule,\n markInputRule,\n type Extensions,\n} from \"@tiptap/core\";\nimport * as _StarterKit from \"@tiptap/starter-kit\";\nimport * as _Color from \"@tiptap/extension-color\";\nimport * as _Highlight from \"@tiptap/extension-highlight\";\nimport * as _Link from \"@tiptap/extension-link\";\nimport * as _TaskList from \"@tiptap/extension-task-list\";\nimport * as _TaskItem from \"@tiptap/extension-task-item\";\nimport * as _TextAlign from \"@tiptap/extension-text-align\";\nimport * as _TextStyle from \"@tiptap/extension-text-style\";\nimport * as _Typography from \"@tiptap/extension-typography\";\nimport * as _Underline from \"@tiptap/extension-underline\";\nimport * as _Placeholder from \"@tiptap/extension-placeholder\";\nimport * as _CharacterCount from \"@tiptap/extension-character-count\";\n\nconst resolveExt = (mod: any, name: string) =>\n mod?.[name] ||\n mod?.default?.[name] ||\n mod?.default?.default ||\n mod?.default ||\n mod;\n\nconst StarterKit = resolveExt(_StarterKit, \"StarterKit\");\nconst Color = resolveExt(_Color, \"Color\");\nconst Highlight = resolveExt(_Highlight, \"Highlight\");\nconst Link = resolveExt(_Link, \"Link\");\nconst TaskList = resolveExt(_TaskList, \"TaskList\");\nconst TaskItem = resolveExt(_TaskItem, \"TaskItem\");\nconst TextAlign = resolveExt(_TextAlign, \"TextAlign\");\nconst TextStyle = resolveExt(_TextStyle, \"TextStyle\");\nconst Typography = resolveExt(_Typography, \"Typography\");\nconst Underline = resolveExt(_Underline, \"Underline\");\nconst Placeholder = resolveExt(_Placeholder, \"Placeholder\");\nconst CharacterCount = resolveExt(_CharacterCount, \"CharacterCount\");\n\nimport { SmilieReplacer } from \"./SmilieReplacer\";\nimport { ColorHighlighter } from \"./ColorHighlighter\";\nimport { FontSize } from \"./FontSize\";\nimport { Mention, type MentionOptions } from \"./mention\";\nimport { Markdown, type MarkdownOptions } from \"./markdown\";\nimport { Image, type ImageOptions } from \"./image\";\nimport { Comments, type CommentsOptions } from \"./comments\";\nimport { TrackChanges, type TrackChangesOptions } from \"./track-changes\";\nimport { DocumentCompare } from \"./document-compare\";\nimport { FileImport, type FileImportOptions } from \"./file-import\";\nimport { RichClipboard, type RichClipboardOptions } from \"./rich-clipboard\";\nimport { Autocorrect, type AutocorrectOptions } from \"./autocorrect\";\nimport {\n Outline,\n TableOfContents,\n FootnoteReference,\n Footnotes,\n Footnote,\n Bookmark,\n CrossReference,\n type OutlineOptions,\n type TableOfContentsOptions,\n type FootnotesOptions,\n type BookmarkOptions,\n type CrossReferenceOptions,\n} from \"./document-structure\";\nimport { FindReplace, type FindReplaceOptions } from \"./find-replace/extension\";\nimport { ParagraphStyles, type ParagraphStylesOptions } from \"./paragraph-styles/extension\";\n\n/**\n * The TipTap packages whose commands the preset installs. Exported only so the\n * published declarations import them: each package augments `@tiptap/core`'s\n * `Commands` interface, which is what types `editor.chain().toggleBold()`,\n * `toggleHeading()`, `setTextAlign()` and so on for apps that use the preset\n * without depending on those packages themselves. (Triple-slash references are\n * dropped by the declaration bundler, and runtime imports leave no trace in .d.ts.)\n */\nexport type RichTextPresetCommandPackages = [\n typeof import(\"@tiptap/starter-kit\"),\n typeof import(\"@tiptap/extension-color\"),\n typeof import(\"@tiptap/extension-highlight\"),\n typeof import(\"@tiptap/extension-image\"),\n typeof import(\"@tiptap/extension-link\"),\n typeof import(\"@tiptap/extension-task-list\"),\n typeof import(\"@tiptap/extension-text-align\"),\n typeof import(\"@tiptap/extension-text-style\"),\n typeof import(\"@tiptap/extension-underline\"),\n];\n\nexport interface RichTextPresetOptions {\n placeholder?: string | ((props: { node: any }) => string);\n characterLimit?: number;\n openLinksOnClick?: boolean;\n enableSmilies?: boolean;\n enableColorHighlighter?: boolean;\n headingLevels?: (1 | 2 | 3 | 4 | 5 | 6)[];\n mention?: MentionOptions | boolean;\n markdown?: MarkdownOptions | boolean;\n image?: ImageOptions | boolean;\n /** Adds the `Comments` extension (off by default). */\n comments?: Partial<CommentsOptions> | boolean;\n /** Adds the `TrackChanges` and `DocumentCompare` extensions (off by default). */\n trackChanges?: Partial<TrackChangesOptions> | boolean;\n /** Import dropped/pasted .md, .html, .txt and .rtf files (opt-in). */\n fileImport?: FileImportOptions | boolean;\n /** Copy/paste lossless ProseMirror slices between editors (opt-in). */\n richClipboard?: RichClipboardOptions | boolean;\n /**\n * Word-style AutoCorrect (smart quotes, symbols, fractions, sentence\n * capitalization, ...). Off by default. Replaces the Typography extension\n * when enabled, since both handle quotes and dashes.\n */\n autocorrect?: Partial<AutocorrectOptions> | boolean;\n /** Heading outline with stable heading ids. Off by default. */\n outline?: Partial<OutlineOptions> | boolean;\n /** Table of contents block (also enables `outline`). Off by default. */\n tableOfContents?: Partial<TableOfContentsOptions> | boolean;\n /** Footnote references and the footnotes list. Off by default. */\n footnotes?: Partial<FootnotesOptions> | boolean;\n /** Named bookmarks. Off by default. */\n bookmarks?: Partial<BookmarkOptions> | boolean;\n /** Cross-references to headings and bookmarks (also enables `outline`). Off by default. */\n crossReferences?: Partial<CrossReferenceOptions> | boolean;\n /** Word-style Find and Replace (Mod+F / Mod+H, match highlights). Off by default. */\n findReplace?: Partial<FindReplaceOptions> | boolean;\n /**\n * Paragraph styles (Normal, Title, Heading 1–6, Quote, …) with a style\n * registry, `data-style` attributes and next-style on Enter. Off by default.\n */\n paragraphStyles?: Partial<ParagraphStylesOptions> | boolean;\n}\n\nconst optionObject = <T>(value: T | boolean | undefined): T | Record<string, never> =>\n typeof value === \"object\" && value !== null ? value : {};\n\n/**\n * Creates a standard rich-text extensions bundle with full formatting support.\n */\nexport function createRichTextPreset(\n options: RichTextPresetOptions = {},\n): Extensions {\n const {\n placeholder = \"Start typing...\",\n characterLimit,\n openLinksOnClick = false,\n enableSmilies = true,\n enableColorHighlighter = true,\n headingLevels = [1, 2, 3, 4],\n } = options;\n\n const extensions: Extensions = [\n StarterKit.configure({\n orderedList: {\n HTMLAttributes: {\n class: \"list-decimal pl-4\",\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: \"list-disc pl-4\",\n },\n },\n heading: {\n levels: headingLevels,\n HTMLAttributes: {\n class: \"font-bold tracking-tight\",\n },\n },\n }),\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Underline,\n ...(options.autocorrect ? [] : [Typography]),\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Link.extend({\n addInputRules() {\n return [\n markInputRule({\n find: /(?:^|\\s)\\[([^\\]]+)\\]\\(([^)]+)\\)$/,\n type: this.type,\n getAttributes: (match) => ({\n href: match[2],\n }),\n }),\n ];\n },\n }).configure({\n openOnClick: openLinksOnClick,\n autolink: true,\n defaultProtocol: \"https\",\n protocols: [\"file\", \"vscode\", \"cursor\"],\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n class: \"text-blue-500 underline underline-offset-2\",\n },\n }),\n TaskList,\n TaskItem.extend({\n addInputRules() {\n return [\n wrappingInputRule({\n find: /^\\s*(\\[([ |x])?\\])\\s$/i,\n type: this.type,\n getAttributes: (match) => ({\n checked: match[2]?.toLowerCase() === \"x\",\n }),\n }),\n ];\n },\n }).configure({\n nested: true,\n }),\n FontSize,\n Placeholder.configure({\n emptyEditorClass: \"is-empty\",\n placeholder:\n typeof placeholder === \"function\" ? placeholder : () => placeholder,\n }),\n ];\n\n if (characterLimit) {\n extensions.push(\n CharacterCount.configure({\n limit: characterLimit,\n }),\n );\n }\n\n if (enableSmilies) {\n extensions.push(SmilieReplacer);\n }\n\n if (enableColorHighlighter) {\n extensions.push(ColorHighlighter);\n }\n\n if (options.mention) {\n const mentionConfig =\n typeof options.mention === \"object\" ? options.mention : {};\n extensions.push(\n Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...(mentionConfig.HTMLAttributes || {}),\n },\n ...mentionConfig,\n }),\n );\n }\n\n if (options.markdown) {\n const markdownConfig =\n typeof options.markdown === \"object\" ? options.markdown : {};\n extensions.push(\n Markdown.configure({\n html: true,\n tightLists: true,\n tightListClass: \"tight\",\n bulletListMarker: \"-\",\n linkify: true,\n breaks: true,\n transformPastedText: true,\n transformCopiedText: true,\n ...markdownConfig,\n }),\n );\n }\n\n if (options.image !== false) {\n const imageConfig =\n typeof options.image === \"object\" ? options.image : {};\n extensions.push(\n Image.configure({\n HTMLAttributes: {\n class: \"rounded-md max-w-full h-auto my-2\",\n ...(imageConfig.HTMLAttributes || {}),\n },\n ...imageConfig,\n }),\n );\n }\n\n if (options.comments) {\n extensions.push(\n typeof options.comments === \"object\"\n ? Comments.configure(options.comments)\n : Comments,\n );\n }\n\n if (options.trackChanges) {\n extensions.push(\n typeof options.trackChanges === \"object\"\n ? TrackChanges.configure(options.trackChanges)\n : TrackChanges,\n DocumentCompare,\n );\n }\n\n if (options.fileImport) {\n extensions.push(\n FileImport.configure(\n typeof options.fileImport === \"object\" ? options.fileImport : {},\n ),\n );\n }\n\n if (options.richClipboard) {\n extensions.push(\n RichClipboard.configure(\n typeof options.richClipboard === \"object\" ? options.richClipboard : {},\n ),\n );\n }\n\n if (options.autocorrect) {\n extensions.push(Autocorrect.configure(optionObject(options.autocorrect)));\n }\n\n if (options.outline || options.tableOfContents || options.crossReferences) {\n extensions.push(Outline.configure(optionObject(options.outline)));\n }\n\n if (options.tableOfContents) {\n extensions.push(TableOfContents.configure(optionObject(options.tableOfContents)));\n }\n\n if (options.footnotes) {\n extensions.push(\n FootnoteReference.configure(optionObject(options.footnotes)),\n Footnotes,\n Footnote,\n );\n }\n\n if (options.bookmarks) {\n extensions.push(Bookmark.configure(optionObject(options.bookmarks)));\n }\n\n if (options.crossReferences) {\n extensions.push(CrossReference.configure(optionObject(options.crossReferences)));\n }\n\n if (options.findReplace) {\n extensions.push(FindReplace.configure(optionObject(options.findReplace)));\n }\n\n if (options.paragraphStyles) {\n extensions.push(ParagraphStyles.configure(optionObject(options.paragraphStyles)));\n }\n\n return extensions;\n}\n","import {\n Mention as TipTapMention,\n type MentionOptions as TipTapMentionOptions,\n} from \"@tiptap/extension-mention\";\nimport type { SuggestionOptions } from \"@tiptap/suggestion\";\n\nexport interface MentionEntity {\n id: string;\n label: string;\n type?: string;\n avatarUrl?: string;\n color?: string;\n handle?: string;\n name?: string;\n hexColor?: string;\n aliases?: string[];\n [key: string]: any;\n}\n\nexport interface MentionOptions extends Partial<TipTapMentionOptions> {\n HTMLAttributes?: Record<string, any>;\n suggestion?: Partial<SuggestionOptions<MentionEntity>>;\n}\n\nconst BaseMention =\n TipTapMention ||\n (TipTapMention as any)?.default?.default ||\n (TipTapMention as any)?.default ||\n (TipTapMention as any);\n\n/**\n * First-class native Mention extension for @pixerate/editor.\n * Creates atomic inline <span data-type=\"mention\"> nodes with full suggestion support.\n */\nexport const Mention = BaseMention.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n type: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-type-name\") ||\n element.getAttribute(\"data-entity-type\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.type) return {};\n return { \"data-type-name\": attributes.type };\n },\n },\n avatarUrl: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-avatar-url\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.avatarUrl) return {};\n return { \"data-avatar-url\": attributes.avatarUrl };\n },\n },\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-color\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.color) return {};\n return { \"data-color\": attributes.color };\n },\n },\n // Role of an asset mention (`reference`, `style`, `start_frame`, …). The\n // node attribute is `assetRole` so entities that already carry a `role`\n // (e.g. a user's job title) passed as suggestion props do not set it.\n assetRole: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const role = element.getAttribute(\"data-role\");\n return role && MENTION_ROLE_PATTERN.test(role) ? role : null;\n },\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.assetRole) return {};\n return { \"data-role\": attributes.assetRole };\n },\n },\n };\n },\n});\n\nconst MENTION_ROLE_PATTERN = /^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/;\n\n/** Mention nodes in a document, with their positions (for role pickers). */\nexport interface MentionNodeInfo {\n pos: number;\n id: string;\n label: string;\n type?: string;\n role?: string;\n}\n\n/** Every mention node of an editor's document, in document order. */\nexport function getMentionNodes(editor: { state: { doc: any } }): MentionNodeInfo[] {\n const result: MentionNodeInfo[] = [];\n editor.state.doc.descendants((node: any, pos: number) => {\n if (node.type?.name !== \"mention\") return;\n result.push({\n pos,\n id: node.attrs.id ?? \"\",\n label: node.attrs.label ?? \"\",\n ...(node.attrs.type ? { type: node.attrs.type } : {}),\n ...(node.attrs.assetRole ? { role: node.attrs.assetRole } : {}),\n });\n });\n return result;\n}\n\n/**\n * Sets (or with `null` clears) the role of the mention node at `pos`, as one\n * undoable step. Returns `false` when there is no mention at `pos` or the role\n * name is invalid.\n */\nexport function setMentionRoleAt(editor: any, pos: number, role: string | null): boolean {\n const node = editor?.state?.doc?.nodeAt(pos);\n if (!node || node.type.name !== \"mention\") return false;\n if (role !== null && !MENTION_ROLE_PATTERN.test(role)) return false;\n const tr = editor.state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, assetRole: role });\n editor.view.dispatch(tr);\n return true;\n}\n\n/**\n * Helper to configure the Mention extension with preset defaults.\n */\nexport function createMentionExtension(options: Partial<MentionOptions> = {}) {\n const { HTMLAttributes = {}, ...rest } = options;\n return Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...HTMLAttributes,\n },\n ...rest,\n });\n}\n","import { Extension } from \"@tiptap/core\";\n\nexport const MarkdownTightLists = Extension.create({\n name: 'markdownTightLists',\n addOptions: () => ({\n tight: true,\n tightClass: 'tight',\n listTypes: [\n 'bulletList',\n 'orderedList',\n ],\n }),\n addGlobalAttributes() {\n return [\n {\n types: this.options.listTypes,\n attributes: {\n tight: {\n default: this.options.tight,\n parseHTML: element =>\n element.getAttribute('data-tight') === 'true' || !element.querySelector('p'),\n renderHTML: attributes => ({\n class: attributes.tight ? this.options.tightClass : null,\n 'data-tight': attributes.tight ? 'true' : null,\n }),\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n toggleTight: (tight = null) => ({ editor, commands }) => {\n function toggleTight(name) {\n if(!editor.isActive(name)) {\n return false;\n }\n const attrs = editor.getAttributes(name);\n return commands.updateAttributes(name, {\n tight: tight ?? !attrs?.tight,\n });\n }\n return this.options.listTypes\n .some(name => toggleTight(name));\n }\n }\n },\n});\n","import markdownit from 'markdown-it';\n\nconst md = markdownit();\n\nfunction scanDelims(text, pos) {\n md.inline.State.prototype.scanDelims.call({ src: text, posMax: text.length })\n const state = new (md.inline.State)(text, null, null, []);\n return state.scanDelims(pos, true);\n}\n\nexport function shiftDelim(text, delim, start, offset) {\n let res = text.substring(0, start) + text.substring(start + delim.length);\n res = res.substring(0, start + offset) + delim + res.substring(start + offset);\n return res;\n}\n\nfunction trimStart(text, delim, from, to) {\n let pos = from, res = text;\n while(pos < to) {\n if(scanDelims(res, pos).can_open) {\n break;\n }\n res = shiftDelim(res, delim, pos, 1);\n pos++;\n }\n return { text: res, from: pos, to }\n}\n\nfunction trimEnd(text, delim, from, to) {\n let pos = to, res = text;\n while(pos > from) {\n if(scanDelims(res, pos).can_close) {\n break;\n }\n res = shiftDelim(res, delim, pos, -1);\n pos--;\n }\n return { text: res, from, to: pos }\n}\n\nexport function trimInline(text, delim, from, to) {\n let state = {\n text,\n from,\n to,\n }\n\n state = trimStart(state.text, delim, state.from, state.to);\n state = trimEnd(state.text, delim, state.from, state.to);\n\n if(state.to - state.from < delim.length + 1) {\n state.text = state.text.substring(0, state.from) + state.text.substring(state.to + delim.length);\n }\n\n return state.text;\n}\n","import { MarkdownSerializerState as BaseMarkdownSerializerState } from \"prosemirror-markdown\";\nimport { trimInline } from \"../util/markdown\";\n\n\n/**\n * Override default MarkdownSerializerState to:\n * - handle commonmark delimiters (https://spec.commonmark.org/0.29/#left-flanking-delimiter-run)\n */\nexport class MarkdownSerializerState extends BaseMarkdownSerializerState {\n\n inTable = false;\n\n constructor(nodes, marks, options) {\n super(nodes, marks, options ?? {});\n this.inlines = [];\n }\n\n render(node, parent, index) {\n super.render(node, parent, index);\n const top = this.inlines[this.inlines.length - 1];\n if(top?.start && top?.end) {\n const { delimiter, start, end } = this.normalizeInline(top);\n this.out = trimInline(this.out, delimiter, start, end);\n this.inlines.pop();\n }\n }\n\n markString(mark, open, parent, index) {\n const info = this.marks[mark.type.name]\n if(info.expelEnclosingWhitespace) {\n if(open) {\n this.inlines.push({\n start: this.out.length,\n delimiter: info.open,\n });\n } else {\n const top = this.inlines.pop();\n this.inlines.push({\n ...top,\n end: this.out.length,\n });\n }\n }\n return super.markString(mark, open, parent, index);\n }\n\n normalizeInline(inline) {\n let { start, end } = inline;\n while(this.out.charAt(start).match(/\\s/)) {\n start++;\n }\n return {\n ...inline,\n start,\n }\n }\n}\n","import { Fragment } from \"@tiptap/pm/model\";\nimport { getHTMLFromFragment, Mark } from \"@tiptap/core\";\n\n\nexport default Mark.create({\n name: 'markdownHTMLMark',\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: {\n open(state, mark) {\n if(!this.editor.storage.markdown.options.html) {\n console.warn(`Tiptap Markdown: \"${mark.type.name}\" mark is only available in html mode`);\n return '';\n }\n return getMarkTags(mark)?.[0] ?? '';\n },\n close(state, mark) {\n if(!this.editor.storage.markdown.options.html) {\n return '';\n }\n return getMarkTags(mark)?.[1] ?? '';\n },\n },\n parse: {\n // handled by markdown-it\n }\n }\n }\n }\n});\n\nfunction getMarkTags(mark) {\n const schema = mark.type.schema;\n const node = schema.text(' ', [mark]);\n const html = getHTMLFromFragment(Fragment.from(node), schema);\n const match = html.match(/^(<.*?>) (<\\/.*?>)$/);\n return match ? [match[1], match[2]] : null;\n}\n","\n\nexport function elementFromString(value) {\n // add a wrapper to preserve leading and trailing whitespace\n const wrappedValue = `<body>${value}</body>`\n\n return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body\n}\n\nexport function escapeHTML(value) {\n return value\n ?.replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nexport function extractElement(node) {\n const parent = node.parentElement;\n const prepend = parent.cloneNode();\n\n while(parent.firstChild && parent.firstChild !== node) {\n prepend.appendChild(parent.firstChild);\n }\n\n if(prepend.childNodes.length > 0) {\n parent.parentElement.insertBefore(prepend, parent);\n }\n parent.parentElement.insertBefore(node, parent);\n if(parent.childNodes.length === 0) {\n parent.remove();\n }\n}\n\nexport function unwrapElement(node) {\n const parent = node.parentNode;\n\n while (node.firstChild) parent.insertBefore(node.firstChild, node);\n\n parent.removeChild(node);\n}\n","import { Fragment } from \"@tiptap/pm/model\";\nimport { getHTMLFromFragment, Node } from \"@tiptap/core\";\nimport { elementFromString } from \"../../util/dom\";\n\n\nexport default Node.create({\n name: 'markdownHTMLNode',\n addStorage() {\n return {\n markdown: {\n serialize(state, node, parent) {\n if(this.editor.storage.markdown.options.html) {\n state.write(serializeHTML(node, parent));\n } else {\n console.warn(`Tiptap Markdown: \"${node.type.name}\" node is only available in html mode`);\n state.write(`[${node.type.name}]`);\n }\n if(node.isBlock) {\n state.closeBlock(node);\n }\n },\n parse: {\n // handled by markdown-it\n },\n },\n }\n }\n});\n\nfunction serializeHTML(node, parent) {\n const schema = node.type.schema;\n const html = getHTMLFromFragment(Fragment.from(node), schema);\n\n if(node.isBlock && (parent instanceof Fragment || parent.type.name === schema.topNodeType.name)) {\n return formatBlock(html);\n }\n\n return html;\n}\n\n/**\n * format html block as per the commonmark spec\n */\nfunction formatBlock(html) {\n const dom = elementFromString(html);\n const element = dom.firstElementChild;\n\n element.innerHTML = element.innerHTML.trim()\n ? `\\n${element.innerHTML}\\n`\n : `\\n`;\n\n return element.outerHTML;\n}\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Blockquote = Node.create({\n name: 'blockquote',\n});\n\nexport default Blockquote.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.blockquote,\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\n\n\nconst BulletList = Node.create({\n name: 'bulletList',\n});\n\nexport default BulletList.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node) {\n return state.renderList(node, \" \", () => (this.editor.storage.markdown.options.bulletListMarker || \"-\") + \" \");\n },\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\n\n\nconst CodeBlock = Node.create({\n name: 'codeBlock',\n});\n\nexport default CodeBlock.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node) {\n state.write(\"```\" + (node.attrs.language || \"\") + \"\\n\");\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(\"```\");\n state.closeBlock(node);\n },\n parse: {\n setup(markdownit) {\n markdownit.set({\n langPrefix: this.options.languageClassPrefix ?? 'language-',\n });\n },\n updateDOM(element) {\n element.innerHTML = element.innerHTML.replace(/\\n<\\/code><\\/pre>/g, '</code></pre>')\n },\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport HTMLNode from './html';\n\nconst HardBreak = Node.create({\n name: 'hardBreak',\n});\n\nexport default HardBreak.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++)\n if (parent.child(i).type != node.type) {\n state.write(\n state.inTable\n ? HTMLNode.storage.markdown.serialize.call(this, state, node, parent)\n : \"\\\\\\n\"\n );\n return;\n }\n },\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Heading = Node.create({\n name: 'heading',\n});\n\nexport default Heading.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.heading,\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst HorizontalRule = Node.create({\n name: 'horizontalRule',\n});\n\nexport default HorizontalRule.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.horizontal_rule,\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Image = Node.create({\n name: 'image',\n});\n\nexport default Image.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.image,\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst ListItem = Node.create({\n name: 'listItem',\n});\n\nexport default ListItem.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.list_item,\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\n\n\nconst OrderedList = Node.create({\n name: 'orderedList',\n});\n\nfunction findIndexOfAdjacentNode(node, parent, index) {\n let i = 0;\n for (; index - i > 0; i++) {\n if (parent.child(index - i - 1).type.name !== node.type.name) {\n break;\n }\n }\n return i;\n}\n\nexport default OrderedList.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node, parent, index) {\n const start = node.attrs.start || 1\n const maxW = String(start + node.childCount - 1).length\n const space = state.repeat(\" \", maxW + 2)\n const adjacentIndex = findIndexOfAdjacentNode(node, parent, index);\n const separator = adjacentIndex % 2 ? ') ' : '. ';\n state.renderList(node, space, i => {\n const nStr = String(start + i)\n return state.repeat(\" \", maxW - nStr.length) + nStr + separator;\n })\n },\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Paragraph = Node.create({\n name: 'paragraph',\n});\n\nexport default Paragraph.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.nodes.paragraph,\n parse: {\n // handled by markdown-it\n },\n },\n }\n }\n});\n","\n\nexport function childNodes(node) {\n return node?.content?.content ?? [];\n}\n","import { Node } from \"@tiptap/core\";\nimport { childNodes } from \"../../util/prosemirror\";\nimport HTMLNode from './html';\n\nconst Table = Node.create({\n name: 'table',\n});\n\nexport default Table.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node, parent) {\n if(!isMarkdownSerializable(node)) {\n HTMLNode.storage.markdown.serialize.call(this, state, node, parent);\n return;\n }\n state.inTable = true;\n node.forEach((row, p, i) => {\n state.write('| ');\n row.forEach((col, p, j) => {\n if(j) {\n state.write(' | ');\n }\n const cellContent = col.firstChild;\n if(cellContent.textContent.trim()) {\n state.renderInline(cellContent);\n }\n });\n state.write(' |')\n state.ensureNewLine();\n if(!i) {\n const delimiterRow = Array.from({length: row.childCount}).map(() => '---').join(' | ');\n state.write(`| ${delimiterRow} |`);\n state.ensureNewLine();\n }\n });\n state.closeBlock(node);\n state.inTable = false;\n },\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n})\n\n\nfunction hasSpan(node) {\n return node.attrs.colspan > 1 || node.attrs.rowspan > 1;\n}\n\nfunction isMarkdownSerializable(node) {\n const rows = childNodes(node);\n const firstRow = rows[0];\n const bodyRows = rows.slice(1);\n\n if(childNodes(firstRow).some(cell => cell.type.name !== 'tableHeader' || hasSpan(cell) || cell.childCount > 1)) {\n return false;\n }\n\n if(bodyRows.some(row =>\n childNodes(row).some(cell => cell.type.name === 'tableHeader' || hasSpan(cell) || cell.childCount > 1)\n )) {\n return false;\n }\n\n return true;\n}\n","import { Node } from \"@tiptap/core\";\n\n\nconst TaskItem = Node.create({\n name: 'taskItem',\n});\n\nexport default TaskItem.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node) {\n const check = node.attrs.checked ? '[x]' : '[ ]';\n state.write(`${check} `);\n state.renderContent(node);\n },\n parse: {\n updateDOM(element) {\n [...element.querySelectorAll('.task-list-item')]\n .forEach(item => {\n const input = item.querySelector('input');\n item.setAttribute('data-type', 'taskItem');\n if(input) {\n item.setAttribute('data-checked', input.checked);\n input.remove();\n }\n });\n },\n }\n }\n }\n }\n});\n","import taskListPlugin from \"markdown-it-task-lists\";\nimport { Node } from \"@tiptap/core\";\nimport BulletList from \"./bullet-list\";\n\n\nconst TaskList = Node.create({\n name: 'taskList',\n});\n\nexport default TaskList.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: BulletList.storage.markdown.serialize,\n parse: {\n setup(markdownit) {\n markdownit.use(taskListPlugin);\n },\n updateDOM(element) {\n [...element.querySelectorAll('.contains-task-list')]\n .forEach(list => {\n list.setAttribute('data-type', 'taskList');\n });\n },\n }\n }\n }\n }\n});\n","import { Node } from \"@tiptap/core\";\nimport { escapeHTML } from \"../../util/dom\";\n\n\nconst Text = Node.create({\n name: 'text',\n});\n\nexport default Text.extend({\n /**\n * @return {{markdown: MarkdownNodeSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize(state, node) {\n state.text(escapeHTML(node.text));\n },\n parse: {\n // handled by markdown-it\n },\n }\n }\n }\n});\n","import { Mark } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Bold = Mark.create({\n name: 'bold',\n});\n\nexport default Bold.extend({\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.marks.strong,\n parse: {\n // handled by markdown-it\n }\n },\n }\n }\n});\n","import { Mark } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Code = Mark.create({\n name: 'code',\n});\n\nexport default Code.extend({\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.marks.code,\n parse: {\n // handled by markdown-it\n }\n }\n }\n }\n})\n","import { Mark } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Italic = Mark.create({\n name: 'italic',\n});\n\nexport default Italic.extend({\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.marks.em,\n parse: {\n // handled by markdown-it\n }\n }\n }\n }\n})\n","import { Mark } from \"@tiptap/core\";\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\n\n\nconst Link = Mark.create({\n name: 'link',\n});\n\nexport default Link.extend({\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: defaultMarkdownSerializer.marks.link,\n parse: {\n // handled by markdown-it\n }\n }\n }\n }\n})\n","import { Mark } from \"@tiptap/core\";\n\n\nconst Strike = Mark.create({\n name: 'strike',\n});\n\nexport default Strike.extend({\n /**\n * @return {{markdown: MarkdownMarkSpec}}\n */\n addStorage() {\n return {\n markdown: {\n serialize: {open: '~~', close: '~~', expelEnclosingWhitespace: true},\n parse: {\n // handled by markdown-it\n },\n },\n }\n }\n});\n","import Blockquote from \"./nodes/blockquote\";\nimport BulletList from \"./nodes/bullet-list\";\nimport CodeBlock from \"./nodes/code-block\";\nimport HardBreak from \"./nodes/hard-break\";\nimport Heading from \"./nodes/heading\";\nimport HorizontalRule from \"./nodes/horizontal-rule\";\nimport HTMLNode from \"./nodes/html\";\nimport Image from \"./nodes/image\";\nimport ListItem from \"./nodes/list-item\";\nimport OrderedList from \"./nodes/ordered-list\";\nimport Paragraph from \"./nodes/paragraph\";\nimport Table from \"./nodes/table\";\nimport TaskItem from \"./nodes/task-item\";\nimport TaskList from \"./nodes/task-list\";\nimport Text from \"./nodes/text\";\n\nimport Bold from \"./marks/bold\";\nimport Code from \"./marks/code\";\nimport HTMLMark from \"./marks/html\";\nimport Italic from \"./marks/italic\";\nimport Link from \"./marks/link\";\nimport Strike from \"./marks/strike\";\n\n\nexport default [\n Blockquote,\n BulletList,\n CodeBlock,\n HardBreak,\n Heading,\n HorizontalRule,\n HTMLNode,\n Image,\n ListItem,\n OrderedList,\n Paragraph,\n Table,\n TaskItem,\n TaskList,\n Text,\n\n Bold,\n Code,\n HTMLMark,\n Italic,\n Link,\n Strike,\n]\n","import markdownExtensions from \"../extensions\";\n\n\nexport function getMarkdownSpec(extension) {\n const markdownSpec = extension.storage?.markdown;\n const defaultMarkdownSpec = markdownExtensions.find(e => e.name === extension.name)?.storage.markdown;\n\n if(markdownSpec || defaultMarkdownSpec) {\n return {\n ...defaultMarkdownSpec,\n ...markdownSpec,\n };\n }\n\n return null;\n}\n","import { MarkdownSerializerState } from './state';\nimport HTMLMark from \"../extensions/marks/html\";\nimport HTMLNode from \"../extensions/nodes/html\";\nimport { getMarkdownSpec } from \"../util/extensions\";\nimport HardBreak from \"../extensions/nodes/hard-break\";\n\n\nexport class MarkdownSerializer {\n /**\n * @type {import('@tiptap/core').Editor}\n */\n editor = null;\n\n constructor(editor) {\n this.editor = editor;\n }\n\n serialize(content) {\n const state = new MarkdownSerializerState(this.nodes, this.marks, {\n hardBreakNodeName: HardBreak.name,\n });\n\n state.renderContent(content);\n\n return state.out;\n }\n\n get nodes() {\n return {\n ...Object.fromEntries(\n Object.keys(this.editor.schema.nodes)\n .map(name => [name, this.serializeNode(HTMLNode)])\n ),\n ...Object.fromEntries(\n this.editor.extensionManager.extensions\n .filter(extension => extension.type === 'node' && this.serializeNode(extension))\n .map(extension => [extension.name, this.serializeNode(extension)])\n ?? []\n ),\n };\n }\n\n get marks() {\n return {\n ...Object.fromEntries(\n Object.keys(this.editor.schema.marks)\n .map(name => [name, this.serializeMark(HTMLMark)])\n ),\n ...Object.fromEntries(\n this.editor.extensionManager.extensions\n .filter(extension => extension.type === 'mark' && this.serializeMark(extension))\n .map(extension => [extension.name, this.serializeMark(extension)])\n ?? []\n ),\n };\n }\n\n serializeNode(node) {\n return getMarkdownSpec(node)?.serialize?.bind({ editor: this.editor, options: node.options });\n }\n\n serializeMark(mark) {\n const serialize = getMarkdownSpec(mark)?.serialize;\n return serialize\n ? {\n ...serialize,\n open: typeof serialize.open === 'function' ? serialize.open.bind({ editor: this.editor, options: mark.options }) : serialize.open,\n close: typeof serialize.close === 'function' ? serialize.close.bind({ editor: this.editor, options: mark.options }) : serialize.close,\n }\n : null\n }\n}\n\n","import markdownit from \"markdown-it\";\nimport { elementFromString, extractElement, unwrapElement } from \"../util/dom\";\nimport { getMarkdownSpec } from \"../util/extensions\";\n\nexport class MarkdownParser {\n /**\n * @type {import('@tiptap/core').Editor}\n */\n editor = null;\n /**\n * @type {markdownit}\n */\n md = null;\n\n constructor(editor, { html, linkify, breaks }) {\n this.editor = editor;\n this.md = this.withPatchedRenderer(markdownit({\n html,\n linkify,\n breaks,\n }));\n }\n\n parse(content, { inline } = {}) {\n if(typeof content === 'string') {\n this.editor.extensionManager.extensions.forEach(extension =>\n getMarkdownSpec(extension)?.parse?.setup?.call({ editor:this.editor, options:extension.options }, this.md)\n );\n\n const renderedHTML = this.md.render(content);\n const element = elementFromString(renderedHTML);\n\n this.editor.extensionManager.extensions.forEach(extension =>\n getMarkdownSpec(extension)?.parse?.updateDOM?.call({ editor:this.editor, options:extension.options }, element)\n );\n\n this.normalizeDOM(element, { inline, content });\n\n return element.innerHTML;\n }\n\n return content;\n }\n\n normalizeDOM(node, { inline, content }) {\n this.normalizeBlocks(node);\n\n // remove all \\n appended by markdown-it\n node.querySelectorAll('*').forEach(el => {\n if(el.nextSibling?.nodeType === Node.TEXT_NODE && !el.closest('pre')) {\n el.nextSibling.textContent = el.nextSibling.textContent.replace(/^\\n/, '');\n }\n });\n\n if(inline) {\n this.normalizeInline(node, content);\n }\n\n return node;\n }\n\n normalizeBlocks(node) {\n const blocks = Object.values(this.editor.schema.nodes)\n .filter(node => node.isBlock);\n\n const selector = blocks\n .map(block => block.spec.parseDOM?.map(spec => spec.tag))\n .flat()\n .filter(Boolean)\n .join(',');\n\n if(!selector) {\n return;\n }\n\n [...node.querySelectorAll(selector)].forEach(el => {\n if(el.parentElement.matches('p')) {\n extractElement(el);\n }\n });\n }\n\n normalizeInline(node, content) {\n if(node.firstElementChild?.matches('p')) {\n const firstParagraph = node.firstElementChild;\n const { nextElementSibling } = firstParagraph;\n const startSpaces = content.match(/^\\s+/)?.[0] ?? '';\n const endSpaces = !nextElementSibling\n ? content.match(/\\s+$/)?.[0] ?? ''\n : '';\n\n if(content.match(/^\\n\\n/)) {\n firstParagraph.innerHTML = `${firstParagraph.innerHTML}${endSpaces}`;\n return;\n }\n\n unwrapElement(firstParagraph);\n\n node.innerHTML = `${startSpaces}${node.innerHTML}${endSpaces}`;\n }\n }\n\n /**\n * @param {markdownit} md\n */\n withPatchedRenderer(md) {\n const withoutNewLine = (renderer) => (...args) => {\n const rendered = renderer(...args);\n if(rendered === '\\n') {\n return rendered; // keep soft breaks\n }\n if(rendered[rendered.length - 1] === '\\n') {\n return rendered.slice(0, -1);\n }\n return rendered;\n }\n\n md.renderer.rules.hardbreak = withoutNewLine(md.renderer.rules.hardbreak);\n md.renderer.rules.softbreak = withoutNewLine(md.renderer.rules.softbreak);\n md.renderer.rules.fence = withoutNewLine(md.renderer.rules.fence);\n md.renderer.rules.code_block = withoutNewLine(md.renderer.rules.code_block);\n md.renderer.renderToken = withoutNewLine(md.renderer.renderToken.bind(md.renderer));\n\n return md;\n }\n}\n\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { DOMParser } from '@tiptap/pm/model';\nimport { elementFromString } from \"../../util/dom\";\n\nexport const MarkdownClipboard = Extension.create({\n name: 'markdownClipboard',\n addOptions() {\n return {\n transformPastedText: false,\n transformCopiedText: false,\n }\n },\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('markdownClipboard'),\n props: {\n clipboardTextParser: (text, context, plainText) => {\n if(plainText || !this.options.transformPastedText) {\n return null; // pasting with shift key prevents formatting\n }\n const parsed = this.editor.storage.markdown.parser.parse(text, { inline: true });\n return DOMParser.fromSchema(this.editor.schema)\n .parseSlice(elementFromString(parsed), {\n preserveWhitespace: true,\n context,\n });\n },\n /**\n * @param {import('prosemirror-model').Slice} slice\n */\n clipboardTextSerializer: (slice) => {\n if(!this.options.transformCopiedText) {\n return null;\n }\n return this.editor.storage.markdown.serializer.serialize(slice.content);\n },\n },\n })\n ]\n }\n})\n","import { Extension, extensions } from '@tiptap/core';\nimport { MarkdownTightLists } from \"./extensions/tiptap/tight-lists\";\nimport { MarkdownSerializer } from \"./serialize/MarkdownSerializer\";\nimport { MarkdownParser } from \"./parse/MarkdownParser\";\nimport { MarkdownClipboard } from \"./extensions/tiptap/clipboard\";\n\nexport const Markdown = Extension.create({\n name: 'markdown',\n priority: 50,\n addOptions() {\n return {\n html: true,\n tightLists: true,\n tightListClass: 'tight',\n bulletListMarker: '-',\n linkify: false,\n breaks: false,\n transformPastedText: false,\n transformCopiedText: false,\n }\n },\n addCommands() {\n const commands = extensions.Commands.config.addCommands();\n return {\n setContent: (content, emitUpdate, parseOptions) => (props) => {\n return commands.setContent(\n props.editor.storage.markdown.parser.parse(content),\n emitUpdate,\n parseOptions\n )(props);\n },\n insertContentAt: (range, content, options) => (props) => {\n return commands.insertContentAt(\n range,\n props.editor.storage.markdown.parser.parse(content, { inline: true }),\n options\n )(props);\n },\n }\n },\n onBeforeCreate() {\n this.editor.storage.markdown = {\n options: { ...this.options },\n parser: new MarkdownParser(this.editor, this.options),\n serializer: new MarkdownSerializer(this.editor),\n getMarkdown: () => {\n return this.editor.storage.markdown.serializer.serialize(this.editor.state.doc);\n },\n }\n this.editor.options.initialContent = this.editor.options.content;\n this.editor.options.content = this.editor.storage.markdown.parser.parse(this.editor.options.content);\n },\n onCreate() {\n this.editor.options.content = this.editor.options.initialContent;\n delete this.editor.options.initialContent;\n },\n addStorage() {\n return {\n /// storage will be defined in onBeforeCreate() to prevent initial object overriding\n }\n },\n addExtensions() {\n return [\n MarkdownTightLists.configure({\n tight: this.options.tightLists,\n tightClass: this.options.tightListClass,\n }),\n MarkdownClipboard.configure({\n transformPastedText: this.options.transformPastedText,\n transformCopiedText: this.options.transformCopiedText,\n }),\n ]\n },\n});\n","import {\n Markdown as TipTapMarkdown,\n type MarkdownOptions as TipTapMarkdownOptions,\n} from \"tiptap-markdown\";\n\nconst resolveExt = (mod: any, name: string) =>\n mod?.[name] ||\n mod?.default?.[name] ||\n mod?.default?.default ||\n mod?.default ||\n mod;\n\n/**\n * Built-in native Markdown extension for @pixerate/editor based on tiptap-markdown.\n * Enables automatic markdown parsing, serialization, and clipboard handling.\n */\nexport const Markdown = resolveExt(TipTapMarkdown, \"Markdown\");\n\nexport type { TipTapMarkdownOptions as MarkdownOptions };\n","import * as _Image from \"@tiptap/extension-image\";\nimport type { ImageOptions as TipTapImageOptions } from \"@tiptap/extension-image\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nconst resolveExt = (mod: any, name: string) =>\n mod?.[name] ||\n mod?.default?.[name] ||\n mod?.default?.default ||\n mod?.default ||\n mod;\n\nconst BaseImage = resolveExt(_Image, \"Image\");\n\nexport interface ImageOptions extends Partial<TipTapImageOptions> {\n /**\n * Custom upload handler called when an image is pasted or dropped.\n * Resolves to the uploaded image URL string.\n */\n upload?: (file: File) => Promise<string> | string;\n\n /**\n * Callback invoked if the upload handler throws or rejects, or if an image\n * exceeds maxBase64Size when no upload handler is configured.\n */\n onUploadError?: (error: Error, file: File) => void;\n\n /**\n * Maximum allowed file size (in bytes) when embedding images as base64 data URLs\n * without an upload handler. Defaults to 65536 (64 KB).\n * Files larger than this will be rejected to avoid memory bloat and prompt/stream saturation.\n */\n maxBase64Size?: number;\n\n /**\n * Whether to enable automatic image pasting from clipboard. Defaults to true.\n */\n enablePaste?: boolean;\n\n /**\n * Whether to enable automatic image drop. Defaults to true.\n */\n enableDrop?: boolean;\n}\n\nexport const imagePastePluginKey = new PluginKey(\"imagePasteHandler\");\n\n/**\n * Inserts an image node into the editor view at the current selection.\n */\nexport function insertImageNode(view: any, src: string, alt?: string) {\n const { schema } = view.state;\n const imageType = schema.nodes.image;\n if (!imageType) return;\n const node = imageType.create({ src, alt: alt || \"\" });\n const tr = view.state.tr.replaceSelectionWith(node);\n view.dispatch(tr);\n}\n\n/**\n * Updates an existing image node's src attribute across document positions.\n */\nexport function updateImageSrc(view: any, oldSrc: string, newSrc: string) {\n const { doc } = view.state;\n let foundPos: number | null = null;\n let foundAttrs: any = null;\n\n doc.descendants((node: any, pos: number) => {\n if (node.type.name === \"image\" && node.attrs.src === oldSrc) {\n foundPos = pos;\n foundAttrs = node.attrs;\n return false;\n }\n });\n\n if (foundPos !== null && foundAttrs) {\n const tr = view.state.tr.setNodeMarkup(foundPos, undefined, {\n ...foundAttrs,\n src: newSrc,\n });\n view.dispatch(tr);\n }\n}\n\n/**\n * Removes an existing image node matching src attribute across document positions.\n */\nexport function removeImageNode(view: any, src: string) {\n const { doc } = view.state;\n let foundPos: number | null = null;\n let nodeSize = 0;\n\n doc.descendants((node: any, pos: number) => {\n if (node.type.name === \"image\" && node.attrs.src === src) {\n foundPos = pos;\n nodeSize = node.nodeSize;\n return false;\n }\n });\n\n if (foundPos !== null) {\n const tr = view.state.tr.delete(foundPos, foundPos + nodeSize);\n view.dispatch(tr);\n }\n}\n\n/**\n * Handles inserting a pasted or dropped image file, supporting both async upload\n * handlers and direct base64/object-URL fallbacks.\n */\nexport function handleImageInsertion(\n view: any,\n file: File,\n options: ImageOptions,\n) {\n if (typeof options.upload === \"function\") {\n // Generate temporary preview URL if browser supports object URLs\n const hasObjectUrl =\n typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\";\n const tempUrl = hasObjectUrl ? URL.createObjectURL(file) : null;\n\n if (tempUrl) {\n insertImageNode(view, tempUrl, file.name);\n }\n\n Promise.resolve(options.upload(file))\n .then((uploadedUrl) => {\n if (!uploadedUrl) {\n throw new Error(\"Upload handler returned empty URL\");\n }\n if (tempUrl) {\n updateImageSrc(view, tempUrl, uploadedUrl);\n if (typeof URL.revokeObjectURL === \"function\") {\n URL.revokeObjectURL(tempUrl);\n }\n } else {\n insertImageNode(view, uploadedUrl, file.name);\n }\n })\n .catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n console.error(\"Failed to upload pasted image:\", error);\n if (tempUrl) {\n removeImageNode(view, tempUrl);\n if (typeof URL.revokeObjectURL === \"function\") {\n URL.revokeObjectURL(tempUrl);\n }\n }\n if (typeof options.onUploadError === \"function\") {\n options.onUploadError(error, file);\n }\n });\n } else if (options.allowBase64 !== false) {\n const maxBase64Size = options.maxBase64Size ?? 65536; // 64KB default\n if (file.size > maxBase64Size) {\n const err = new Error(\n `Image size (${Math.round(file.size / 1024)}KB) exceeds maxBase64Size (${Math.round(\n maxBase64Size / 1024,\n )}KB). Provide an upload handler to support large images.`,\n );\n console.warn(`[Editor] ${err.message}`);\n if (typeof options.onUploadError === \"function\") {\n options.onUploadError(err, file);\n }\n return;\n }\n\n if (typeof FileReader !== \"undefined\") {\n const reader = new FileReader();\n reader.onload = () => {\n const src = reader.result as string;\n if (src) {\n insertImageNode(view, src, file.name);\n }\n };\n reader.readAsDataURL(file);\n }\n }\n}\n\nexport const Image = BaseImage.extend({\n addOptions() {\n return {\n ...this.parent?.(),\n allowBase64: true,\n maxBase64Size: 65536,\n enablePaste: true,\n enableDrop: true,\n upload: undefined,\n onUploadError: undefined,\n HTMLAttributes: {\n class: \"rounded-md max-w-full h-auto my-2\",\n },\n };\n },\n\n addProseMirrorPlugins() {\n const parentPlugins = this.parent?.() || [];\n const options = this.options as ImageOptions;\n\n if (!options.enablePaste && !options.enableDrop) {\n return parentPlugins;\n }\n\n const pastePlugin = new Plugin({\n key: imagePastePluginKey,\n props: {\n handlePaste(view, event) {\n if (!options.enablePaste) return false;\n const items = Array.from(event.clipboardData?.items || []);\n const imageItems = items.filter(\n (item) => item.kind === \"file\" && item.type.startsWith(\"image/\"),\n );\n if (imageItems.length === 0) return false;\n\n event.preventDefault();\n\n for (const item of imageItems) {\n const file = item.getAsFile();\n if (!file) continue;\n handleImageInsertion(view, file, options);\n }\n return true;\n },\n handleDrop(view, event) {\n if (!options.enableDrop) return false;\n const files = Array.from(event.dataTransfer?.files || []);\n const imageFiles = files.filter((f) => f.type.startsWith(\"image/\"));\n if (imageFiles.length === 0) return false;\n\n event.preventDefault();\n\n for (const file of imageFiles) {\n handleImageInsertion(view, file, options);\n }\n return true;\n },\n },\n });\n\n return [...parentPlugins, pastePlugin];\n },\n});\n","import { Mark, mergeAttributes, type Editor } from \"@tiptap/core\";\nimport { Plugin, PluginKey, TextSelection, type EditorState } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode, Mark as ProsemirrorMark } from \"@tiptap/pm/model\";\nimport {\n CommentStore,\n createReviewId,\n type CommentAnchor,\n type CommentStoreSnapshot,\n type ReviewAuthor,\n} from \"./comment-store\";\n\nexport interface CommentsOptions {\n /**\n * The store holding the threads. Pass your own to share it with UI or to\n * persist it; otherwise one is created and exposed as\n * `editor.storage.comment.store`.\n */\n store: CommentStore | null;\n /** The current user, used as author of new comments. */\n author: ReviewAuthor | (() => ReviewAuthor);\n HTMLAttributes: Record<string, any>;\n /** Class for unresolved comment ranges (applied as a decoration). */\n commentClass: string;\n /** Extra class for the active thread's range. */\n activeClass: string;\n /** Class for resolved comment ranges. Empty hides them. */\n resolvedClass: string;\n /** Make the thread under the caret active when the selection moves. */\n activateOnSelection: boolean;\n}\n\nexport interface CommentsStorage {\n store: CommentStore;\n}\n\nexport interface AddCommentOptions {\n body?: string;\n id?: string;\n author?: ReviewAuthor;\n}\n\nexport interface CommentRange {\n from: number;\n to: number;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n comment: {\n /**\n * Adds a comment thread on the current (non-empty) selection. The new\n * thread becomes active. An empty `body` creates a draft for the UI to\n * fill in.\n */\n addComment: (options?: AddCommentOptions) => ReturnType;\n /** Resolves (or re-opens with `false`) a thread. */\n resolveComment: (id: string, resolved?: boolean) => ReturnType;\n /** Removes the thread's mark from the document and deletes the thread. */\n deleteComment: (id: string) => ReturnType;\n setActiveComment: (id: string | null) => ReturnType;\n /** Selects the thread's text, scrolls to it and makes it active. */\n focusComment: (id: string) => ReturnType;\n };\n }\n}\n\nexport const commentsPluginKey = new PluginKey(\"comments\");\n\nexport const COMMENT_MARK_NAME = \"comment\";\n\n/**\n * Returns every range covered by a `comment` mark, grouped by thread id and\n * merged where contiguous, in document order.\n */\nexport function findCommentRanges(doc: ProsemirrorNode): Map<string, CommentRange[]> {\n const result = new Map<string, CommentRange[]>();\n doc.descendants((node, pos) => {\n if (!node.isInline) return;\n node.marks.forEach((mark) => {\n if (mark.type.name !== COMMENT_MARK_NAME) return;\n const id = mark.attrs.commentId;\n if (!id) return;\n const ranges = result.get(id) ?? [];\n const last = ranges[ranges.length - 1];\n const end = pos + node.nodeSize;\n if (last && last.to === pos) {\n last.to = end;\n } else {\n ranges.push({ from: pos, to: end });\n }\n result.set(id, ranges);\n });\n });\n return result;\n}\n\n/**\n * Computes one anchor per thread (spanning all of its ranges) from the document.\n */\nexport function getCommentAnchors(doc: ProsemirrorNode): Map<string, CommentAnchor> {\n const anchors = new Map<string, CommentAnchor>();\n findCommentRanges(doc).forEach((ranges, id) => {\n const from = ranges[0].from;\n const to = ranges[ranges.length - 1].to;\n anchors.set(id, {\n from,\n to,\n quote: ranges.map((r) => doc.textBetween(r.from, r.to, \" \", \" \")).join(\" \"),\n });\n });\n return anchors;\n}\n\n/** Thread ids of the comment marks at a position (caret or selection start). */\nexport function getCommentIdsAt(state: EditorState, pos = state.selection.from): string[] {\n const $pos = state.doc.resolve(pos);\n const marks: readonly ProsemirrorMark[] = [\n ...($pos.nodeAfter?.marks ?? []),\n ...($pos.nodeBefore?.marks ?? []),\n ];\n const ids: string[] = [];\n marks.forEach((m) => {\n if (m.type.name === COMMENT_MARK_NAME && m.attrs.commentId && !ids.includes(m.attrs.commentId)) {\n ids.push(m.attrs.commentId);\n }\n });\n return ids;\n}\n\n/** Returns the comment store of an editor using the `Comments` extension. */\nexport function getCommentStore(editor: Editor | null | undefined): CommentStore | null {\n return (editor?.storage as any)?.[COMMENT_MARK_NAME]?.store ?? null;\n}\n\nfunction resolveAuthor(author: CommentsOptions[\"author\"]): ReviewAuthor {\n return typeof author === \"function\" ? author() : author;\n}\n\n/**\n * Comment threads anchored to text with a `comment` mark. Thread content\n * (bodies, replies, resolved state) lives in a headless `CommentStore`; the\n * document only stores thread ids, so overlapping comments are allowed.\n *\n * Threads whose text is deleted are flagged `orphaned` (not removed), so\n * undoing the deletion re-attaches them.\n */\nexport const Comments = Mark.create<CommentsOptions, CommentsStorage>({\n name: COMMENT_MARK_NAME,\n\n // Typing at the edge of a comment does not extend it.\n inclusive: false,\n // Allow several comment marks (different threads) on the same text.\n excludes: \"\",\n\n addOptions() {\n return {\n store: null,\n author: { id: \"anonymous\", name: \"Anonymous\" },\n HTMLAttributes: {},\n commentClass:\n \"pixerate-comment bg-amber-100 border-b-2 border-amber-400 dark:bg-amber-500/20 cursor-pointer\",\n activeClass: \"pixerate-comment-active bg-amber-200 dark:bg-amber-500/40\",\n resolvedClass: \"\",\n activateOnSelection: true,\n };\n },\n\n addStorage() {\n return {\n store: this.options.store ?? new CommentStore(),\n // tiptap-markdown: comments are not part of the exported markdown.\n markdown: { serialize: { open: \"\", close: \"\" }, parse: {} },\n } as CommentsStorage;\n },\n\n addAttributes() {\n return {\n commentId: {\n default: null,\n parseHTML: (el) => el.getAttribute(\"data-comment-id\"),\n renderHTML: (attrs) =>\n attrs.commentId ? { \"data-comment-id\": attrs.commentId } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-comment-id]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"span\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n\n addCommands() {\n const store = () => this.storage.store;\n return {\n addComment:\n (options = {}) =>\n ({ state, tr, dispatch }) => {\n const { from, to, empty } = state.selection;\n if (empty) return false;\n if (dispatch) {\n const id = options.id ?? createReviewId(\"comment\");\n tr.addMark(from, to, this.type.create({ commentId: id }));\n tr.setMeta(commentsPluginKey, \"refresh\");\n store().createThread({\n id,\n body: options.body ?? \"\",\n author: options.author ?? resolveAuthor(this.options.author),\n anchor: { from, to, quote: state.doc.textBetween(from, to, \" \", \" \") },\n });\n store().setActiveThread(id);\n }\n return true;\n },\n\n resolveComment:\n (id, resolved = true) =>\n ({ tr, dispatch }) => {\n if (!store().getThread(id)) return false;\n if (dispatch) {\n store().resolveThread(id, resolved, resolveAuthor(this.options.author));\n tr.setMeta(commentsPluginKey, \"refresh\");\n }\n return true;\n },\n\n deleteComment:\n (id) =>\n ({ state, tr, dispatch }) => {\n const ranges = findCommentRanges(state.doc).get(id) ?? [];\n if (ranges.length === 0 && !store().getThread(id)) return false;\n if (dispatch) {\n ranges.forEach(({ from, to }) => {\n state.doc.nodesBetween(from, to, (node, pos) => {\n const mark = node.marks.find(\n (m) => m.type === this.type && m.attrs.commentId === id,\n );\n if (mark) {\n tr.removeMark(Math.max(pos, from), Math.min(pos + node.nodeSize, to), mark);\n }\n });\n });\n tr.setMeta(commentsPluginKey, \"refresh\");\n store().deleteThread(id);\n }\n return true;\n },\n\n setActiveComment:\n (id) =>\n ({ tr, dispatch }) => {\n if (id !== null && !store().getThread(id)) return false;\n if (dispatch) {\n store().setActiveThread(id);\n tr.setMeta(commentsPluginKey, \"refresh\");\n }\n return true;\n },\n\n focusComment:\n (id) =>\n ({ state, tr, dispatch }) => {\n const ranges = findCommentRanges(state.doc).get(id);\n if (!ranges || ranges.length === 0) return false;\n if (dispatch) {\n const from = ranges[0].from;\n const to = ranges[ranges.length - 1].to;\n tr.setSelection(TextSelection.create(tr.doc, from, to)).scrollIntoView();\n store().setActiveThread(id);\n tr.setMeta(commentsPluginKey, \"refresh\");\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const store = this.storage.store;\n const options = this.options;\n let cache: { doc: ProsemirrorNode; snapshot: CommentStoreSnapshot; set: DecorationSet } | null =\n null;\n\n const buildDecorations = (doc: ProsemirrorNode): DecorationSet => {\n const snapshot = store.getSnapshot();\n if (cache && cache.doc === doc && cache.snapshot === snapshot) return cache.set;\n const decorations: Decoration[] = [];\n findCommentRanges(doc).forEach((ranges, id) => {\n const thread = store.getThread(id);\n const resolved = thread?.resolved ?? false;\n const active = snapshot.activeThreadId === id;\n const cls = [\n resolved ? options.resolvedClass : options.commentClass,\n active ? options.activeClass : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n if (!cls) return;\n ranges.forEach(({ from, to }) => {\n decorations.push(Decoration.inline(from, to, { class: cls }));\n });\n });\n const set = DecorationSet.create(doc, decorations);\n cache = { doc, snapshot, set };\n return set;\n };\n\n return [\n new Plugin({\n key: commentsPluginKey,\n props: {\n decorations: (state) => buildDecorations(state.doc),\n },\n view: (view) => {\n let destroyed = false;\n let scheduled = false;\n const sync = () => store.syncAnchors(getCommentAnchors(view.state.doc));\n sync();\n\n // Store changes made outside editor commands (UI, `load()`) need a\n // redraw. Deferred, because the store may change in the middle of a\n // command or a view update.\n const unsubscribe = store.subscribe(() => {\n if (scheduled) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n if (destroyed) return;\n sync();\n if (cache?.snapshot !== store.getSnapshot()) {\n view.dispatch(\n view.state.tr\n .setMeta(commentsPluginKey, \"refresh\")\n .setMeta(\"addToHistory\", false),\n );\n }\n });\n });\n\n return {\n update(view, prevState) {\n if (!prevState.doc.eq(view.state.doc)) sync();\n if (\n options.activateOnSelection &&\n !prevState.selection.eq(view.state.selection)\n ) {\n const ids = getCommentIdsAt(view.state);\n const active = store.getSnapshot().activeThreadId;\n if (!active || !ids.includes(active)) {\n store.setActiveThread(ids[0] ?? null);\n }\n }\n },\n destroy() {\n destroyed = true;\n unsubscribe();\n },\n };\n },\n }),\n ];\n },\n});\n\n/** The current author configured on an editor's `Comments` extension. */\nexport function getCommentAuthor(editor: Editor | null | undefined): ReviewAuthor | null {\n const ext = editor?.extensionManager?.extensions.find((e) => e.name === COMMENT_MARK_NAME);\n return ext ? resolveAuthor((ext.options as CommentsOptions).author) : null;\n}\n","import { Extension, type Editor } from \"@tiptap/core\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport {\n compareDocuments,\n type CompareDocumentsOptions,\n type CompareDocumentsResult,\n type CompareSource,\n} from \"../compare/documents\";\nimport { TRACK_CHANGES_SKIP_META, trackChangesPluginKey } from \"./track-changes\";\n\n/** Options of a comparison run in an editor (the schema is the editor's). */\nexport type EditorCompareOptions = Omit<CompareDocumentsOptions, \"schema\">;\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n documentCompare: {\n /**\n * Replaces the content with the comparison of `original` and\n * `revised` (nodes, JSON or HTML) as tracked changes. The content is\n * set without being tracked; the summary is stored in\n * `editor.storage.documentCompare.lastResult`.\n */\n setContentFromComparison: (\n original: CompareSource,\n revised: CompareSource,\n options?: EditorCompareOptions,\n ) => ReturnType;\n };\n }\n}\n\nexport interface DocumentCompareOptions {\n /** Defaults for every comparison (author defaults to the track-changes author). */\n compare: EditorCompareOptions;\n}\n\nexport interface DocumentCompareStorage {\n lastResult: CompareDocumentsResult | null;\n}\n\nfunction trackChangesAuthor(state: EditorState) {\n return trackChangesPluginKey.getState(state)?.author;\n}\n\n/**\n * Compares two versions in the editor's schema and returns the result\n * without changing the editor. The author defaults to the `TrackChanges`\n * author.\n */\nexport function compareInEditor(\n editor: Editor,\n original: CompareSource,\n revised: CompareSource,\n options: EditorCompareOptions = {},\n): CompareDocumentsResult {\n return compareDocuments(original, revised, {\n ...options,\n author: options.author ?? trackChangesAuthor(editor.state),\n schema: editor.schema,\n });\n}\n\n/**\n * Compares two versions and replaces the editor content with the result\n * (one undoable step, not tracked). Works without the `DocumentCompare`\n * extension; the schema needs `TrackChanges`.\n */\nexport function applyDocumentComparison(\n editor: Editor,\n original: CompareSource,\n revised: CompareSource,\n options: EditorCompareOptions = {},\n): CompareDocumentsResult {\n const result = compareInEditor(editor, original, revised, options);\n const { state } = editor;\n const tr = state.tr.replaceWith(0, state.doc.content.size, result.doc.content);\n tr.setMeta(TRACK_CHANGES_SKIP_META, true);\n editor.view.dispatch(tr);\n return result;\n}\n\n/** Adds the `setContentFromComparison` command. Requires `TrackChanges`. */\nexport const DocumentCompare = Extension.create<DocumentCompareOptions, DocumentCompareStorage>({\n name: \"documentCompare\",\n\n addOptions() {\n return { compare: {} };\n },\n\n addStorage() {\n return { lastResult: null };\n },\n\n addCommands() {\n return {\n setContentFromComparison:\n (original, revised, options = {}) =>\n ({ state, tr, dispatch }) => {\n const merged = { ...this.options.compare, ...options };\n const result = compareDocuments(original, revised, {\n ...merged,\n author: merged.author ?? trackChangesAuthor(state),\n schema: state.schema,\n });\n if (dispatch) {\n tr.replaceWith(0, tr.doc.content.size, result.doc.content);\n tr.setMeta(TRACK_CHANGES_SKIP_META, true);\n this.storage.lastResult = result;\n }\n return true;\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\nimport { defaultImportRegistry, type DocumentImport } from \"../import/adapters\";\nimport { importFilesIntoEditor } from \"../import/editor\";\nimport type { FileLike, ImportAdapterRegistry, ImportOutcome } from \"../import/registry\";\n\nexport interface FileImportOptions {\n /** Registry used to match files (default: the shared default registry). */\n registry?: ImportAdapterRegistry;\n /** Per-adapter options keyed by adapter id, e.g. `{ pdf: { structure: false } }`. */\n adapterOptions?: Record<string, unknown>;\n /** Insert extracted plain text instead of HTML (plain-text / prompt editors). */\n asPlainText?: boolean;\n /** Import files dropped onto the editor (default `true`). */\n enableDrop?: boolean;\n /** Import files pasted into the editor, e.g. copied in a file manager (default `true`). */\n enablePaste?: boolean;\n /** Called after each imported file has been inserted. */\n onImport?: (outcome: ImportOutcome<DocumentImport>, file: FileLike) => void;\n /** Called when a file fails to import. */\n onImportError?: (error: Error, file: FileLike) => void;\n}\n\nexport const fileImportPluginKey = new PluginKey(\"fileImport\");\n\n/**\n * Returns the files that `registry` can import as documents, or `null` when\n * the list is empty or contains a file no document adapter accepts (so other\n * handlers, such as image upload, can take the drop).\n */\nfunction getImportableFiles(files: FileList | File[] | undefined | null, registry: ImportAdapterRegistry): File[] | null {\n const list = Array.from(files ?? []);\n if (list.length === 0) return null;\n return list.every((file) => registry.canImport(file, \"document\")) ? list : null;\n}\n\nfunction dropPosition(view: EditorView, event: DragEvent): number | undefined {\n try {\n return view.posAtCoords({ left: event.clientX, top: event.clientY })?.pos;\n } catch {\n // posAtCoords needs layout APIs that are missing in some environments.\n return undefined;\n }\n}\n\n/**\n * Imports files dropped or pasted into the editor through the import adapter\n * registry (markdown, HTML, plain text and RTF by default) and inserts the\n * converted content at the drop position or selection.\n *\n * Opt-in: add it to `extensions` or pass `fileImport: true` to\n * `createRichTextPreset`. Only drops where every file has a `document`\n * adapter are handled; anything else (e.g. images) falls through.\n */\nexport const FileImport = Extension.create<FileImportOptions>({\n name: \"fileImport\",\n\n addOptions() {\n return {\n registry: undefined,\n adapterOptions: undefined,\n asPlainText: false,\n enableDrop: true,\n enablePaste: true,\n onImport: undefined,\n onImportError: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n const registry = () => options.registry ?? defaultImportRegistry;\n const run = (view: EditorView, files: File[], at?: number) => {\n void importFilesIntoEditor(view, files, {\n registry: registry(),\n at,\n asPlainText: options.asPlainText,\n adapterOptions: options.adapterOptions,\n onImport: options.onImport,\n onError: options.onImportError,\n });\n };\n\n return [\n new Plugin({\n key: fileImportPluginKey,\n props: {\n handleDrop(view, event, _slice, moved) {\n if (!options.enableDrop || moved) return false;\n const files = getImportableFiles(event.dataTransfer?.files, registry());\n if (!files) return false;\n event.preventDefault();\n run(view, files, dropPosition(view, event));\n return true;\n },\n handlePaste(view, event) {\n if (!options.enablePaste) return false;\n const files = getImportableFiles(event.clipboardData?.files, registry());\n if (!files) return false;\n event.preventDefault();\n run(view, files);\n return true;\n },\n },\n }),\n ];\n },\n});\n","/**\n * Import adapter registry: maps file types (MIME types and extensions) to\n * converters that turn a file into editor content. Modelled on the desktop\n * import pipelines of document apps, where each source format declares the\n * MIME types and extensions it accepts.\n *\n * Built-in adapters cover markdown, HTML, plain text, RTF and DOCX for the\n * `document` target. PDF (`createPdfImportAdapter`), zipped exports\n * (`zipImportAdapter`) and other targets (e.g. CSV → `spreadsheet`) plug in\n * with `registerImportAdapter`.\n */\n\n/** What an import produces content for. Custom targets are plain strings. */\nexport type ImportTarget = \"document\" | \"spreadsheet\" | (string & {});\n\n/** A `File`/`Blob`-like object; only the members present are used. */\nexport interface FileLike {\n name?: string;\n type?: string;\n size?: number;\n text?(): Promise<string>;\n arrayBuffer?(): Promise<ArrayBuffer>;\n}\n\n/** Anything an adapter can import: raw text, binary data, or a file. */\nexport type ImportInput = string | ArrayBuffer | ArrayBufferView | FileLike;\n\n/** Helpers passed to adapters so they don't each re-implement decoding. */\nexport interface ImportContext {\n fileName?: string;\n mimeType?: string;\n target: ImportTarget;\n /** Reads the input as UTF-8 text (a leading byte-order mark is removed). */\n readText(): Promise<string>;\n /** Reads the input as binary data (strings are UTF-8 encoded). */\n readArrayBuffer(): Promise<ArrayBuffer>;\n /**\n * The registry running the import, so container adapters (e.g. zipped\n * exports) can import nested files with the same adapters.\n */\n registry?: ImportAdapterRegistry;\n /**\n * Per-import options for this adapter: `ImportFileOptions.adapterOptions[adapter.id]`.\n * Adapters document what they accept (e.g. the PDF adapter's `{ structure: false }`).\n */\n options?: unknown;\n}\n\nexport interface ImportAdapter<TResult = unknown> {\n /** Unique id, e.g. `markdown`, `html`, `csv`. */\n id: string;\n /** Human-readable name for menus, e.g. \"Markdown\". */\n label: string;\n /** Accepted MIME types; `type/*` wildcards are allowed. */\n mimeTypes: readonly string[];\n /** Accepted extensions with a leading dot; multi-part ones (`.md.txt`) are allowed. */\n extensions: readonly string[];\n target: ImportTarget;\n /** Tie-breaker between equally specific matches (default 0, higher wins). */\n priority?: number;\n import(input: ImportInput, context: ImportContext): Promise<TResult> | TResult;\n}\n\nexport interface FindImportAdapterQuery {\n mimeType?: string;\n fileName?: string;\n /** Only consider adapters for this target. */\n target?: ImportTarget;\n}\n\nexport interface ImportFileOptions {\n /** Only consider adapters for this target. */\n target?: ImportTarget;\n /** Use this adapter instead of matching by type. */\n adapterId?: string;\n /** Overrides the input's own `name` (required to match string/binary input by extension). */\n fileName?: string;\n /** Overrides the input's own `type`. */\n mimeType?: string;\n /**\n * Options for individual adapters, keyed by adapter id; the matching entry\n * reaches the adapter as `context.options`. Example: `{ pdf: { structure: false } }`.\n */\n adapterOptions?: Record<string, unknown>;\n}\n\nexport interface ImportOutcome<TResult = unknown> {\n adapterId: string;\n target: ImportTarget;\n fileName?: string;\n mimeType?: string;\n result: TResult;\n}\n\nexport type ImportErrorCode =\n | \"unsupported_type\"\n | \"unknown_adapter\"\n | \"adapter_failed\"\n /** The file is damaged or not the format its name/type claims (e.g. a `.docx` without `word/document.xml`). */\n | \"invalid_file\"\n /** A platform API the adapter needs (e.g. `DOMParser`) is missing. */\n | \"unsupported_environment\";\n\nexport class ImportError extends Error {\n readonly code: ImportErrorCode;\n readonly fileName?: string;\n\n constructor(code: ImportErrorCode, message: string, details: { fileName?: string; cause?: unknown } = {}) {\n super(message, details.cause !== undefined ? { cause: details.cause } : undefined);\n this.name = \"ImportError\";\n this.code = code;\n this.fileName = details.fileName;\n }\n}\n\nexport interface RegisterImportAdapterOptions {\n /** Replace an adapter with the same id instead of throwing. */\n replace?: boolean;\n}\n\nconst normalizeExtension = (ext: string) => {\n const lower = ext.trim().toLowerCase();\n return lower.startsWith(\".\") ? lower : `.${lower}`;\n};\n\nconst normalizeMimeType = (mime: string | undefined) =>\n (mime ?? \"\").split(\";\")[0].trim().toLowerCase();\n\nfunction isFileLike(input: ImportInput): input is FileLike {\n return (\n typeof input === \"object\" &&\n input !== null &&\n !(input instanceof ArrayBuffer) &&\n !ArrayBuffer.isView(input)\n );\n}\n\nfunction stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n\n/** Creates the {@link ImportContext} helpers for an input. */\nexport function createImportContext(\n input: ImportInput,\n details: { fileName?: string; mimeType?: string; target: ImportTarget; registry?: ImportAdapterRegistry; options?: unknown },\n): ImportContext {\n const readArrayBuffer = async (): Promise<ArrayBuffer> => {\n if (typeof input === \"string\") {\n return new TextEncoder().encode(input).buffer as ArrayBuffer;\n }\n if (input instanceof ArrayBuffer) return input;\n if (ArrayBuffer.isView(input)) {\n return input.buffer.slice(input.byteOffset, input.byteOffset + input.byteLength) as ArrayBuffer;\n }\n if (typeof input.arrayBuffer === \"function\") return input.arrayBuffer();\n if (typeof input.text === \"function\") {\n return new TextEncoder().encode(await input.text()).buffer as ArrayBuffer;\n }\n throw new TypeError(\"Import input cannot be read as binary data.\");\n };\n const readText = async (): Promise<string> => {\n if (typeof input === \"string\") return stripBom(input);\n if (isFileLike(input) && typeof input.text === \"function\") {\n return stripBom(await input.text());\n }\n return stripBom(new TextDecoder(\"utf-8\").decode(await readArrayBuffer()));\n };\n return { ...details, readText, readArrayBuffer };\n}\n\n/**\n * A set of import adapters with type matching. Use the default registry via\n * the module-level helpers (`registerImportAdapter`, `importFile`, …) or\n * create isolated ones with `createImportAdapterRegistry`.\n */\nexport class ImportAdapterRegistry {\n private adapters: ImportAdapter<any>[] = [];\n\n /** Registers an adapter and returns a function that unregisters it. */\n register<TResult>(adapter: ImportAdapter<TResult>, options: RegisterImportAdapterOptions = {}): () => void {\n const existing = this.adapters.findIndex((a) => a.id === adapter.id);\n if (existing !== -1) {\n if (!options.replace) {\n throw new Error(`Import adapter \"${adapter.id}\" is already registered.`);\n }\n this.adapters.splice(existing, 1);\n }\n this.adapters.push(adapter);\n return () => {\n this.unregister(adapter);\n };\n }\n\n /** Removes an adapter by id or instance. Returns whether it was registered. */\n unregister(adapterOrId: string | ImportAdapter<any>): boolean {\n const index = this.adapters.findIndex((a) =>\n typeof adapterOrId === \"string\" ? a.id === adapterOrId : a === adapterOrId,\n );\n if (index === -1) return false;\n this.adapters.splice(index, 1);\n return true;\n }\n\n get(id: string): ImportAdapter | undefined {\n return this.adapters.find((a) => a.id === id);\n }\n\n /** Registered adapters in registration order, optionally for one target. */\n list(target?: ImportTarget): ImportAdapter[] {\n return this.adapters.filter((a) => target === undefined || a.target === target);\n }\n\n /**\n * Finds the best adapter for a file. Extensions win over MIME types (browsers\n * often report `\"\"` or `text/plain` for markdown), the longest matching\n * extension wins (`.md.txt` beats `.txt`), exact MIME types beat `type/*`\n * wildcards, then higher `priority`, then the most recently registered.\n */\n find(query: FindImportAdapterQuery): ImportAdapter | undefined {\n const fileName = query.fileName?.toLowerCase() ?? \"\";\n const mime = normalizeMimeType(query.mimeType);\n let best: ImportAdapter | undefined;\n let bestScore = 0;\n let bestPriority = -Infinity;\n this.adapters.forEach((adapter) => {\n if (query.target !== undefined && adapter.target !== query.target) return;\n let score = 0;\n if (fileName) {\n for (const raw of adapter.extensions) {\n const ext = normalizeExtension(raw);\n if (fileName.endsWith(ext) && fileName.length > ext.length) {\n // Extension matches always outrank MIME matches.\n score = Math.max(score, 1000 + ext.length);\n }\n }\n }\n if (score === 0 && mime) {\n for (const raw of adapter.mimeTypes) {\n const accepted = normalizeMimeType(raw);\n if (accepted === mime) score = Math.max(score, 2);\n else if (accepted.endsWith(\"/*\") && mime.startsWith(accepted.slice(0, -1))) {\n score = Math.max(score, 1);\n }\n }\n }\n if (score === 0) return;\n const priority = adapter.priority ?? 0;\n // `>=` so later registrations win ties and can override built-ins.\n if (score > bestScore || (score === bestScore && priority >= bestPriority)) {\n best = adapter;\n bestScore = score;\n bestPriority = priority;\n }\n });\n return best;\n }\n\n /**\n * Returns a value for `<input type=\"file\" accept=\"…\">` covering every\n * registered extension and MIME type (optionally for one target).\n */\n accept(target?: ImportTarget): string {\n const values = new Set<string>();\n for (const adapter of this.list(target)) {\n adapter.extensions.forEach((ext) => values.add(normalizeExtension(ext)));\n adapter.mimeTypes.forEach((mime) => values.add(normalizeMimeType(mime)));\n }\n return Array.from(values).join(\",\");\n }\n\n /** Whether some adapter (optionally for `target`) accepts this file. */\n canImport(file: { name?: string; type?: string }, target?: ImportTarget): boolean {\n return !!this.find({ fileName: file.name, mimeType: file.type, target });\n }\n\n /**\n * Imports a file (or string / binary input) with the matching adapter.\n * Rejects with an {@link ImportError} when no adapter matches or the\n * adapter fails.\n */\n async importFile<TResult = unknown>(input: ImportInput, options: ImportFileOptions = {}): Promise<ImportOutcome<TResult>> {\n const fileName = options.fileName ?? (isFileLike(input) ? input.name : undefined);\n const mimeType = options.mimeType ?? (isFileLike(input) ? input.type : undefined);\n let adapter: ImportAdapter | undefined;\n if (options.adapterId) {\n adapter = this.get(options.adapterId);\n if (!adapter) {\n throw new ImportError(\"unknown_adapter\", `No import adapter with id \"${options.adapterId}\".`, { fileName });\n }\n } else {\n adapter = this.find({ fileName, mimeType, target: options.target });\n }\n if (!adapter) {\n const what = fileName || mimeType || \"input\";\n throw new ImportError(\n \"unsupported_type\",\n `No import adapter accepts ${what}${options.target ? ` for target \"${options.target}\"` : \"\"}.`,\n { fileName },\n );\n }\n const context = createImportContext(input, {\n fileName,\n mimeType,\n target: adapter.target,\n registry: this,\n options: options.adapterOptions?.[adapter.id],\n });\n try {\n const result = (await adapter.import(input, context)) as TResult;\n return { adapterId: adapter.id, target: adapter.target, fileName, mimeType, result };\n } catch (error) {\n // Adapters may throw structured ImportErrors (e.g. `invalid_file`); keep their code.\n if (error instanceof ImportError) {\n if (error.fileName !== undefined || fileName === undefined) throw error;\n throw new ImportError(error.code, error.message, { fileName, cause: error.cause });\n }\n throw new ImportError(\n \"adapter_failed\",\n `Import adapter \"${adapter.id}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n { fileName, cause: error },\n );\n }\n }\n}\n","/**\n * Minimal, dependency-free ZIP reader used by the DOCX and zipped-export\n * import adapters.\n *\n * - Reads the central directory (including ZIP64 end records and extra\n * fields), so sizes come from the authoritative directory rather than local\n * headers or data descriptors.\n * - Supports stored (method 0) and deflate (method 8) entries; deflate is\n * inflated with the platform `DecompressionStream(\"deflate-raw\")` (modern\n * browsers, Node ≥ 18).\n * - Guards against zip bombs (entry-count and total-uncompressed-size caps,\n * enforced on the bytes actually inflated, not only the declared sizes),\n * path traversal in entry names and encrypted entries.\n * - Verifies CRC-32 checksums of extracted entries.\n */\n\nexport type ZipErrorCode =\n /** Not a ZIP archive, or its directory is truncated / inconsistent. */\n | \"invalid_archive\"\n /** Compression method other than stored/deflate, multi-disk archives, … */\n | \"unsupported_feature\"\n /** The entry is encrypted (general-purpose flag bit 0). */\n | \"encrypted\"\n /** An entry name is absolute or contains `..` segments. */\n | \"unsafe_path\"\n /** More entries than `maxEntries`. */\n | \"too_many_entries\"\n /** Extracting would exceed `maxTotalSize` uncompressed bytes. */\n | \"too_large\"\n /** The entry data is corrupt (bad header, size or CRC mismatch, bad deflate stream). */\n | \"corrupt_entry\"\n /** No entry with the requested name. */\n | \"entry_not_found\"\n /** `DecompressionStream` is unavailable in this environment. */\n | \"unsupported_environment\";\n\nexport class ZipError extends Error {\n readonly code: ZipErrorCode;\n readonly entryName?: string;\n\n constructor(code: ZipErrorCode, message: string, details: { entryName?: string; cause?: unknown } = {}) {\n super(message, details.cause !== undefined ? { cause: details.cause } : undefined);\n this.name = \"ZipError\";\n this.code = code;\n this.entryName = details.entryName;\n }\n}\n\nexport interface ZipEntry {\n /** Entry path with `/` separators (backslashes are normalized). */\n name: string;\n /** Whether the entry is a directory (name ends with `/`). */\n isDirectory: boolean;\n /** Whether the entry is encrypted; reading it throws `ZipError(\"encrypted\")`. */\n encrypted: boolean;\n /** Compression method (0 = stored, 8 = deflate). */\n method: number;\n /** Declared compressed size in bytes. */\n compressedSize: number;\n /** Declared uncompressed size in bytes. */\n size: number;\n /** CRC-32 of the uncompressed data. */\n crc32: number;\n /** Offset of the entry's local file header. */\n localHeaderOffset: number;\n}\n\nexport interface ZipReadOptions {\n /** Maximum number of entries in the central directory (default 10 000). */\n maxEntries?: number;\n /**\n * Maximum number of uncompressed bytes extracted from the archive, summed\n * over every `read` call (default 256 MiB). Enforced while inflating.\n */\n maxTotalSize?: number;\n /**\n * What to do with entries whose names are absolute or contain `..`\n * segments: `\"error\"` (default) rejects the archive, `\"skip\"` leaves them\n * out of `entries`.\n */\n unsafePaths?: \"error\" | \"skip\";\n}\n\nexport const DEFAULT_ZIP_MAX_ENTRIES = 10_000;\nexport const DEFAULT_ZIP_MAX_TOTAL_SIZE = 256 * 1024 * 1024;\n\nconst SIG_EOCD = 0x06054b50;\nconst SIG_ZIP64_EOCD = 0x06064b50;\nconst SIG_ZIP64_LOCATOR = 0x07064b50;\nconst SIG_CENTRAL = 0x02014b50;\nconst SIG_LOCAL = 0x04034b50;\nconst EOCD_SIZE = 22;\nconst MAX_COMMENT = 0xffff;\n\nlet crcTable: Uint32Array | null = null;\n\n/** CRC-32 (IEEE 802.3), as used by ZIP. */\nexport function zipCrc32(data: Uint8Array): number {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n crcTable[n] = c >>> 0;\n }\n }\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction toBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n // Duck-typed so ArrayBuffers from other realms (iframes, jsdom) work too.\n if (ArrayBuffer.isView(data)) return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n return new Uint8Array(data as ArrayBuffer);\n}\n\n/** Whether `name` is absolute, has a drive letter, or contains `..` / NUL. */\nexport function isUnsafeZipPath(name: string): boolean {\n if (!name || name.includes(\"\\0\")) return true;\n const normalized = name.replace(/\\\\/g, \"/\");\n if (normalized.startsWith(\"/\") || /^[a-zA-Z]:/.test(normalized)) return true;\n return normalized.split(\"/\").some((segment) => segment === \"..\");\n}\n\nconst utf8 = new TextDecoder(\"utf-8\");\n\n/** CP437 high half, used for names without the UTF-8 flag. */\nconst CP437_HIGH =\n \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \";\n\nfunction decodeName(bytes: Uint8Array, isUtf8: boolean): string {\n if (isUtf8 || bytes.every((b) => b < 0x80)) return utf8.decode(bytes);\n let out = \"\";\n for (const b of bytes) out += b < 0x80 ? String.fromCharCode(b) : CP437_HIGH[b - 0x80];\n return out;\n}\n\n/**\n * A parsed ZIP archive. Entry data is extracted lazily with {@link read}.\n * Create it with {@link readZip}.\n */\nexport class ZipArchive {\n /** Entries in central-directory order. */\n readonly entries: readonly ZipEntry[];\n private readonly byName = new Map<string, ZipEntry>();\n private extracted = 0;\n\n constructor(\n private readonly bytes: Uint8Array,\n entries: ZipEntry[],\n private readonly maxTotalSize: number,\n ) {\n this.entries = entries;\n entries.forEach((entry) => {\n if (!this.byName.has(entry.name)) this.byName.set(entry.name, entry);\n });\n }\n\n /** Looks up an entry by exact name (a leading `/` is ignored). */\n get(name: string): ZipEntry | undefined {\n return this.byName.get(name.replace(/^\\/+/, \"\"));\n }\n\n has(name: string): boolean {\n return !!this.get(name);\n }\n\n /** Uncompressed bytes extracted so far (counted against `maxTotalSize`). */\n get extractedSize(): number {\n return this.extracted;\n }\n\n /** Extracts an entry's data, verifying its size and CRC-32. */\n async read(entryOrName: ZipEntry | string): Promise<Uint8Array> {\n const entry = typeof entryOrName === \"string\" ? this.get(entryOrName) : entryOrName;\n if (!entry) {\n throw new ZipError(\"entry_not_found\", `ZIP entry \"${String(entryOrName)}\" not found.`, {\n entryName: String(entryOrName),\n });\n }\n const name = entry.name;\n if (entry.encrypted) {\n throw new ZipError(\"encrypted\", `ZIP entry \"${name}\" is encrypted; encrypted archives are not supported.`, {\n entryName: name,\n });\n }\n if (entry.isDirectory) return new Uint8Array(0);\n const remaining = this.maxTotalSize - this.extracted;\n if (entry.size > remaining) {\n throw new ZipError(\n \"too_large\",\n `Extracting \"${name}\" (${entry.size} bytes) would exceed the ${this.maxTotalSize}-byte limit.`,\n { entryName: name },\n );\n }\n\n const { bytes } = this;\n const offset = entry.localHeaderOffset;\n if (offset + 30 > bytes.length || readU32(bytes, offset) !== SIG_LOCAL) {\n throw new ZipError(\"corrupt_entry\", `ZIP entry \"${name}\" has no valid local header.`, { entryName: name });\n }\n const dataStart = offset + 30 + readU16(bytes, offset + 26) + readU16(bytes, offset + 28);\n const dataEnd = dataStart + entry.compressedSize;\n if (dataEnd > bytes.length) {\n throw new ZipError(\"corrupt_entry\", `ZIP entry \"${name}\" is truncated.`, { entryName: name });\n }\n const raw = bytes.subarray(dataStart, dataEnd);\n\n let data: Uint8Array;\n if (entry.method === 0) {\n if (entry.compressedSize !== entry.size) {\n throw new ZipError(\"corrupt_entry\", `Stored ZIP entry \"${name}\" has inconsistent sizes.`, { entryName: name });\n }\n data = raw.slice();\n } else if (entry.method === 8) {\n // Cap at the declared size: more output means a lying header (or a bomb).\n data = await inflateRaw(raw, entry.size, name);\n } else {\n throw new ZipError(\n \"unsupported_feature\",\n `ZIP entry \"${name}\" uses unsupported compression method ${entry.method}; only stored and deflate are supported.`,\n { entryName: name },\n );\n }\n if (data.length !== entry.size) {\n throw new ZipError(\"corrupt_entry\", `ZIP entry \"${name}\" size does not match the directory.`, { entryName: name });\n }\n this.extracted += data.length;\n if (zipCrc32(data) !== entry.crc32) {\n throw new ZipError(\"corrupt_entry\", `ZIP entry \"${name}\" failed its CRC-32 check.`, { entryName: name });\n }\n return data;\n }\n\n /** Extracts an entry and decodes it as UTF-8 (a leading BOM is removed). */\n async readText(entryOrName: ZipEntry | string): Promise<string> {\n const text = utf8.decode(await this.read(entryOrName));\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n }\n}\n\nfunction readU16(bytes: Uint8Array, offset: number): number {\n return bytes[offset] | (bytes[offset + 1] << 8);\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 24)) >>> 0;\n}\n\nfunction readU64(bytes: Uint8Array, offset: number): number {\n const value = readU32(bytes, offset) + readU32(bytes, offset + 4) * 0x100000000;\n if (!Number.isSafeInteger(value)) {\n throw new ZipError(\"unsupported_feature\", \"ZIP64 value exceeds the supported range.\");\n }\n return value;\n}\n\n/** Inflates a raw deflate stream, failing as soon as output exceeds `limit` bytes. */\nasync function inflateRaw(raw: Uint8Array, limit: number, entryName: string): Promise<Uint8Array> {\n const Stream: typeof DecompressionStream | undefined = (globalThis as any).DecompressionStream;\n if (typeof Stream !== \"function\") {\n throw new ZipError(\n \"unsupported_environment\",\n \"Inflating ZIP entries needs DecompressionStream (modern browsers, Node 18+).\",\n { entryName },\n );\n }\n const stream = new Stream(\"deflate-raw\");\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n // Feed the input in slices so output is pulled (and checked) incrementally.\n const CHUNK = 64 * 1024;\n const feeding = (async () => {\n for (let i = 0; i < raw.length; i += CHUNK) await writer.write(raw.subarray(i, i + CHUNK) as unknown as BufferSource);\n await writer.close();\n })();\n feeding.catch(() => {});\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.length;\n if (total > limit) {\n throw new ZipError(\n \"corrupt_entry\",\n `ZIP entry \"${entryName}\" inflates beyond its declared size of ${limit} bytes.`,\n { entryName },\n );\n }\n chunks.push(value);\n }\n } catch (error) {\n reader.cancel().catch(() => {});\n writer.abort().catch(() => {});\n if (error instanceof ZipError) throw error;\n throw new ZipError(\"corrupt_entry\", `ZIP entry \"${entryName}\" has an invalid deflate stream.`, {\n entryName,\n cause: error,\n });\n }\n await feeding.catch(() => {});\n const out = new Uint8Array(total);\n let pos = 0;\n for (const chunk of chunks) {\n out.set(chunk, pos);\n pos += chunk.length;\n }\n return out;\n}\n\nfunction findEndOfCentralDirectory(bytes: Uint8Array): number {\n const min = Math.max(0, bytes.length - EOCD_SIZE - MAX_COMMENT);\n for (let i = bytes.length - EOCD_SIZE; i >= min; i--) {\n if (readU32(bytes, i) === SIG_EOCD && i + EOCD_SIZE + readU16(bytes, i + 20) <= bytes.length) return i;\n }\n return -1;\n}\n\n/**\n * Parses a ZIP archive's central directory. Entry data is not extracted until\n * {@link ZipArchive.read} is called. Throws {@link ZipError}.\n */\nexport async function readZip(data: ArrayBuffer | ArrayBufferView, options: ZipReadOptions = {}): Promise<ZipArchive> {\n const bytes = toBytes(data);\n const maxEntries = options.maxEntries ?? DEFAULT_ZIP_MAX_ENTRIES;\n const maxTotalSize = options.maxTotalSize ?? DEFAULT_ZIP_MAX_TOTAL_SIZE;\n\n const eocd = findEndOfCentralDirectory(bytes);\n if (eocd < 0) throw new ZipError(\"invalid_archive\", \"Not a ZIP archive (no end of central directory record).\");\n\n let diskNumber = readU16(bytes, eocd + 4);\n let cdDisk = readU16(bytes, eocd + 6);\n let count = readU16(bytes, eocd + 10);\n let cdSize = readU32(bytes, eocd + 12);\n let cdOffset = readU32(bytes, eocd + 16);\n\n if (count === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff) {\n const locator = eocd - 20;\n if (locator < 0 || readU32(bytes, locator) !== SIG_ZIP64_LOCATOR) {\n throw new ZipError(\"invalid_archive\", \"ZIP64 archive is missing its end of central directory locator.\");\n }\n const record = readU64(bytes, locator + 8);\n if (record + 56 > bytes.length || readU32(bytes, record) !== SIG_ZIP64_EOCD) {\n throw new ZipError(\"invalid_archive\", \"ZIP64 end of central directory record not found.\");\n }\n diskNumber = readU32(bytes, record + 16);\n cdDisk = readU32(bytes, record + 20);\n count = readU64(bytes, record + 32);\n cdSize = readU64(bytes, record + 40);\n cdOffset = readU64(bytes, record + 48);\n }\n if (diskNumber !== 0 || cdDisk !== 0) {\n throw new ZipError(\"unsupported_feature\", \"Multi-disk (spanned) ZIP archives are not supported.\");\n }\n if (count > maxEntries) {\n throw new ZipError(\"too_many_entries\", `ZIP archive has ${count} entries; the limit is ${maxEntries}.`);\n }\n if (cdOffset + cdSize > bytes.length) {\n throw new ZipError(\"invalid_archive\", \"ZIP central directory lies outside the file.\");\n }\n\n const entries: ZipEntry[] = [];\n let p = cdOffset;\n for (let i = 0; i < count; i++) {\n if (p + 46 > bytes.length || readU32(bytes, p) !== SIG_CENTRAL) {\n throw new ZipError(\"invalid_archive\", \"ZIP central directory is corrupt.\");\n }\n const flags = readU16(bytes, p + 8);\n const method = readU16(bytes, p + 10);\n const crc32 = readU32(bytes, p + 16);\n let compressedSize = readU32(bytes, p + 20);\n let size = readU32(bytes, p + 24);\n const nameLength = readU16(bytes, p + 28);\n const extraLength = readU16(bytes, p + 30);\n const commentLength = readU16(bytes, p + 32);\n let localHeaderOffset = readU32(bytes, p + 42);\n const nameStart = p + 46;\n const extraStart = nameStart + nameLength;\n const next = extraStart + extraLength + commentLength;\n if (next > bytes.length) throw new ZipError(\"invalid_archive\", \"ZIP central directory is truncated.\");\n\n // ZIP64 extended information: only the fields that overflowed are present, in order.\n for (let e = extraStart; e + 4 <= extraStart + extraLength; ) {\n const id = readU16(bytes, e);\n const len = readU16(bytes, e + 2);\n if (id === 0x0001) {\n let f = e + 4;\n const end = f + len;\n if (size === 0xffffffff && f + 8 <= end) {\n size = readU64(bytes, f);\n f += 8;\n }\n if (compressedSize === 0xffffffff && f + 8 <= end) {\n compressedSize = readU64(bytes, f);\n f += 8;\n }\n if (localHeaderOffset === 0xffffffff && f + 8 <= end) localHeaderOffset = readU64(bytes, f);\n }\n e += 4 + len;\n }\n\n const rawName = decodeName(bytes.subarray(nameStart, extraStart), (flags & 0x0800) !== 0);\n const name = rawName.replace(/\\\\/g, \"/\");\n p = next;\n if (isUnsafeZipPath(rawName)) {\n if (options.unsafePaths === \"skip\") continue;\n throw new ZipError(\"unsafe_path\", `ZIP entry name \"${rawName}\" is absolute or escapes the archive root.`, {\n entryName: rawName,\n });\n }\n entries.push({\n name,\n isDirectory: name.endsWith(\"/\"),\n encrypted: (flags & 0x0001) !== 0,\n method,\n compressedSize,\n size,\n crc32,\n localHeaderOffset,\n });\n }\n return new ZipArchive(bytes, entries, maxTotalSize);\n}\n","import { sanitizeImportedHtml } from \"../serializers/html\";\nimport { escapeHtml, htmlToPlainText } from \"../serializers/plain-text\";\nimport type { DocumentImport, DocumentImportAdapter } from \"./adapters\";\nimport { ImportError } from \"./registry\";\nimport { readZip, type ZipArchive, type ZipReadOptions } from \"./zip\";\n\n/**\n * Dependency-free DOCX (Office Open XML WordprocessingML) import.\n *\n * Reads the main document part (located through `_rels/.rels`), its\n * relationships, `styles.xml`, `numbering.xml`, `footnotes.xml` and\n * `endnotes.xml` with the platform `DOMParser`, and maps them to TipTap HTML:\n * paragraphs, headings (`Heading1`–`Heading6` / `Title` styles and outline\n * levels), bold / italic / underline / strike / super- and subscript,\n * hyperlinks (relationships, anchors and `HYPERLINK` fields), nested bulleted\n * and numbered lists, simple tables (`colspan` / `rowspan`), line breaks,\n * tabs, footnotes / endnotes and embedded PNG / JPEG / GIF / WebP images as\n * data URLs. The result goes through `sanitizeImportedHtml`.\n *\n * Tracked changes are imported as if accepted (`w:ins` kept, `w:del` dropped)\n * unless `trackedChanges: \"original\"` is passed. Text boxes, charts, shapes,\n * equations, comments and page layout are not imported.\n */\n\nexport const DOCX_MIME_TYPES = [\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.document.macroenabled.12\",\n] as const;\n\nexport interface DocxImportOptions {\n /** Adapter id (default `\"docx\"`). */\n id?: string;\n /**\n * `DOMParser` constructor used to read the XML parts. Defaults to the global\n * one (browsers, jsdom); pass e.g. jsdom's or `@xmldom/xmldom`'s in Node.\n */\n DOMParser?: { new (): DOMParser };\n /**\n * Tracked changes: `\"accepted\"` (default) imports insertions and drops\n * deletions; `\"original\"` does the opposite (as if all were rejected).\n */\n trackedChanges?: \"accepted\" | \"original\";\n /** Embed images from `word/media` as data URLs (default `true`). */\n images?: boolean;\n /** Images larger than this many bytes are skipped (default 10 MiB). */\n maxImageSize?: number;\n /** Limits for reading the DOCX container (default: 100 MiB extracted, 5 000 entries). */\n zip?: ZipReadOptions;\n}\n\nexport const DEFAULT_DOCX_MAX_IMAGE_SIZE = 10 * 1024 * 1024;\n\nconst W_NAMESPACES = new Set([\n \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n \"http://purl.oclc.org/ooxml/wordprocessingml/main\",\n]);\n\nconst IMAGE_MIME_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n jpe: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n};\n\ninterface Relationship {\n type: string;\n target: string;\n external: boolean;\n}\n\ninterface Format {\n b?: boolean;\n i?: boolean;\n u?: boolean;\n s?: boolean;\n sup?: boolean;\n sub?: boolean;\n href?: string;\n}\n\ninterface StyleInfo {\n name: string;\n basedOn?: string;\n outlineLevel?: number;\n numPr?: { numId: string; ilvl: number };\n format: Format;\n}\n\ninterface ListLevel {\n ordered: boolean;\n start: number;\n}\n\ninterface Numbering {\n abstracts: Map<string, Map<number, ListLevel>>;\n nums: Map<string, { abstractId: string; starts: Map<number, number> }>;\n}\n\n/** One XML part (document, footnotes, …) with its relationships and preloaded images. */\ninterface Part {\n rels: Map<string, Relationship>;\n images: Map<string, string>;\n}\n\ninterface Note {\n element: Element;\n part: Part;\n}\n\ninterface RenderContext {\n styles: Map<string, StyleInfo>;\n numbering: Numbering;\n notes: Map<string, Note>;\n /** Note keys (`footnote:1`) in order of first reference. */\n noteOrder: string[];\n tracked: \"accepted\" | \"original\";\n}\n\ntype Segment =\n | { kind: \"text\"; text: string; format: Format }\n | { kind: \"br\"; format: Format }\n | { kind: \"img\"; src: string; alt: string; format: Format }\n | { kind: \"note\"; n: number; format: Format };\n\n// --- XML helpers -----------------------------------------------------------\n\nfunction isW(node: Node | null | undefined, localName?: string): node is Element {\n if (!node || node.nodeType !== 1) return false;\n const el = node as Element;\n if (localName !== undefined && el.localName !== localName) return false;\n return W_NAMESPACES.has(el.namespaceURI ?? \"\") || el.prefix === \"w\";\n}\n\nfunction childElements(el: Element): Element[] {\n const out: Element[] = [];\n for (let node = el.firstChild; node; node = node.nextSibling) {\n if (node.nodeType === 1) out.push(node as Element);\n }\n return out;\n}\n\nfunction wChild(el: Element | undefined | null, localName: string): Element | undefined {\n if (!el) return undefined;\n return childElements(el).find((child) => isW(child, localName));\n}\n\n/** Reads an attribute by local name, ignoring its namespace prefix. */\nfunction attr(el: Element | undefined | null, localName: string): string | undefined {\n if (!el) return undefined;\n for (const a of Array.from(el.attributes)) {\n if (a.localName === localName) return a.value;\n }\n return undefined;\n}\n\nfunction descendants(el: Element | Document, localName: string): Element[] {\n return Array.from(el.getElementsByTagName(\"*\")).filter((node) => node.localName === localName);\n}\n\n/** `<w:b/>`, `<w:b w:val=\"true\"/>` → true; `<w:b w:val=\"0\"/>` → false; missing → undefined. */\nfunction toggle(el: Element | undefined): boolean | undefined {\n if (!el) return undefined;\n const value = attr(el, \"val\")?.toLowerCase();\n return value === undefined || ![\"0\", \"false\", \"off\", \"none\"].includes(value);\n}\n\nfunction parseXml(Parser: { new (): DOMParser }, xml: string, partName: string): Document {\n const doc = new Parser().parseFromString(xml, \"application/xml\");\n if (!doc.documentElement || doc.getElementsByTagName(\"parsererror\").length > 0) {\n throw new ImportError(\"invalid_file\", `DOCX part \"${partName}\" is not well-formed XML.`);\n }\n return doc;\n}\n\n// --- Package helpers -------------------------------------------------------\n\nfunction dirname(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index === -1 ? \"\" : path.slice(0, index + 1);\n}\n\n/** Resolves a relationship target against the directory of its source part. */\nfunction resolvePartPath(baseDir: string, target: string): string {\n const raw = target.startsWith(\"/\") ? target.slice(1) : baseDir + target;\n const out: string[] = [];\n for (const segment of raw.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") out.pop();\n else out.push(segment);\n }\n return out.join(\"/\");\n}\n\nfunction relsPathFor(partPath: string): string {\n return `${dirname(partPath)}_rels/${partPath.slice(dirname(partPath).length)}.rels`;\n}\n\nasync function readXmlPart(\n zip: ZipArchive,\n Parser: { new (): DOMParser },\n path: string,\n): Promise<Document | null> {\n const entry = zip.get(path) ?? zip.entries.find((e) => e.name.toLowerCase() === path.toLowerCase());\n if (!entry) return null;\n return parseXml(Parser, await zip.readText(entry), path);\n}\n\nasync function readRelationships(\n zip: ZipArchive,\n Parser: { new (): DOMParser },\n partPath: string,\n): Promise<Map<string, Relationship>> {\n const rels = new Map<string, Relationship>();\n const doc = await readXmlPart(zip, Parser, relsPathFor(partPath));\n if (!doc) return rels;\n const baseDir = dirname(partPath);\n descendants(doc, \"Relationship\").forEach((rel) => {\n const id = attr(rel, \"Id\");\n const target = attr(rel, \"Target\") ?? \"\";\n if (!id) return;\n const external = attr(rel, \"TargetMode\")?.toLowerCase() === \"external\";\n rels.set(id, {\n type: attr(rel, \"Type\") ?? \"\",\n target: external ? target : resolvePartPath(baseDir, target),\n external,\n });\n });\n return rels;\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + CHUNK)));\n }\n return btoa(binary);\n}\n\n/** Preloads the images a part references, keyed by relationship id. */\nasync function loadImages(\n zip: ZipArchive,\n root: Document,\n rels: Map<string, Relationship>,\n options: DocxImportOptions,\n): Promise<Map<string, string>> {\n const images = new Map<string, string>();\n if (options.images === false) return images;\n const maxSize = options.maxImageSize ?? DEFAULT_DOCX_MAX_IMAGE_SIZE;\n const ids = new Set<string>();\n descendants(root, \"blip\").forEach((blip) => {\n const id = attr(blip, \"embed\");\n if (id) ids.add(id);\n });\n descendants(root, \"imagedata\").forEach((data) => {\n const id = attr(data, \"id\");\n if (id) ids.add(id);\n });\n for (const id of ids) {\n const rel = rels.get(id);\n // Linked (external) images are never fetched.\n if (!rel || rel.external) continue;\n const mime = IMAGE_MIME_TYPES[rel.target.split(\".\").pop()?.toLowerCase() ?? \"\"];\n const entry = zip.get(rel.target);\n if (!mime || !entry || entry.size > maxSize) continue;\n images.set(id, `data:${mime};base64,${toBase64(await zip.read(entry))}`);\n }\n return images;\n}\n\n// --- Styles and numbering ---------------------------------------------------\n\nfunction readFormat(rPr: Element | undefined): Format {\n const format: Format = {};\n if (!rPr) return format;\n const set = (key: keyof Format, value: boolean | undefined) => {\n if (value !== undefined) (format as Record<string, unknown>)[key] = value;\n };\n set(\"b\", toggle(wChild(rPr, \"b\")));\n set(\"i\", toggle(wChild(rPr, \"i\")));\n set(\"u\", toggle(wChild(rPr, \"u\")));\n const strike = toggle(wChild(rPr, \"strike\"));\n const dstrike = toggle(wChild(rPr, \"dstrike\"));\n if (strike !== undefined || dstrike !== undefined) format.s = !!(strike || dstrike);\n const vertAlign = attr(wChild(rPr, \"vertAlign\"), \"val\");\n if (vertAlign) {\n format.sup = vertAlign === \"superscript\";\n format.sub = vertAlign === \"subscript\";\n }\n return format;\n}\n\nfunction readNumPr(pPr: Element | undefined): { numId: string; ilvl: number } | undefined {\n const numPr = wChild(pPr, \"numPr\");\n if (!numPr) return undefined;\n const numId = attr(wChild(numPr, \"numId\"), \"val\");\n if (numId === undefined) return undefined;\n return { numId, ilvl: Number(attr(wChild(numPr, \"ilvl\"), \"val\") ?? 0) || 0 };\n}\n\nfunction readStyles(doc: Document | null): Map<string, StyleInfo> {\n const styles = new Map<string, StyleInfo>();\n if (!doc) return styles;\n descendants(doc, \"style\").forEach((style) => {\n const id = attr(style, \"styleId\");\n if (!id) return;\n const pPr = wChild(style, \"pPr\");\n const outline = attr(wChild(pPr, \"outlineLvl\"), \"val\");\n styles.set(id, {\n name: attr(wChild(style, \"name\"), \"val\") ?? id,\n basedOn: attr(wChild(style, \"basedOn\"), \"val\"),\n outlineLevel: outline !== undefined ? Number(outline) : undefined,\n numPr: readNumPr(pPr),\n format: readFormat(wChild(style, \"rPr\")),\n });\n });\n return styles;\n}\n\nfunction styleChain(styles: Map<string, StyleInfo>, id: string | undefined): StyleInfo[] {\n const chain: StyleInfo[] = [];\n const seen = new Set<string>();\n while (id && !seen.has(id)) {\n seen.add(id);\n const style = styles.get(id);\n if (!style) break;\n chain.push(style);\n id = style.basedOn;\n }\n return chain;\n}\n\n/** Heading level (1–6) of a paragraph style, from its name, id or outline level. */\nfunction styleHeadingLevel(styles: Map<string, StyleInfo>, id: string | undefined): number | undefined {\n if (id && /^heading([1-6])$/i.test(id)) return Number(id.slice(-1));\n for (const style of styleChain(styles, id)) {\n const byName = /^heading\\s*([1-6])$/i.exec(style.name);\n if (byName) return Number(byName[1]);\n if (/^title$/i.test(style.name)) return 1;\n if (style.outlineLevel !== undefined) {\n return style.outlineLevel >= 0 && style.outlineLevel <= 5 ? style.outlineLevel + 1 : undefined;\n }\n }\n if (id && /^title$/i.test(id)) return 1;\n return undefined;\n}\n\nfunction readNumbering(doc: Document | null): Numbering {\n const numbering: Numbering = { abstracts: new Map(), nums: new Map() };\n if (!doc) return numbering;\n descendants(doc, \"abstractNum\").forEach((abstract) => {\n const id = attr(abstract, \"abstractNumId\");\n if (id === undefined) return;\n const levels = new Map<number, ListLevel>();\n childElements(abstract)\n .filter((el) => isW(el, \"lvl\"))\n .forEach((lvl) => {\n const format = attr(wChild(lvl, \"numFmt\"), \"val\") ?? \"bullet\";\n levels.set(Number(attr(lvl, \"ilvl\") ?? 0), {\n ordered: format !== \"bullet\" && format !== \"none\",\n start: Number(attr(wChild(lvl, \"start\"), \"val\") ?? 1) || 1,\n });\n });\n numbering.abstracts.set(id, levels);\n });\n descendants(doc, \"num\").forEach((num) => {\n const id = attr(num, \"numId\");\n const abstractId = attr(wChild(num, \"abstractNumId\"), \"val\");\n if (id === undefined || abstractId === undefined) return;\n const starts = new Map<number, number>();\n childElements(num)\n .filter((el) => isW(el, \"lvlOverride\"))\n .forEach((override) => {\n const start = attr(wChild(override, \"startOverride\"), \"val\");\n if (start !== undefined) starts.set(Number(attr(override, \"ilvl\") ?? 0), Number(start));\n });\n numbering.nums.set(id, { abstractId, starts });\n });\n return numbering;\n}\n\n// --- Rendering --------------------------------------------------------------\n\nconst formatKey = (f: Format) =>\n `${f.b ? 1 : 0}${f.i ? 1 : 0}${f.u ? 1 : 0}${f.s ? 1 : 0}${f.sup ? 1 : 0}${f.sub ? 1 : 0}|${f.href ?? \"\"}`;\n\nfunction wrapFormat(inner: string, f: Format): string {\n let html = inner;\n if (f.sup) html = `<sup>${html}</sup>`;\n else if (f.sub) html = `<sub>${html}</sub>`;\n if (f.s) html = `<s>${html}</s>`;\n if (f.u) html = `<u>${html}</u>`;\n if (f.i) html = `<em>${html}</em>`;\n if (f.b) html = `<strong>${html}</strong>`;\n if (f.href) html = `<a href=\"${escapeHtml(f.href)}\">${html}</a>`;\n return html;\n}\n\nfunction renderSegments(segments: Segment[]): string {\n let html = \"\";\n let i = 0;\n while (i < segments.length) {\n const key = formatKey(segments[i].format);\n let inner = \"\";\n let j = i;\n for (; j < segments.length && formatKey(segments[j].format) === key; j++) {\n const seg = segments[j];\n if (seg.kind === \"text\") inner += escapeHtml(seg.text);\n else if (seg.kind === \"br\") inner += \"<br>\";\n else if (seg.kind === \"img\") inner += `<img src=\"${escapeHtml(seg.src)}\" alt=\"${escapeHtml(seg.alt)}\">`;\n else inner += `<sup>${seg.n}</sup>`;\n }\n html += wrapFormat(inner, segments[i].format);\n i = j;\n }\n return html;\n}\n\nfunction parseHyperlinkInstruction(instr: string): string | undefined {\n const match = /^\\s*HYPERLINK\\b(.*)$/i.exec(instr);\n if (!match) return undefined;\n const rest = match[1];\n const anchor = /\\\\l\\s+\"([^\"]*)\"/.exec(rest)?.[1];\n const target = /^\\s*(?:\"([^\"]*)\"|([^\\s\\\\]+))/.exec(rest);\n const url = target?.[1] ?? target?.[2];\n if (url) return anchor ? `${url}#${anchor}` : url;\n return anchor ? `#${anchor}` : undefined;\n}\n\nclass ParagraphRenderer {\n private segments: Segment[] = [];\n /** Open complex fields (`w:fldChar`), innermost last. */\n private fields: { instr: string; href?: string; separated: boolean }[] = [];\n\n constructor(\n private readonly ctx: RenderContext,\n private readonly part: Part,\n ) {}\n\n render(p: Element): string {\n this.walk(p, {});\n return renderSegments(this.segments);\n }\n\n private fieldHref(): string | undefined {\n for (let i = this.fields.length - 1; i >= 0; i--) {\n if (this.fields[i].separated && this.fields[i].href) return this.fields[i].href;\n }\n return undefined;\n }\n\n private inFieldInstruction(): boolean {\n return this.fields.some((field) => !field.separated);\n }\n\n private walk(el: Element, base: Format) {\n const accepted = this.ctx.tracked === \"accepted\";\n for (const child of childElements(el)) {\n if (!isW(child)) {\n // Markup-compatibility wrappers (e.g. around drawings) are handled per run.\n continue;\n }\n switch (child.localName) {\n case \"r\":\n this.run(child, base);\n break;\n case \"hyperlink\": {\n const relId = attr(child, \"id\");\n const rel = relId ? this.part.rels.get(relId) : undefined;\n const anchor = attr(child, \"anchor\");\n const href = rel ? rel.target + (anchor ? `#${anchor}` : \"\") : anchor ? `#${anchor}` : undefined;\n this.walk(child, href ? { ...base, href } : base);\n break;\n }\n case \"fldSimple\": {\n const href = parseHyperlinkInstruction(attr(child, \"instr\") ?? \"\");\n this.walk(child, href ? { ...base, href } : base);\n break;\n }\n case \"ins\":\n case \"moveTo\":\n if (accepted) this.walk(child, base);\n break;\n case \"del\":\n case \"moveFrom\":\n if (!accepted) this.walk(child, base);\n break;\n case \"sdt\":\n this.walk(wChild(child, \"sdtContent\") ?? child, base);\n break;\n case \"smartTag\":\n case \"customXml\":\n case \"dir\":\n case \"bdo\":\n case \"sdtContent\":\n this.walk(child, base);\n break;\n default:\n break;\n }\n }\n }\n\n private run(r: Element, base: Format) {\n const rPr = wChild(r, \"rPr\");\n const styleFormat = this.ctx.styles.get(attr(wChild(rPr, \"rStyle\"), \"val\") ?? \"\")?.format ?? {};\n const own = readFormat(rPr);\n const format: Format = { ...base, ...styleFormat, ...own };\n for (const child of childElements(r)) {\n this.runChild(child, format);\n }\n }\n\n private runChild(child: Element, format: Format) {\n const push = (segment: Segment) => {\n if (this.inFieldInstruction()) return;\n const href = format.href ?? this.fieldHref();\n this.segments.push(href && !format.href ? { ...segment, format: { ...format, href } } : segment);\n };\n if (child.localName === \"AlternateContent\") {\n // Prefer the first branch that yields an image (mc:Choice, then mc:Fallback).\n const branch = childElements(child).find(\n (b) => descendants(b, \"blip\").length || descendants(b, \"imagedata\").length,\n );\n if (branch) this.image(branch, format, push);\n return;\n }\n if (!isW(child)) return;\n switch (child.localName) {\n case \"t\":\n push({ kind: \"text\", text: child.textContent ?? \"\", format });\n break;\n case \"delText\":\n if (this.ctx.tracked === \"original\") push({ kind: \"text\", text: child.textContent ?? \"\", format });\n break;\n case \"tab\":\n case \"ptab\":\n push({ kind: \"text\", text: \"\\t\", format });\n break;\n case \"br\": {\n const type = attr(child, \"type\");\n if (type !== \"page\" && type !== \"column\") push({ kind: \"br\", format });\n break;\n }\n case \"cr\":\n push({ kind: \"br\", format });\n break;\n case \"noBreakHyphen\":\n push({ kind: \"text\", text: \"‑\", format });\n break;\n case \"drawing\":\n case \"pict\":\n case \"object\":\n this.image(child, format, push);\n break;\n case \"footnoteReference\":\n case \"endnoteReference\": {\n const kind = child.localName === \"footnoteReference\" ? \"footnote\" : \"endnote\";\n const key = `${kind}:${attr(child, \"id\")}`;\n if (!this.ctx.notes.has(key)) break;\n let index = this.ctx.noteOrder.indexOf(key);\n if (index === -1) index = this.ctx.noteOrder.push(key) - 1;\n push({ kind: \"note\", n: index + 1, format: { ...format, sup: false, sub: false } });\n break;\n }\n case \"fldChar\": {\n const type = attr(child, \"fldCharType\");\n if (type === \"begin\") this.fields.push({ instr: \"\", separated: false });\n else if (type === \"separate\") {\n const field = this.fields[this.fields.length - 1];\n if (field) {\n field.separated = true;\n field.href = parseHyperlinkInstruction(field.instr);\n }\n } else if (type === \"end\") this.fields.pop();\n break;\n }\n case \"instrText\": {\n const field = this.fields[this.fields.length - 1];\n if (field && !field.separated) field.instr += child.textContent ?? \"\";\n break;\n }\n default:\n break;\n }\n }\n\n private image(container: Element, format: Format, push: (segment: Segment) => void) {\n const blip = descendants(container, \"blip\")[0];\n const imageData = descendants(container, \"imagedata\")[0];\n const id = blip ? attr(blip, \"embed\") : attr(imageData, \"id\");\n const src = id ? this.part.images.get(id) : undefined;\n if (!src) return;\n const docPr = descendants(container, \"docPr\")[0];\n const alt = attr(docPr, \"descr\") || attr(docPr, \"title\") || attr(imageData, \"title\") || \"\";\n push({ kind: \"img\", src, alt, format });\n }\n}\n\n/** Flattens block-level wrappers (content controls, tracked moves, …) into `w:p` / `w:tbl`. */\nfunction flattenBlocks(container: Element, ctx: RenderContext, out: Element[] = []): Element[] {\n const accepted = ctx.tracked === \"accepted\";\n for (const child of childElements(container)) {\n if (!isW(child)) continue;\n switch (child.localName) {\n case \"p\":\n case \"tbl\":\n out.push(child);\n break;\n case \"sdt\":\n flattenBlocks(wChild(child, \"sdtContent\") ?? child, ctx, out);\n break;\n case \"sdtContent\":\n case \"customXml\":\n flattenBlocks(child, ctx, out);\n break;\n case \"ins\":\n case \"moveTo\":\n if (accepted) flattenBlocks(child, ctx, out);\n break;\n case \"del\":\n case \"moveFrom\":\n if (!accepted) flattenBlocks(child, ctx, out);\n break;\n default:\n break;\n }\n }\n return out;\n}\n\nfunction paragraphInfo(p: Element, ctx: RenderContext) {\n const pPr = wChild(p, \"pPr\");\n const styleId = attr(wChild(pPr, \"pStyle\"), \"val\");\n const outline = attr(wChild(pPr, \"outlineLvl\"), \"val\");\n let heading: number | undefined;\n if (outline !== undefined) {\n const level = Number(outline);\n heading = level >= 0 && level <= 5 ? level + 1 : undefined;\n } else {\n heading = styleHeadingLevel(ctx.styles, styleId);\n }\n let numPr = readNumPr(pPr);\n if (!numPr) numPr = styleChain(ctx.styles, styleId).find((style) => style.numPr)?.numPr;\n let list: { level: number; ordered: boolean; start: number } | undefined;\n if (numPr && numPr.numId !== \"0\" && heading === undefined) {\n const num = ctx.numbering.nums.get(numPr.numId);\n const def = num ? ctx.numbering.abstracts.get(num.abstractId)?.get(numPr.ilvl) : undefined;\n list = {\n level: Math.max(0, Math.min(numPr.ilvl, 8)),\n ordered: def?.ordered ?? false,\n start: num?.starts.get(numPr.ilvl) ?? def?.start ?? 1,\n };\n }\n return { heading, list };\n}\n\nfunction renderBlocks(container: Element, ctx: RenderContext, part: Part): string {\n let html = \"\";\n // Open lists, outermost first; each has an open `<li>`.\n const stack: { level: number; tag: \"ul\" | \"ol\" }[] = [];\n const closeList = () => {\n const top = stack.pop()!;\n html += `</li></${top.tag}>`;\n };\n const closeAll = () => {\n while (stack.length) closeList();\n };\n\n for (const block of flattenBlocks(container, ctx)) {\n if (block.localName === \"tbl\") {\n closeAll();\n html += renderTable(block, ctx, part);\n continue;\n }\n const { heading, list } = paragraphInfo(block, ctx);\n const inner = new ParagraphRenderer(ctx, part).render(block);\n const blockHtml = heading ? `<h${heading}>${inner}</h${heading}>` : `<p>${inner}</p>`;\n if (!list) {\n closeAll();\n html += blockHtml;\n continue;\n }\n const tag = list.ordered ? \"ol\" : \"ul\";\n while (stack.length && stack[stack.length - 1].level > list.level) closeList();\n const top = stack[stack.length - 1];\n if (top && top.level === list.level && top.tag === tag) {\n html += \"</li><li>\";\n } else {\n if (top && top.level === list.level) closeList();\n const start = tag === \"ol\" && list.start !== 1 ? ` start=\"${list.start}\"` : \"\";\n html += `<${tag}${start}><li>`;\n stack.push({ level: list.level, tag });\n }\n html += blockHtml;\n }\n closeAll();\n return html;\n}\n\nfunction renderTable(tbl: Element, ctx: RenderContext, part: Part): string {\n type Cell = { el: Element; col: number; span: number; merge?: \"restart\" | \"continue\"; header: boolean };\n const rows: Cell[][] = [];\n const collectRows = (container: Element) => {\n for (const child of childElements(container)) {\n if (isW(child, \"tr\")) {\n const header = !!toggle(wChild(wChild(child, \"trPr\"), \"tblHeader\"));\n const cells: Cell[] = [];\n let col = 0;\n const collectCells = (row: Element) => {\n for (const cellEl of childElements(row)) {\n if (isW(cellEl, \"tc\")) {\n const tcPr = wChild(cellEl, \"tcPr\");\n const span = Math.max(1, Number(attr(wChild(tcPr, \"gridSpan\"), \"val\") ?? 1) || 1);\n const vMerge = wChild(tcPr, \"vMerge\");\n const merge = vMerge ? (attr(vMerge, \"val\") === \"restart\" ? \"restart\" : \"continue\") : undefined;\n cells.push({ el: cellEl, col, span, merge, header });\n col += span;\n } else if (isW(cellEl, \"sdt\")) {\n collectCells(wChild(cellEl, \"sdtContent\") ?? cellEl);\n }\n }\n };\n collectCells(child);\n rows.push(cells);\n } else if (isW(child, \"sdt\")) {\n collectRows(wChild(child, \"sdtContent\") ?? child);\n }\n }\n };\n collectRows(tbl);\n\n let html = \"<table><tbody>\";\n rows.forEach((cells, rowIndex) => {\n html += \"<tr>\";\n for (const cell of cells) {\n if (cell.merge === \"continue\") continue;\n let rowspan = 1;\n if (cell.merge === \"restart\") {\n for (let r = rowIndex + 1; r < rows.length; r++) {\n const below = rows[r].find((c) => c.col === cell.col);\n if (below?.merge !== \"continue\") break;\n rowspan++;\n }\n }\n const tag = cell.header ? \"th\" : \"td\";\n const attrs = `${cell.span > 1 ? ` colspan=\"${cell.span}\"` : \"\"}${rowspan > 1 ? ` rowspan=\"${rowspan}\"` : \"\"}`;\n html += `<${tag}${attrs}>${renderBlocks(cell.el, ctx, part) || \"<p></p>\"}</${tag}>`;\n }\n html += \"</tr>\";\n });\n return `${html}</tbody></table>`;\n}\n\nfunction getDomParser(options: DocxImportOptions): { new (): DOMParser } {\n const Parser = options.DOMParser ?? (globalThis as any).DOMParser ?? (globalThis as any).window?.DOMParser;\n if (typeof Parser !== \"function\") {\n throw new ImportError(\n \"unsupported_environment\",\n \"DOCX import needs a DOMParser. In Node, pass one with createDocxImportAdapter({ DOMParser }) (e.g. from jsdom).\",\n );\n }\n return Parser;\n}\n\n/**\n * Converts a DOCX file to sanitized TipTap HTML and plain text. Throws\n * {@link ImportError} (`invalid_file` / `unsupported_environment`) or\n * `ZipError` for damaged or oversized containers.\n */\nexport async function docxToDocumentImport(\n data: ArrayBuffer | ArrayBufferView,\n options: DocxImportOptions = {},\n): Promise<DocumentImport> {\n const Parser = getDomParser(options);\n let zip: ZipArchive;\n try {\n zip = await readZip(data, { maxTotalSize: 100 * 1024 * 1024, maxEntries: 5_000, ...options.zip });\n } catch (error) {\n if ((error as { code?: string })?.code === \"invalid_archive\") {\n throw new ImportError(\"invalid_file\", \"Not a DOCX file (the file is not a ZIP package).\", { cause: error });\n }\n throw error;\n }\n\n let mainPath = \"word/document.xml\";\n const packageRels = await readXmlPart(zip, Parser, \"_rels/.rels\");\n if (packageRels) {\n const office = descendants(packageRels, \"Relationship\").find((rel) =>\n /\\/officeDocument$/.test(attr(rel, \"Type\") ?? \"\"),\n );\n const target = attr(office, \"Target\");\n if (target) mainPath = resolvePartPath(\"\", target);\n }\n const documentXml = await readXmlPart(zip, Parser, mainPath);\n const body = documentXml ? descendants(documentXml, \"body\").find((el) => isW(el)) : undefined;\n if (!documentXml || !body) {\n throw new ImportError(\"invalid_file\", \"Not a Word document (no main document part with a body).\");\n }\n\n const rels = await readRelationships(zip, Parser, mainPath);\n const partByType = (suffix: string) =>\n Array.from(rels.values()).find((rel) => !rel.external && rel.type.endsWith(`/${suffix}`))?.target;\n const baseDir = dirname(mainPath);\n const stylesPath = partByType(\"styles\") ?? `${baseDir}styles.xml`;\n const numberingPath = partByType(\"numbering\") ?? `${baseDir}numbering.xml`;\n\n const ctx: RenderContext = {\n styles: readStyles(await readXmlPart(zip, Parser, stylesPath)),\n numbering: readNumbering(await readXmlPart(zip, Parser, numberingPath)),\n notes: new Map(),\n noteOrder: [],\n tracked: options.trackedChanges ?? \"accepted\",\n };\n\n for (const kind of [\"footnote\", \"endnote\"] as const) {\n const path = partByType(`${kind}s`) ?? `${baseDir}${kind}s.xml`;\n const notesXml = await readXmlPart(zip, Parser, path);\n if (!notesXml) continue;\n const noteRels = await readRelationships(zip, Parser, path);\n const part: Part = { rels: noteRels, images: await loadImages(zip, notesXml, noteRels, options) };\n descendants(notesXml, kind)\n .filter((note) => isW(note))\n .forEach((note) => {\n const type = attr(note, \"type\");\n if (type && type !== \"normal\") return; // separators\n ctx.notes.set(`${kind}:${attr(note, \"id\")}`, { element: note, part });\n });\n }\n\n const part: Part = { rels, images: await loadImages(zip, documentXml, rels, options) };\n let html = renderBlocks(body, ctx, part);\n if (ctx.noteOrder.length) {\n // Notes may reference further notes; render until the list stops growing.\n let notesHtml = \"\";\n for (let i = 0; i < ctx.noteOrder.length; i++) {\n const note = ctx.notes.get(ctx.noteOrder[i])!;\n notesHtml += `<li>${renderBlocks(note.element, ctx, note.part) || \"<p></p>\"}</li>`;\n }\n html += `<hr><ol>${notesHtml}</ol>`;\n }\n const sanitized = sanitizeImportedHtml(html);\n return { html: sanitized, text: htmlToPlainText(sanitized) };\n}\n\n/** Creates a DOCX `document` adapter with custom options. */\nexport function createDocxImportAdapter(options: DocxImportOptions = {}): DocumentImportAdapter {\n return {\n id: options.id ?? \"docx\",\n label: \"Word document\",\n mimeTypes: DOCX_MIME_TYPES,\n extensions: [\".docx\", \".docm\", \".dotx\"],\n target: \"document\",\n async import(_input, context) {\n return docxToDocumentImport(await context.readArrayBuffer(), options);\n },\n };\n}\n\n/** DOCX adapter with default options; registered in the default registry. */\nexport const docxImportAdapter: DocumentImportAdapter = createDocxImportAdapter();\n","import { markdownToTipTapHtml } from \"../serializers/markdown\";\nimport { htmlToPlainText } from \"../serializers/plain-text\";\nimport { plainTextToParagraphHtml, sanitizeImportedHtml } from \"../serializers/html\";\nimport { rtfToPlainText } from \"../serializers/rtf\";\nimport { docxImportAdapter } from \"./docx\";\nimport type { ImportStructureReport } from \"./pdf-layout\";\nimport {\n ImportAdapterRegistry,\n type FindImportAdapterQuery,\n type ImportAdapter,\n type ImportFileOptions,\n type ImportInput,\n type ImportOutcome,\n type ImportTarget,\n type RegisterImportAdapterOptions,\n} from \"./registry\";\n\n/** Result of every `document` adapter: sanitized TipTap HTML plus plain text. */\nexport interface DocumentImport {\n /** Sanitized HTML ready for `setContent` / `insertContent`. */\n html: string;\n /** Plain-text version, used by plain-text (prompt) editors. */\n text: string;\n /**\n * What a structure-aware importer recognised (headings, lists, tables,\n * columns) with confidences; set by the PDF adapter.\n */\n structure?: ImportStructureReport;\n}\n\nexport type DocumentImportAdapter = ImportAdapter<DocumentImport>;\n\n/**\n * Markdown files. Rendered with the same sanitizing pipeline as\n * `markdownToTipTapHtml`. `.txt` is deliberately left to the plain-text\n * adapter so ordinary text files are not reinterpreted as markdown; `.md.txt`\n * still matches here because the longest extension wins.\n */\nexport const markdownImportAdapter: DocumentImportAdapter = {\n id: \"markdown\",\n label: \"Markdown\",\n mimeTypes: [\"text/markdown\", \"text/x-markdown\"],\n extensions: [\".md\", \".mdown\", \".markdown\", \".mkdn\", \".mkd\", \".rmd\", \".md.txt\"],\n target: \"document\",\n async import(_input, context) {\n const text = await context.readText();\n return { html: markdownToTipTapHtml(text), text };\n },\n};\n\n/** HTML files and fragments, sanitized with `sanitizeImportedHtml`. */\nexport const htmlImportAdapter: DocumentImportAdapter = {\n id: \"html\",\n label: \"HTML\",\n mimeTypes: [\"text/html\", \"application/xhtml+xml\"],\n extensions: [\".html\", \".htm\", \".xhtml\"],\n target: \"document\",\n async import(_input, context) {\n const html = sanitizeImportedHtml(await context.readText());\n return { html, text: htmlToPlainText(html) };\n },\n};\n\n/** Plain text: one paragraph per line, always escaped. */\nexport const plainTextImportAdapter: DocumentImportAdapter = {\n id: \"text\",\n label: \"Plain text\",\n mimeTypes: [\"text/plain\"],\n extensions: [\".txt\", \".text\"],\n target: \"document\",\n async import(_input, context) {\n const text = (await context.readText()).replace(/\\r\\n?/g, \"\\n\");\n return { html: plainTextToParagraphHtml(text), text };\n },\n};\n\n/**\n * RTF: best-effort text extraction with `rtfToPlainText` (paragraphs and\n * characters only; formatting, tables and images are dropped).\n */\nexport const rtfImportAdapter: DocumentImportAdapter = {\n id: \"rtf\",\n label: \"Rich Text Format\",\n mimeTypes: [\"application/rtf\", \"text/rtf\"],\n extensions: [\".rtf\"],\n target: \"document\",\n async import(_input, context) {\n const text = rtfToPlainText(await context.readText());\n return { html: plainTextToParagraphHtml(text), text };\n },\n};\n\nexport const BUILT_IN_IMPORT_ADAPTERS: readonly DocumentImportAdapter[] = [\n markdownImportAdapter,\n htmlImportAdapter,\n plainTextImportAdapter,\n rtfImportAdapter,\n docxImportAdapter,\n];\n\nexport interface CreateImportAdapterRegistryOptions {\n /** Register the built-in document adapters (default `true`). */\n builtIns?: boolean;\n}\n\nexport function createImportAdapterRegistry(\n options: CreateImportAdapterRegistryOptions = {},\n): ImportAdapterRegistry {\n const registry = new ImportAdapterRegistry();\n if (options.builtIns !== false) {\n BUILT_IN_IMPORT_ADAPTERS.forEach((adapter) => registry.register(adapter));\n }\n return registry;\n}\n\n/** Shared registry used by the module-level helpers and editor integrations. */\nexport const defaultImportRegistry = createImportAdapterRegistry();\n\n/** Registers an adapter on the default registry; returns an unregister function. */\nexport function registerImportAdapter<TResult>(\n adapter: ImportAdapter<TResult>,\n options?: RegisterImportAdapterOptions,\n): () => void {\n return defaultImportRegistry.register(adapter, options);\n}\n\nexport function unregisterImportAdapter(adapterOrId: string | ImportAdapter<any>): boolean {\n return defaultImportRegistry.unregister(adapterOrId);\n}\n\nexport function findImportAdapter(query: FindImportAdapterQuery): ImportAdapter | undefined {\n return defaultImportRegistry.find(query);\n}\n\n/** Imports a file with the default registry. */\nexport function importFile<TResult = unknown>(\n input: ImportInput,\n options?: ImportFileOptions,\n): Promise<ImportOutcome<TResult>> {\n return defaultImportRegistry.importFile<TResult>(input, options);\n}\n\n/** `accept` attribute value for the default registry. */\nexport function getImportAccept(target?: ImportTarget): string {\n return defaultImportRegistry.accept(target);\n}\n","import { DOMParser as PMDOMParser, Slice, type Schema } from \"@tiptap/pm/model\";\nimport { Selection } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\nimport { plainTextToSlice } from \"../serializers/plain-text\";\nimport { defaultImportRegistry, type DocumentImport } from \"./adapters\";\nimport type { FileLike, ImportAdapterRegistry, ImportOutcome } from \"./registry\";\n\n/** A TipTap `Editor` (or anything with a `view`) or a ProseMirror `EditorView`. */\nexport type ImportEditorTarget = EditorView | { view: EditorView };\n\nconst toView = (target: ImportEditorTarget): EditorView =>\n \"state\" in target && \"dispatch\" in target ? (target as EditorView) : (target as { view: EditorView }).view;\n\n/**\n * Parses (already sanitized) HTML into a slice for `schema`. The HTML is\n * parsed with `DOMParser`, which produces an inert document: images don't\n * load and handlers don't run. Returns `null` without a DOM.\n */\nexport function htmlToSlice(html: string, schema: Schema): Slice | null {\n const Parser: typeof DOMParser | undefined =\n (globalThis as any).DOMParser ?? (globalThis as any).window?.DOMParser;\n if (!Parser) return null;\n const body = new Parser().parseFromString(`<body>${html}</body>`, \"text/html\").body;\n // A closed slice: imported blocks stay blocks instead of merging into the\n // paragraph at the insertion point (which `parseSlice`'s open slice does).\n return new Slice(PMDOMParser.fromSchema(schema).parse(body).content, 0, 0);\n}\n\nexport interface InsertImportedDocumentOptions {\n /** Document position to insert at (default: replace the selection). */\n at?: number;\n /** Insert `text` literally instead of `html` (plain-text / prompt editors). */\n asPlainText?: boolean;\n}\n\n/**\n * Inserts an imported document into an editor as one transaction and returns\n * the position right after the inserted content.\n */\nexport function insertImportedDocument(\n target: ImportEditorTarget,\n content: DocumentImport,\n options: InsertImportedDocumentOptions = {},\n): number {\n const view = toView(target);\n const { state } = view;\n const htmlSlice = options.asPlainText ? null : htmlToSlice(content.html, state.schema);\n const size = state.doc.content.size;\n let from =\n options.at !== undefined ? Math.max(0, Math.min(options.at, size)) : state.selection.from;\n let to = options.at !== undefined ? from : state.selection.to;\n if (!htmlSlice && from === to && !state.doc.resolve(from).parent.inlineContent) {\n // Drop positions can fall between blocks; text belongs in the nearest textblock.\n from = to = Selection.near(state.doc.resolve(from)).from;\n }\n // Closed HTML blocks may replace an empty parent (`replaceRange`); plain text\n // is an open slice that merges into the current paragraph like a paste.\n const tr = htmlSlice\n ? state.tr.replaceRange(from, to, htmlSlice)\n : state.tr.replace(from, to, plainTextToSlice(content.text, state.schema));\n const end = tr.mapping.map(to, 1);\n view.dispatch(tr.scrollIntoView().setMeta(\"uiEvent\", \"drop\"));\n return end;\n}\n\nexport interface ImportFilesIntoEditorOptions extends InsertImportedDocumentOptions {\n /** Registry to match files against (default: the shared default registry). */\n registry?: ImportAdapterRegistry;\n /** Per-adapter options keyed by adapter id, e.g. `{ pdf: { structure: false } }` (see `ImportFileOptions`). */\n adapterOptions?: Record<string, unknown>;\n /** Called after each file is inserted. */\n onImport?: (outcome: ImportOutcome<DocumentImport>, file: FileLike) => void;\n /** Called for each file that cannot be imported; other files continue. */\n onError?: (error: Error, file: FileLike) => void;\n}\n\n/**\n * Imports files with `document` adapters and inserts them one after another\n * at `at` (or the selection). Files without a matching adapter are reported\n * through `onError`. Resolves with the successful outcomes.\n */\nexport async function importFilesIntoEditor(\n target: ImportEditorTarget,\n files: Iterable<FileLike> | ArrayLike<FileLike>,\n options: ImportFilesIntoEditorOptions = {},\n): Promise<ImportOutcome<DocumentImport>[]> {\n const registry = options.registry ?? defaultImportRegistry;\n const outcomes: ImportOutcome<DocumentImport>[] = [];\n let at = options.at;\n for (const file of Array.from(files as ArrayLike<FileLike>)) {\n try {\n const outcome = await registry.importFile<DocumentImport>(file, {\n target: \"document\",\n adapterOptions: options.adapterOptions,\n });\n const view = toView(target);\n if ((view as any).isDestroyed) break;\n at = insertImportedDocument(view, outcome.result, { at, asPlainText: options.asPlainText });\n outcomes.push(outcome);\n options.onImport?.(outcome, file);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (options.onError) options.onError(err, file);\n else console.error(\"[Editor] File import failed:\", err);\n }\n }\n return outcomes;\n}\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\nimport {\n PIXERATE_DOCUMENT_MIME,\n getClipboardData,\n readRichClipboard,\n serializeRichClipboardPayload,\n} from \"../serializers/clipboard\";\n\nexport interface RichClipboardOptions {\n /** MIME type for the slice JSON (default `application/x.pixerate.document+json`). */\n mimeType?: string;\n /**\n * Never paste the rich payload; leave paste to the existing plain-text\n * handling. `EditorController` sets this automatically in `plainTextMode`.\n */\n plainTextMode?: boolean;\n}\n\nexport interface RichClipboardStorage {\n plainTextMode: boolean;\n}\n\nexport const richClipboardPluginKey = new PluginKey(\"richClipboard\");\n\n/**\n * Writes the selection to the clipboard event as HTML, plain text and the\n * custom slice JSON. Mirrors ProseMirror's own copy handler (which would\n * otherwise clear the extra MIME type) and returns `false` when the event has\n * no writable clipboard data, so ProseMirror's handler runs instead.\n */\nexport function writeRichClipboard(\n view: EditorView,\n event: ClipboardEvent,\n options: { cut?: boolean; mimeType?: string } = {},\n): boolean {\n const { state } = view;\n if (state.selection.empty) return false;\n const data = getClipboardData(event);\n if (!data || typeof data.setData !== \"function\") return false;\n const slice = state.selection.content();\n const { dom, text } = view.serializeForClipboard(slice);\n event.preventDefault();\n data.clearData?.();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n data.setData(options.mimeType ?? PIXERATE_DOCUMENT_MIME, serializeRichClipboardPayload(slice, state.schema));\n if (options.cut && view.editable) {\n view.dispatch(state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n }\n return true;\n}\n\n/**\n * Internal rich-text clipboard. On copy/cut it also writes the selection as a\n * ProseMirror slice under `application/x.pixerate.document+json` together\n * with the schema signature; on paste it prefers that payload when the\n * signature matches the target editor and otherwise falls back to the normal\n * HTML / plain-text handling.\n *\n * Opt-in: add it to `extensions` or pass `richClipboard: true` to\n * `createRichTextPreset`.\n */\nexport const RichClipboard = Extension.create<RichClipboardOptions, RichClipboardStorage>({\n name: \"richClipboard\",\n\n addOptions() {\n return {\n mimeType: PIXERATE_DOCUMENT_MIME,\n plainTextMode: false,\n };\n },\n\n addStorage() {\n return { plainTextMode: !!this.options.plainTextMode };\n },\n\n addProseMirrorPlugins() {\n const mimeType = this.options.mimeType ?? PIXERATE_DOCUMENT_MIME;\n const storage = this.storage;\n return [\n new Plugin({\n key: richClipboardPluginKey,\n props: {\n handleDOMEvents: {\n copy: (view, event) => writeRichClipboard(view, event, { mimeType }),\n cut: (view, event) => writeRichClipboard(view, event, { cut: true, mimeType }),\n },\n handlePaste(view, event) {\n if (storage.plainTextMode) return false;\n const slice = readRichClipboard(event, view.state.schema, mimeType);\n if (!slice) return false;\n event.preventDefault();\n view.dispatch(\n view.state.tr\n .replaceSelection(slice)\n .scrollIntoView()\n .setMeta(\"paste\", true)\n .setMeta(\"uiEvent\", \"paste\"),\n );\n return true;\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { closeHistory } from \"@tiptap/pm/history\";\nimport { Plugin, PluginKey, type EditorState } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\n\n/**\n * Context passed to function replacements.\n */\nexport interface AutocorrectContext {\n /** Text of the current block before the caret, including the typed text. */\n textBefore: string;\n /** Returns true if `text` is in the exceptions list (case-insensitive). */\n isException: (text: string) => boolean;\n /** Editor state before the typed text was inserted. */\n state: EditorState;\n}\n\n/**\n * An autocorrect rule. Rules are checked in order after every typed character\n * against the text before the caret; the first one that produces a\n * replacement wins.\n *\n * - `find: string` matches when the text before the caret ends with it.\n * With `wholeWord: true` it must also be a whole word followed by a space or\n * punctuation (Word's AutoCorrect entries, e.g. `teh ` -> `the `); the\n * delimiter is kept.\n * - `find: RegExp` must match at the end of the text (anchor it with `$`).\n *\n * `replace` replaces the whole match. A string is inserted literally (no `$1`\n * patterns); use a function to reuse capture groups. Return `null` from a\n * function to skip the correction.\n */\nexport interface AutocorrectRule {\n id: string;\n find: string | RegExp;\n replace:\n | string\n | ((match: RegExpMatchArray, context: AutocorrectContext) => string | null | undefined);\n wholeWord?: boolean;\n}\n\n/**\n * A correction that was applied.\n */\nexport interface AutocorrectCorrection {\n ruleId: string;\n /** Document range of the replacement text after the correction. */\n from: number;\n to: number;\n original: string;\n replacement: string;\n}\n\nexport interface AutocorrectOptions {\n /** Rules in priority order. Defaults to `defaultAutocorrectRules`. */\n rules: AutocorrectRule[];\n /**\n * Exceptions (Word's AutoCorrect exceptions). Matched case-insensitively.\n * - Abbreviations ending in `.` (e.g. `e.g.`) do not end a sentence, so the\n * next word is not capitalized.\n * - Words like `IDs` are not \"fixed\" by the two-initial-capitals rule.\n * - Any other entry is text that should never be corrected (the matched\n * text, e.g. `(c)` or `teh`).\n */\n exceptions: string[];\n /** Node types in which nothing is corrected (plus any node with `code: true`). */\n ignoreNodes: string[];\n /** Mark types in which nothing is corrected (plus any mark with `code: true`). */\n ignoreMarks: string[];\n /** Skip corrections inside `{{template}}`, `{variable}` and `__instruction__` tokens. */\n ignorePromptTokens: boolean;\n /** Called after each correction. */\n onCorrection?: (correction: AutocorrectCorrection) => void;\n}\n\nexport interface AutocorrectStorage {\n /** Whether corrections are applied. Toggle with `setAutocorrectEnabled`. */\n enabled: boolean;\n /** Live exceptions set (lowercased). Edit with the exception commands. */\n exceptions: Set<string>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n autocorrect: {\n /** Reverts the last correction if nothing else has changed since. */\n undoAutocorrect: () => ReturnType;\n /** Enables or disables autocorrect. */\n setAutocorrectEnabled: (enabled: boolean) => ReturnType;\n /** Adds an entry to the exceptions list. */\n addAutocorrectException: (text: string) => ReturnType;\n /** Removes an entry from the exceptions list. */\n removeAutocorrectException: (text: string) => ReturnType;\n };\n }\n}\n\nconst quoteOpener = /[\\s ([{<—–‘“-]/;\n\n/** Smart (curly) quotes and apostrophes. */\nexport const smartQuoteRules: AutocorrectRule[] = [\n {\n id: \"smart-quotes:double\",\n find: /(^|.)\"$/su,\n replace: (m) => m[1] + (!m[1] || quoteOpener.test(m[1]) ? \"“\" : \"”\"),\n },\n {\n id: \"smart-quotes:single\",\n find: /(^|.)'$/su,\n replace: (m) => m[1] + (!m[1] || quoteOpener.test(m[1]) ? \"‘\" : \"’\"),\n },\n];\n\n/** Symbols: em dash, ellipsis, arrows, copyright, registered, trademark. */\nexport const symbolRules: AutocorrectRule[] = [\n { id: \"symbols:em-dash\", find: \"--\", replace: \"—\" },\n { id: \"symbols:ellipsis\", find: \"...\", replace: \"…\" },\n { id: \"symbols:right-arrow\", find: \"->\", replace: \"→\" },\n { id: \"symbols:left-arrow\", find: \"<-\", replace: \"←\" },\n { id: \"symbols:copyright\", find: /\\([cC]\\)$/, replace: \"©\" },\n { id: \"symbols:registered\", find: /\\([rR]\\)$/, replace: \"®\" },\n { id: \"symbols:trademark\", find: /\\((?:tm|TM)\\)$/, replace: \"™\" },\n];\n\nconst FRACTIONS: Record<string, string> = { \"1/2\": \"½\", \"1/4\": \"¼\", \"3/4\": \"¾\" };\n\n/** Fractions (`1/2`, `1/4`, `3/4`), corrected once the number is complete. */\nexport const fractionRules: AutocorrectRule[] = [\n {\n id: \"fractions\",\n find: /(^|[^\\d/.,])([13]\\/[24])([\\s.,;:!?)])$/u,\n replace: (m) => (FRACTIONS[m[2]] ? m[1] + FRACTIONS[m[2]] + m[3] : null),\n },\n];\n\n/**\n * Capitalizes the first letter of a sentence when the word is completed.\n * Abbreviations in the exceptions list (and single-letter initials such as\n * `J.`) do not end a sentence.\n */\nexport const capitalizeSentenceRules: AutocorrectRule[] = [\n {\n id: \"capitalize-sentence\",\n find: /(?:^|(\\S+)(\\s+))(\\p{Ll}[^\\s]*)(\\s)$/u,\n replace: (m, ctx) => {\n const [, previous, space = \"\", word, trailing] = m;\n // URLs, paths, e-mail addresses and dotted abbreviations stay as typed.\n if (/[./@:\\\\]/.test(word.slice(0, -1))) return null;\n if (previous !== undefined) {\n if (!/[.!?][\"'”’)]*$/.test(previous)) return null;\n const token = previous.replace(/[\"'”’)]+$/, \"\");\n if (ctx.isException(token)) return null;\n if (/^\\p{L}\\.$/u.test(token)) return null;\n if (/\\.\\./.test(token) || token.endsWith(\"…\")) return null;\n }\n return (\n (previous ?? \"\") + space + word.charAt(0).toUpperCase() + word.slice(1) + trailing\n );\n },\n },\n];\n\n/** Fixes TWo INitial CApitals (`THe ` -> `The `), unless the word is an exception. */\nexport const twoInitialCapitalsRules: AutocorrectRule[] = [\n {\n id: \"two-initial-capitals\",\n find: /(^|[^\\p{L}\\p{N}'’])(\\p{Lu})(\\p{Lu})(\\p{Ll}{1,})([\\s.,;:!?])$/u,\n replace: (m, ctx) => {\n const word = m[2] + m[3] + m[4];\n if (ctx.isException(word)) return null;\n return m[1] + m[2] + m[3].toLowerCase() + m[4] + m[5];\n },\n },\n];\n\n/**\n * The default rule set: smart quotes, symbols, fractions, sentence\n * capitalization and two-initial-capitals.\n */\nexport const defaultAutocorrectRules: AutocorrectRule[] = [\n ...smartQuoteRules,\n ...symbolRules,\n ...fractionRules,\n ...capitalizeSentenceRules,\n ...twoInitialCapitalsRules,\n];\n\n/** Default exceptions: common abbreviations and two-capital words. */\nexport const DEFAULT_AUTOCORRECT_EXCEPTIONS: string[] = [\n \"a.m.\", \"abbr.\", \"approx.\", \"apt.\", \"assn.\", \"ave.\", \"ca.\", \"cf.\", \"co.\",\n \"corp.\", \"dept.\", \"dr.\", \"e.g.\", \"est.\", \"etc.\", \"fig.\", \"i.e.\", \"inc.\",\n \"jr.\", \"ltd.\", \"mr.\", \"mrs.\", \"ms.\", \"mt.\", \"no.\", \"p.\", \"p.m.\", \"pp.\",\n \"prof.\", \"sr.\", \"st.\", \"vol.\", \"vs.\",\n \"CDs\", \"IDs\", \"PCs\", \"GHz\", \"MHz\", \"KHz\",\n];\n\nexport const autocorrectPluginKey = new PluginKey<AutocorrectPluginState>(\"autocorrect\");\n\ninterface AutocorrectPluginState {\n last: AutocorrectCorrection | null;\n /** The next typed text should start a new undo group. */\n closePending: boolean;\n}\n\nconst WHOLE_WORD_DELIMITER = /[\\s.,;:!?]/;\n\n/**\n * Finds the first matching rule for `textBefore`. Exported for testing and for\n * custom input pipelines.\n */\nexport function findAutocorrection(\n textBefore: string,\n rules: readonly AutocorrectRule[],\n context: Omit<AutocorrectContext, \"textBefore\">,\n): { ruleId: string; start: number; original: string; replacement: string } | null {\n const ctx: AutocorrectContext = { ...context, textBefore };\n for (const rule of rules) {\n let match: RegExpMatchArray | null = null;\n if (typeof rule.find === \"string\") {\n const find = rule.find;\n if (rule.wholeWord) {\n const delimiter = textBefore.slice(-1);\n if (!WHOLE_WORD_DELIMITER.test(delimiter)) continue;\n const body = textBefore.slice(0, -1);\n if (!body.endsWith(find)) continue;\n const before = body.charAt(body.length - find.length - 1);\n if (before && /[\\p{L}\\p{N}_]/u.test(before)) continue;\n match = Object.assign([find + delimiter], {\n index: textBefore.length - find.length - 1,\n input: textBefore,\n }) as RegExpMatchArray;\n } else {\n if (!textBefore.endsWith(find)) continue;\n match = Object.assign([find], {\n index: textBefore.length - find.length,\n input: textBefore,\n }) as RegExpMatchArray;\n }\n } else {\n const regex = new RegExp(rule.find.source, rule.find.flags.replace(\"g\", \"\"));\n match = textBefore.match(regex);\n if (!match || match.index! + match[0].length !== textBefore.length) continue;\n }\n\n const original = match[0];\n if (ctx.isException(original.trim())) continue;\n let replacement: string | null | undefined;\n if (typeof rule.replace === \"function\") {\n replacement = rule.replace(match, ctx);\n } else {\n replacement =\n rule.wholeWord && typeof rule.find === \"string\"\n ? rule.replace + original.slice(-1)\n : rule.replace;\n }\n if (replacement == null || replacement === original) continue;\n return { ruleId: rule.id, start: match.index!, original, replacement };\n }\n return null;\n}\n\n/**\n * True when the end of `textBefore` is inside an unclosed prompt token:\n * `{{template`, `{variable` or `__instruction`.\n */\nexport function isInsidePromptToken(textBefore: string): boolean {\n if (textBefore.lastIndexOf(\"{\") > textBefore.lastIndexOf(\"}\")) return true;\n const underscores = textBefore.match(/__/g);\n return !!underscores && underscores.length % 2 === 1;\n}\n\n/**\n * Word-style AutoCorrect with a configurable rule registry and exceptions\n * list. Each correction is its own undo step: undo (Mod-z) right after a\n * correction restores exactly what was typed. Corrections never apply inside\n * code blocks, inline code or (by default) prompt tokens.\n *\n * Do not combine with `@tiptap/extension-typography`: TipTap's input rules\n * run first and would pre-empt the overlapping rules. `createRichTextPreset`\n * drops Typography when `autocorrect` is enabled.\n */\nexport const Autocorrect = Extension.create<AutocorrectOptions, AutocorrectStorage>({\n name: \"autocorrect\",\n\n addOptions() {\n return {\n rules: defaultAutocorrectRules,\n exceptions: DEFAULT_AUTOCORRECT_EXCEPTIONS,\n ignoreNodes: [\"codeBlock\"],\n ignoreMarks: [\"code\"],\n ignorePromptTokens: true,\n onCorrection: undefined,\n };\n },\n\n addStorage() {\n return {\n enabled: true,\n exceptions: new Set(this.options.exceptions.map((e) => e.toLowerCase())),\n };\n },\n\n addCommands() {\n return {\n undoAutocorrect:\n () =>\n ({ state, tr, dispatch }) => {\n const last = autocorrectPluginKey.getState(state)?.last;\n if (!last) return false;\n if (state.doc.textBetween(last.from, last.to) !== last.replacement) return false;\n if (dispatch) {\n tr.insertText(last.original, last.from, last.to);\n tr.setMeta(autocorrectPluginKey, { undo: true });\n }\n return true;\n },\n setAutocorrectEnabled:\n (enabled) =>\n () => {\n this.storage.enabled = enabled;\n return true;\n },\n addAutocorrectException:\n (text) =>\n () => {\n this.storage.exceptions.add(text.toLowerCase());\n return true;\n },\n removeAutocorrectException:\n (text) =>\n () =>\n this.storage.exceptions.delete(text.toLowerCase()),\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n\n const isIgnored = (state: EditorState, from: number, to: number) => {\n const { ignoreNodes, ignoreMarks } = extension.options;\n const $from = state.doc.resolve(from);\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n if (node.type.spec.code || ignoreNodes.includes(node.type.name)) return true;\n }\n const isIgnoredMark = (mark: any) =>\n mark.type.spec.code || ignoreMarks.includes(mark.type.name);\n const marks = state.storedMarks ?? $from.marks();\n if (marks.some(isIgnoredMark)) return true;\n let ignored = false;\n if (to > from) {\n state.doc.nodesBetween(from, to, (node) => {\n if (node.marks.some(isIgnoredMark)) ignored = true;\n });\n }\n return ignored;\n };\n\n const handleTextInput = (view: EditorView, from: number, to: number, text: string) => {\n if (!extension.storage.enabled || view.composing) return false;\n const { state } = view;\n const pluginState = autocorrectPluginKey.getState(state);\n const $from = state.doc.resolve(from);\n if (!$from.parent.isTextblock || !$from.sameParent(state.doc.resolve(to))) {\n return false;\n }\n\n const insertTyped = () => {\n const tr = state.tr.insertText(text, from, to);\n if (pluginState?.closePending) closeHistory(tr);\n view.dispatch(tr);\n };\n\n if (isIgnored(state, from, to)) return false;\n const textBefore =\n $from.parent.textBetween(0, $from.parentOffset, undefined, \"\") + text;\n if (extension.options.ignorePromptTokens && isInsidePromptToken(textBefore)) {\n return false;\n }\n // Leave URLs alone.\n const currentWord = /\\S*$/.exec(textBefore)?.[0] ?? \"\";\n if (/:\\/\\/|^www\\./i.test(currentWord)) return false;\n\n const exceptions = extension.storage.exceptions;\n const found = findAutocorrection(textBefore, extension.options.rules, {\n state,\n isException: (value) => exceptions.has(value.toLowerCase()),\n });\n if (!found) {\n if (!pluginState?.closePending) return false;\n insertTyped();\n return true;\n }\n\n // Only replace the part that actually changes.\n let { original, replacement } = found;\n let start = found.start;\n let prefix = 0;\n while (\n prefix < original.length &&\n prefix < replacement.length &&\n original[prefix] === replacement[prefix]\n ) {\n prefix++;\n }\n let suffix = 0;\n while (\n suffix < original.length - prefix &&\n suffix < replacement.length - prefix &&\n original[original.length - 1 - suffix] === replacement[replacement.length - 1 - suffix]\n ) {\n suffix++;\n }\n start += prefix;\n original = original.slice(prefix, original.length - suffix);\n replacement = replacement.slice(prefix, replacement.length - suffix);\n const textEnd = textBefore.length - suffix;\n\n // 1. The typed text, as a normal edit (joins the current undo group).\n insertTyped();\n // 2. The correction, as its own undo group.\n const next = view.state;\n const blockStart = next.doc.resolve(from + text.length).start();\n const correctionFrom = blockStart + start;\n const correctionTo = blockStart + textEnd;\n if (\n next.doc.textBetween(correctionFrom, correctionTo, undefined, \"\") !== original ||\n isIgnored(next, correctionFrom, correctionTo)\n ) {\n return true;\n }\n const correction: AutocorrectCorrection = {\n ruleId: found.ruleId,\n from: correctionFrom,\n to: correctionFrom + replacement.length,\n original,\n replacement,\n };\n const tr = next.tr.insertText(replacement, correctionFrom, correctionTo);\n closeHistory(tr);\n tr.setMeta(autocorrectPluginKey, { correction });\n view.dispatch(tr);\n extension.options.onCorrection?.(correction);\n return true;\n };\n\n return [\n new Plugin<AutocorrectPluginState>({\n key: autocorrectPluginKey,\n state: {\n init: () => ({ last: null, closePending: false }),\n apply: (tr, prev) => {\n const meta = tr.getMeta(autocorrectPluginKey);\n if (meta?.correction) return { last: meta.correction, closePending: true };\n if (meta?.undo) return { last: null, closePending: true };\n if (!tr.docChanged) return prev;\n if (!prev.last && !prev.closePending) return prev;\n // Any other edit (including the next typed character, which\n // `handleTextInput` already put in a new undo group) ends the\n // window in which the correction can be reverted.\n return { last: null, closePending: false };\n },\n },\n props: { handleTextInput },\n }),\n ];\n },\n});\n","import { Extension, type Editor } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n type EditorState,\n type Transaction,\n} from \"@tiptap/pm/state\";\nimport {\n arraysEqual,\n generateStructureId,\n scrollDomAtPos,\n STRUCTURE_PRIORITY,\n syncInitialContent,\n} from \"./utils\";\n\n/**\n * A heading in the document outline, in document order.\n */\nexport interface OutlineHeading {\n /** Stable id stored on the heading node (`id` attribute). */\n id: string;\n /** Heading level (1-6). */\n level: number;\n /** Plain text of the heading. */\n text: string;\n /** Position of the heading node in the current document. */\n pos: number;\n /** Index of the heading in the outline. */\n index: number;\n /**\n * Nesting depth (0-based) relative to the enclosing headings, so skipped\n * levels (an h1 followed directly by an h3) only indent one step.\n */\n depth: number;\n}\n\n/**\n * A heading with its nested sub-headings.\n */\nexport interface OutlineTreeItem extends OutlineHeading {\n children: OutlineTreeItem[];\n}\n\nexport interface OutlineOptions {\n /** Node types treated as headings. Defaults to `[\"heading\"]`. */\n types: string[];\n /** Generates ids for headings that have none. */\n generateId: () => string;\n /** Called with the new outline whenever it changes. */\n onUpdate?: (headings: OutlineHeading[]) => void;\n}\n\nexport interface OutlineStorage {\n /** The latest outline. Prefer `getOutline(editor)` for a fresh read. */\n headings: OutlineHeading[];\n}\n\nexport interface FocusHeadingOptions {\n /** Scroll behaviour for the heading's DOM node. Defaults to `\"smooth\"`. */\n behavior?: ScrollBehavior;\n /** Whether to focus the editor and place the caret in the heading. Defaults to `true`. */\n focus?: boolean;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n outline: {\n /** Places the caret at the start of a heading, focuses and scrolls to it. */\n focusHeading: (id: string, options?: FocusHeadingOptions) => ReturnType;\n /** Scrolls a heading into view without moving the selection. */\n scrollToHeading: (\n id: string,\n options?: Omit<FocusHeadingOptions, \"focus\">,\n ) => ReturnType;\n };\n }\n}\n\nexport const outlinePluginKey = new PluginKey<OutlineHeading[]>(\"outline\");\nconst outlineIdPluginKey = new PluginKey(\"outlineIds\");\n\nconst sameHeading = (a: OutlineHeading, b: OutlineHeading) =>\n a.id === b.id &&\n a.level === b.level &&\n a.text === b.text &&\n a.pos === b.pos &&\n a.depth === b.depth;\n\n/**\n * Derives the heading outline from a document. Only block nodes are visited\n * (headings cannot nest inside text), so the cost is proportional to the number\n * of blocks, not characters.\n */\nexport function computeOutline(\n doc: ProsemirrorNode,\n types: readonly string[] = [\"heading\"],\n): OutlineHeading[] {\n const headings: OutlineHeading[] = [];\n const stack: number[] = [];\n doc.descendants((node, pos) => {\n if (types.includes(node.type.name)) {\n const level = Number(node.attrs.level) || 1;\n while (stack.length && stack[stack.length - 1] >= level) stack.pop();\n headings.push({\n id: node.attrs.id ?? `outline-${headings.length}`,\n level,\n text: node.textContent,\n pos,\n index: headings.length,\n depth: stack.length,\n });\n stack.push(level);\n return false;\n }\n // Text blocks never contain headings.\n return !node.isTextblock;\n });\n return headings;\n}\n\n/**\n * Nests a flat outline into a tree by heading level.\n */\nexport function buildOutlineTree(\n headings: readonly OutlineHeading[],\n): OutlineTreeItem[] {\n const root: OutlineTreeItem[] = [];\n const stack: OutlineTreeItem[] = [];\n for (const heading of headings) {\n const item: OutlineTreeItem = { ...heading, children: [] };\n while (stack.length && stack[stack.length - 1].level >= item.level) {\n stack.pop();\n }\n if (stack.length) stack[stack.length - 1].children.push(item);\n else root.push(item);\n stack.push(item);\n }\n return root;\n}\n\n/**\n * Returns the outline of an editor state. Uses the Outline plugin's cached\n * outline when the extension is installed, otherwise computes it.\n */\nexport function getOutline(\n editorOrState: Editor | EditorState,\n): OutlineHeading[] {\n const state: EditorState =\n \"state\" in editorOrState ? editorOrState.state : editorOrState;\n return outlinePluginKey.getState(state) ?? computeOutline(state.doc);\n}\n\n/**\n * Returns the heading whose section contains the selection head: the last\n * heading starting at or before it.\n */\nexport function getActiveHeading(\n editorOrState: Editor | EditorState,\n headings: readonly OutlineHeading[] = getOutline(editorOrState),\n): OutlineHeading | null {\n const state: EditorState =\n \"state\" in editorOrState ? editorOrState.state : editorOrState;\n const head = state.selection.from;\n let lo = 0;\n let hi = headings.length - 1;\n let found: OutlineHeading | null = null;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (headings[mid].pos <= head) {\n found = headings[mid];\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return found;\n}\n\n/**\n * Finds a heading in the current outline by id.\n */\nfunction findHeading(state: EditorState, id: string) {\n return getOutline(state).find((h) => h.id === id) ?? null;\n}\n\n/**\n * Snapshot of the outline for UI bindings. Snapshots are immutable and only\n * replaced when the outline or the active heading changes, so they can be used\n * directly with `useSyncExternalStore` or Svelte state.\n */\nexport interface OutlineSnapshot {\n headings: OutlineHeading[];\n tree: OutlineTreeItem[];\n activeId: string | null;\n}\n\nconst EMPTY_SNAPSHOT: OutlineSnapshot = Object.freeze({\n headings: [],\n tree: [],\n activeId: null,\n}) as OutlineSnapshot;\n\nexport interface OutlineStore {\n getSnapshot: () => OutlineSnapshot;\n subscribe: (listener: () => void) => () => void;\n destroy: () => void;\n}\n\n/**\n * Creates an observable outline store for an editor, shared by the React and\n * Svelte outline panels.\n */\nexport function createOutlineStore(editor: Editor | null | undefined): OutlineStore {\n const listeners = new Set<() => void>();\n let snapshot = EMPTY_SNAPSHOT;\n\n const compute = () => {\n if (!editor || editor.isDestroyed) return EMPTY_SNAPSHOT;\n const headings = getOutline(editor);\n const activeId = getActiveHeading(editor, headings)?.id ?? null;\n const sameStructure = arraysEqual(snapshot.headings, headings, sameHeading);\n if (sameStructure && snapshot.activeId === activeId) return snapshot;\n return {\n headings: sameStructure ? snapshot.headings : headings,\n tree: sameStructure ? snapshot.tree : buildOutlineTree(headings),\n activeId,\n };\n };\n\n snapshot = compute();\n\n const onTransaction = () => {\n const next = compute();\n if (next !== snapshot) {\n snapshot = next;\n listeners.forEach((l) => l());\n }\n };\n\n // The editor listener is only attached while someone is subscribed, so a\n // store that is created but never subscribed (e.g. a discarded React render)\n // does not leak.\n return {\n getSnapshot: () => {\n if (!listeners.size) snapshot = compute();\n return snapshot;\n },\n subscribe(listener) {\n if (!listeners.size) {\n snapshot = compute();\n editor?.on(\"transaction\", onTransaction);\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (!listeners.size) editor?.off(\"transaction\", onTransaction);\n };\n },\n destroy() {\n editor?.off(\"transaction\", onTransaction);\n listeners.clear();\n },\n };\n}\n\n/**\n * Moves the caret to the start of a heading, focuses the editor and scrolls the\n * heading into view. Works with or without the Outline extension installed.\n */\nexport function navigateToHeading(\n editor: Editor,\n heading: Pick<OutlineHeading, \"id\" | \"pos\">,\n options: FocusHeadingOptions = {},\n): boolean {\n if (!editor || editor.isDestroyed) return false;\n const current =\n findHeading(editor.state, heading.id) ??\n getOutline(editor).find((h) => h.pos === heading.pos);\n if (!current) return false;\n const { focus = true, behavior = \"smooth\" } = options;\n if (focus) {\n const tr = editor.state.tr\n .setSelection(TextSelection.create(editor.state.doc, current.pos + 1))\n .scrollIntoView();\n editor.view.dispatch(tr);\n editor.view.focus();\n }\n scrollDomAtPos(editor.view, current.pos, behavior);\n return true;\n}\n\n/**\n * Assigns ids to headings that have none, and re-ids duplicates (created by\n * splitting a heading or pasting a copy of one).\n */\nfunction assignHeadingIds(\n state: EditorState,\n types: readonly string[],\n generateId: () => string,\n): Transaction | null {\n const seen = new Set<string>();\n let tr: Transaction | null = null;\n state.doc.descendants((node, pos) => {\n if (types.includes(node.type.name)) {\n let id = node.attrs.id as string | null;\n if (!id || seen.has(id)) {\n do {\n id = generateId();\n } while (seen.has(id));\n tr = tr ?? state.tr;\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, id });\n }\n seen.add(id);\n return false;\n }\n return !node.isTextblock;\n });\n return tr;\n}\n\n/**\n * Headless document outline. Gives every heading a stable `id` attribute\n * (rendered as the HTML `id`, so `#id` links work in exported HTML) and keeps\n * an up-to-date outline in plugin state. Read it with `getOutline(editor)` or\n * observe it with `createOutlineStore(editor)`.\n */\nexport const Outline = Extension.create<OutlineOptions, OutlineStorage>({\n name: \"outline\",\n priority: STRUCTURE_PRIORITY,\n\n addOptions() {\n return {\n types: [\"heading\"],\n generateId: () => generateStructureId(\"h\"),\n onUpdate: undefined,\n };\n },\n\n addStorage() {\n return { headings: [] };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n id: {\n default: null,\n keepOnSplit: false,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"id\") || element.getAttribute(\"data-id\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.id ? { id: attributes.id } : {},\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n focusHeading:\n (id, options = {}) =>\n ({ state, tr, dispatch, view }) => {\n const heading = findHeading(state, id);\n if (!heading) return false;\n if (dispatch) {\n if (options.focus !== false) {\n tr.setSelection(TextSelection.create(tr.doc, heading.pos + 1));\n tr.scrollIntoView();\n view?.focus?.();\n }\n scrollDomAtPos(view, heading.pos, options.behavior);\n }\n return true;\n },\n scrollToHeading:\n (id, options = {}) =>\n ({ state, dispatch, view }) => {\n const heading = findHeading(state, id);\n if (!heading) return false;\n if (dispatch) scrollDomAtPos(view, heading.pos, options.behavior);\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const { types, generateId } = this.options;\n const storage = this.storage;\n const onUpdate = () => this.options.onUpdate;\n\n return [\n new Plugin<OutlineHeading[]>({\n key: outlinePluginKey,\n state: {\n init: (_config, state) => {\n const headings = computeOutline(state.doc, types);\n storage.headings = headings;\n return headings;\n },\n apply: (tr, prev, _oldState, newState) => {\n if (!tr.docChanged) return prev;\n const next = computeOutline(newState.doc, types);\n if (arraysEqual(prev, next, sameHeading)) return prev;\n storage.headings = next;\n onUpdate()?.(next);\n return next;\n },\n },\n }),\n new Plugin({\n key: outlineIdPluginKey,\n appendTransaction: (transactions, _oldState, newState) => {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n return assignHeadingIds(newState, types, generateId);\n },\n }),\n ];\n },\n\n onBeforeCreate() {\n const { types, generateId } = this.options;\n syncInitialContent(this.editor, (state) => assignHeadingIds(state, types, generateId));\n },\n});\n","import { createDocument, type Editor } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport { EditorState, type Transaction } from \"@tiptap/pm/state\";\nimport { ReplaceAroundStep, ReplaceStep } from \"@tiptap/pm/transform\";\n\nlet idCounter = 0;\n\n/**\n * Generates a short, document-unique-enough id (`prefix-xxxxxxxx`). Ids are\n * stored in the document, so they must not depend on positions or text.\n */\nexport function generateStructureId(prefix: string): string {\n idCounter = (idCounter + 1) % 1296;\n const random = Math.random().toString(36).slice(2, 8).padEnd(6, \"0\");\n return `${prefix}-${random}${idCounter.toString(36).padStart(2, \"0\")}`;\n}\n\n/**\n * Returns true if any transaction inserted content containing one of the given\n * node or mark type names. Used to skip whole-document scans for transactions\n * that cannot have introduced the nodes a plugin tracks.\n */\nexport function transactionsInsert(\n transactions: readonly Transaction[],\n typeNames: readonly string[],\n): boolean {\n for (const tr of transactions) {\n for (const step of tr.steps) {\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n // Mark and attribute steps can add bookmarks or retarget nodes.\n const mark = (step as any).mark;\n if (mark && typeNames.includes(mark.type.name)) return true;\n continue;\n }\n let found = false;\n step.slice.content.descendants((node) => {\n if (found) return false;\n if (\n typeNames.includes(node.type.name) ||\n node.marks.some((m) => typeNames.includes(m.type.name))\n ) {\n found = true;\n }\n return !found;\n });\n if (found) return true;\n }\n }\n return false;\n}\n\n/**\n * Returns true if the document contains a node (or mark) of one of the types.\n */\nexport function docContains(\n doc: ProsemirrorNode,\n typeNames: readonly string[],\n): boolean {\n let found = false;\n doc.descendants((node) => {\n if (found) return false;\n if (\n typeNames.includes(node.type.name) ||\n node.marks.some((m) => typeNames.includes(m.type.name))\n ) {\n found = true;\n }\n return !found;\n });\n return found;\n}\n\n/**\n * Plugin state spec that tracks whether the document contains any of the given\n * node or mark types. A document without them is only rescanned when a\n * transaction inserts one, so plugins can skip their sync pass cheaply.\n */\nexport function presenceStateSpec(typeNames: readonly string[]) {\n return {\n init: (_config: unknown, state: EditorState) =>\n docContains(state.doc, typeNames),\n apply: (\n tr: Transaction,\n present: boolean,\n _oldState: EditorState,\n newState: EditorState,\n ) => {\n if (!tr.docChanged) return present;\n if (!present && !transactionsInsert([tr], typeNames)) return false;\n return docContains(newState.doc, typeNames);\n },\n };\n}\n\n/**\n * Shallow array equality using a per-item comparator.\n */\nexport function arraysEqual<T>(\n a: readonly T[],\n b: readonly T[],\n eq: (x: T, y: T) => boolean,\n): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!eq(a[i], b[i])) return false;\n }\n return true;\n}\n\n/**\n * Scrolls the DOM node at a document position into view, if the editor is\n * mounted in a browser. Errors from detached or headless views are ignored.\n */\nexport function scrollDomAtPos(\n view: any,\n pos: number,\n behavior: ScrollBehavior = \"smooth\",\n): void {\n try {\n const dom = view?.nodeDOM?.(pos) as HTMLElement | null;\n if (dom && typeof dom.scrollIntoView === \"function\") {\n dom.scrollIntoView({ block: \"start\", behavior });\n }\n } catch {\n // Headless editors (no DOM) cannot scroll.\n }\n}\n\n/**\n * Applies a sync pass to the editor's initial content. `appendTransaction`\n * does not run for the initial document and TipTap's `create` event fires\n * asynchronously, so derived state (heading ids, TOC entries, footnote\n * numbers) is computed in `onBeforeCreate` instead: the content is parsed,\n * fixed, and handed back to TipTap as a node. Extensions calling this must\n * have a priority below the Markdown extension's (50), so that markdown\n * content has already been converted to HTML.\n */\nexport function syncInitialContent(\n editor: Editor,\n sync: (state: EditorState) => Transaction | null,\n): void {\n const { content } = editor.options;\n if (content == null || content === \"\") return;\n try {\n const doc = createDocument(content as any, editor.schema, editor.options.parseOptions, {\n errorOnInvalidContent: false,\n });\n const tr = sync(EditorState.create({ doc }));\n if (tr?.docChanged) editor.options.content = tr.doc as any;\n } catch {\n // Leave invalid content to TipTap's own handling.\n }\n}\n\n/** Priority for extensions that use `syncInitialContent` (below Markdown's 50). */\nexport const STRUCTURE_PRIORITY = 45;\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n type EditorState,\n type Transaction,\n} from \"@tiptap/pm/state\";\nimport { computeOutline, outlinePluginKey, type OutlineHeading } from \"./outline\";\nimport { tableOfContentsMarkdownIt } from \"./markdown-it\";\nimport {\n arraysEqual,\n presenceStateSpec,\n scrollDomAtPos,\n STRUCTURE_PRIORITY,\n syncInitialContent,\n} from \"./utils\";\n\n/**\n * An entry rendered by a table of contents node.\n */\nexport interface TableOfContentsEntry {\n id: string | null;\n level: number;\n text: string;\n depth: number;\n}\n\nexport interface TableOfContentsOptions {\n HTMLAttributes: Record<string, any>;\n /** Heading node types to list. Defaults to `[\"heading\"]`. */\n headingTypes: string[];\n /** Default title for newly inserted tables of contents. */\n defaultTitle: string;\n /** Text shown when the document has no headings. */\n emptyText: string;\n}\n\nexport interface InsertTableOfContentsOptions {\n title?: string;\n minLevel?: number;\n maxLevel?: number;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n tableOfContents: {\n /** Inserts a table of contents block at the selection. */\n insertTableOfContents: (\n options?: InsertTableOfContentsOptions,\n ) => ReturnType;\n };\n }\n}\n\nexport const tableOfContentsPluginKey = new PluginKey<boolean>(\"tableOfContents\");\n\nconst sameEntry = (a: TableOfContentsEntry, b: TableOfContentsEntry) =>\n a.id === b.id && a.level === b.level && a.text === b.text && a.depth === b.depth;\n\n/**\n * Builds table of contents entries from an outline, limited to a level range.\n * Depth is recomputed within the range so the shallowest listed level is 0.\n */\nexport function getTableOfContentsEntries(\n headings: readonly OutlineHeading[],\n minLevel = 1,\n maxLevel = 6,\n): TableOfContentsEntry[] {\n const entries: TableOfContentsEntry[] = [];\n const stack: number[] = [];\n for (const heading of headings) {\n if (heading.level < minLevel || heading.level > maxLevel) continue;\n while (stack.length && stack[stack.length - 1] >= heading.level) stack.pop();\n entries.push({\n // Fallback ids (`outline-n`) are not stored on the heading, so they\n // cannot be linked to.\n id: heading.id.startsWith(\"outline-\") ? null : heading.id,\n level: heading.level,\n text: heading.text,\n depth: stack.length,\n });\n stack.push(heading.level);\n }\n return entries;\n}\n\nfunction syncTableOfContents(\n state: EditorState,\n headingTypes: readonly string[],\n): Transaction | null {\n const headings =\n outlinePluginKey.getState(state) ?? computeOutline(state.doc, headingTypes);\n let tr: Transaction | null = null;\n state.doc.descendants((node, pos) => {\n if (node.type.name === \"tableOfContents\") {\n const entries = getTableOfContentsEntries(\n headings,\n node.attrs.minLevel,\n node.attrs.maxLevel,\n );\n if (!arraysEqual(node.attrs.entries ?? [], entries, sameEntry)) {\n tr = tr ?? state.tr;\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, entries });\n }\n return false;\n }\n return !node.isTextblock;\n });\n return tr;\n}\n\n/**\n * Table of contents block. An atom node whose entries mirror the document's\n * headings; they are refreshed on every document change, so exported HTML\n * always contains the current, linked list. Install the `Outline` extension\n * alongside it so headings get stable ids to link to.\n *\n * Markdown: serialized as a `[[toc]]` line and parsed back from `[[toc]]` or\n * `[TOC]`.\n */\nexport const TableOfContents = Node.create<TableOfContentsOptions>({\n name: \"tableOfContents\",\n priority: STRUCTURE_PRIORITY - 5,\n group: \"block\",\n atom: true,\n selectable: true,\n draggable: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n headingTypes: [\"heading\"],\n defaultTitle: \"Contents\",\n emptyText: \"Add headings to build the table of contents.\",\n };\n },\n\n addAttributes() {\n return {\n title: {\n default: this.options.defaultTitle,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-title\") ?? this.options.defaultTitle,\n renderHTML: (attributes: Record<string, any>) => ({\n \"data-title\": attributes.title,\n }),\n },\n minLevel: {\n default: 1,\n parseHTML: (element: HTMLElement) =>\n Number(element.getAttribute(\"data-min-level\")) || 1,\n renderHTML: (attributes: Record<string, any>) => ({\n \"data-min-level\": attributes.minLevel,\n }),\n },\n maxLevel: {\n default: 3,\n parseHTML: (element: HTMLElement) =>\n Number(element.getAttribute(\"data-max-level\")) || 3,\n renderHTML: (attributes: Record<string, any>) => ({\n \"data-max-level\": attributes.maxLevel,\n }),\n },\n entries: {\n default: [],\n rendered: false,\n // Entries are derived from the headings and recomputed after parsing.\n parseHTML: () => [],\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'nav[data-type=\"table-of-contents\"]', priority: 60 }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const entries: TableOfContentsEntry[] = node.attrs.entries ?? [];\n const list = entries.length\n ? [\n \"ol\",\n { class: \"toc-list\" },\n ...entries.map((entry) => [\n \"li\",\n {\n class: \"toc-entry\",\n \"data-level\": entry.level,\n \"data-depth\": entry.depth,\n style: `margin-left: ${entry.depth * 1.25}em`,\n },\n entry.id\n ? [\"a\", { href: `#${entry.id}`, \"data-heading-id\": entry.id }, entry.text]\n : [\"span\", {}, entry.text],\n ]),\n ]\n : [\"p\", { class: \"toc-empty\" }, this.options.emptyText];\n\n return [\n \"nav\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"table-of-contents\",\n \"aria-label\": node.attrs.title || \"Table of contents\",\n class: \"pixerate-toc\",\n }),\n [\"p\", { class: \"toc-title\" }, node.attrs.title ?? \"\"],\n list,\n ];\n },\n\n renderText({ node }) {\n const entries: TableOfContentsEntry[] = node.attrs.entries ?? [];\n return [node.attrs.title, ...entries.map((e) => `${\" \".repeat(e.depth)}${e.text}`)]\n .filter(Boolean)\n .join(\"\\n\");\n },\n\n addStorage() {\n return {\n markdown: {\n serialize(state: any, node: any) {\n state.write(\"[[toc]]\");\n state.closeBlock(node);\n },\n parse: {\n setup(markdownit: any) {\n tableOfContentsMarkdownIt(markdownit);\n },\n },\n },\n };\n },\n\n addCommands() {\n return {\n insertTableOfContents:\n (options = {}) =>\n ({ commands }) =>\n commands.insertContent({\n type: this.name,\n attrs: {\n title: options.title ?? this.options.defaultTitle,\n minLevel: options.minLevel ?? 1,\n maxLevel: options.maxLevel ?? 3,\n },\n }),\n };\n },\n\n addProseMirrorPlugins() {\n const { headingTypes } = this.options;\n const editor = this.editor;\n return [\n new Plugin<boolean>({\n key: tableOfContentsPluginKey,\n state: presenceStateSpec([this.name]),\n appendTransaction: (transactions, _oldState, newState) => {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n if (!tableOfContentsPluginKey.getState(newState)) return null;\n return syncTableOfContents(newState, headingTypes);\n },\n props: {\n handleDOMEvents: {\n click: (view, event) => {\n const target = event.target as HTMLElement | null;\n const link = target?.closest?.(\n 'nav[data-type=\"table-of-contents\"] a[data-heading-id]',\n );\n if (!link) return false;\n event.preventDefault();\n const id = link.getAttribute(\"data-heading-id\");\n const heading = (\n outlinePluginKey.getState(view.state) ??\n computeOutline(view.state.doc, headingTypes)\n ).find((h) => h.id === id);\n if (!heading) return true;\n if (editor.isEditable) {\n view.dispatch(\n view.state.tr\n .setSelection(TextSelection.create(view.state.doc, heading.pos + 1))\n .scrollIntoView(),\n );\n view.focus();\n }\n scrollDomAtPos(view, heading.pos);\n return true;\n },\n },\n },\n }),\n ];\n },\n\n onBeforeCreate() {\n const { headingTypes } = this.options;\n syncInitialContent(this.editor, (state) => syncTableOfContents(state, headingTypes));\n },\n});\n","/**\n * markdown-it plugins used by the document-structure extensions' markdown\n * parse hooks (tiptap-markdown). tiptap-markdown calls every extension's\n * `parse.setup` before *each* parse on the same markdown-it instance, so the\n * plugins guard against registering their rules twice.\n */\n\nconst installed = new WeakMap<object, Set<string>>();\n\nfunction once(md: any, name: string): boolean {\n let names = installed.get(md);\n if (!names) {\n names = new Set();\n installed.set(md, names);\n }\n if (names.has(name)) return false;\n names.add(name);\n return true;\n}\n\nconst escapeAttr = (value: string) =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n\nconst TOC_LINE = /^(?:\\[\\[toc\\]\\]|\\[toc\\])\\s*$/i;\n\n/**\n * Parses a line containing only `[[toc]]` (or `[TOC]`) into a table of\n * contents placeholder that the `TableOfContents` node parses.\n */\nexport function tableOfContentsMarkdownIt(md: any): void {\n if (!once(md, \"toc\")) return;\n md.block.ruler.before(\n \"reference\",\n \"pixerate_toc\",\n (state: any, startLine: number, _endLine: number, silent: boolean) => {\n if (state.sCount[startLine] - state.blkIndent >= 4) return false;\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const line = state.src.slice(start, state.eMarks[startLine]);\n if (!TOC_LINE.test(line)) return false;\n if (silent) return true;\n const token = state.push(\"pixerate_toc\", \"nav\", 0);\n token.block = true;\n token.map = [startLine, startLine + 1];\n state.line = startLine + 1;\n return true;\n },\n { alt: [\"paragraph\", \"reference\"] },\n );\n md.renderer.rules.pixerate_toc = () =>\n '<nav data-type=\"table-of-contents\"></nav>\\n';\n}\n\nconst FOOTNOTE_DEF = /^\\[\\^([^\\]\\s]+)\\]:[ \\t]?(.*)$/;\n\n/**\n * Minimal footnote syntax: `[^label]` references and `[^label]: text`\n * definitions (continuation paragraphs indented by four spaces). Renders the\n * HTML the `FootnoteReference`, `Footnotes` and `Footnote` nodes parse.\n */\nexport function footnotesMarkdownIt(md: any): void {\n if (!once(md, \"footnotes\")) return;\n\n md.block.ruler.before(\n \"reference\",\n \"pixerate_footnote_def\",\n (state: any, startLine: number, endLine: number, silent: boolean) => {\n if (state.sCount[startLine] - state.blkIndent >= 4) return false;\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const match = FOOTNOTE_DEF.exec(\n state.src.slice(start, state.eMarks[startLine]),\n );\n if (!match) return false;\n if (silent) return true;\n\n const paragraphs: string[][] = [[match[2]]];\n let lastContentLine = startLine;\n let pendingBlank = false;\n for (let line = startLine + 1; line < endLine; line++) {\n const lineStart = state.bMarks[line] + state.tShift[line];\n const lineEnd = state.eMarks[line];\n if (lineStart >= lineEnd) {\n pendingBlank = true;\n continue;\n }\n if (state.sCount[line] - state.blkIndent < 4) break;\n const text = state.src.slice(lineStart, lineEnd);\n if (pendingBlank) paragraphs.push([text]);\n else paragraphs[paragraphs.length - 1].push(text);\n pendingBlank = false;\n lastContentLine = line;\n }\n\n const open = state.push(\"pixerate_footnote_open\", \"li\", 1);\n open.meta = { label: match[1] };\n open.block = true;\n open.map = [startLine, lastContentLine + 1];\n for (const paragraph of paragraphs) {\n state.push(\"paragraph_open\", \"p\", 1).block = true;\n const inline = state.push(\"inline\", \"\", 0);\n inline.content = paragraph.join(\"\\n\").trim();\n inline.map = [startLine, lastContentLine + 1];\n inline.children = [];\n state.push(\"paragraph_close\", \"p\", -1).block = true;\n }\n state.push(\"pixerate_footnote_close\", \"li\", -1).block = true;\n state.line = lastContentLine + 1;\n return true;\n },\n { alt: [\"paragraph\", \"reference\"] },\n );\n\n md.inline.ruler.before(\"link\", \"pixerate_footnote_ref\", (state: any, silent: boolean) => {\n const { src, pos, posMax } = state;\n if (src.charCodeAt(pos) !== 0x5b /* [ */ || src.charCodeAt(pos + 1) !== 0x5e /* ^ */) {\n return false;\n }\n let end = pos + 2;\n while (end < posMax && src.charCodeAt(end) !== 0x5d /* ] */) {\n if (/\\s/.test(src[end])) return false;\n end++;\n }\n if (end >= posMax || end === pos + 2) return false;\n if (!silent) {\n const token = state.push(\"pixerate_footnote_ref\", \"sup\", 0);\n token.meta = { label: src.slice(pos + 2, end) };\n }\n state.pos = end + 1;\n return true;\n });\n\n md.renderer.rules.pixerate_footnote_ref = (tokens: any[], idx: number) => {\n const label = escapeAttr(tokens[idx].meta.label);\n return `<sup data-type=\"footnote-reference\" data-id=\"${label}\">${label}</sup>`;\n };\n md.renderer.rules.pixerate_footnote_open = (tokens: any[], idx: number) => {\n const label = escapeAttr(tokens[idx].meta.label);\n return `<section data-type=\"footnotes\"><ol><li data-type=\"footnote\" data-id=\"${label}\">`;\n };\n md.renderer.rules.pixerate_footnote_close = () => \"</li></ol></section>\\n\";\n}\n\n/**\n * Merges the one-per-definition footnote sections produced by\n * `footnotesMarkdownIt` into a single section at the end of the document.\n */\nexport function mergeFootnoteSections(element: HTMLElement): void {\n const sections = Array.from(\n element.querySelectorAll('section[data-type=\"footnotes\"]'),\n );\n if (!sections.length) return;\n const [first, ...rest] = sections;\n const list = first.querySelector(\"ol\");\n if (!list) return;\n for (const section of rest) {\n section.querySelectorAll('li[data-type=\"footnote\"]').forEach((li) => list.appendChild(li));\n section.remove();\n }\n element.appendChild(first);\n}\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode, Schema } from \"@tiptap/pm/model\";\nimport {\n NodeSelection,\n Plugin,\n PluginKey,\n TextSelection,\n type EditorState,\n type Transaction,\n} from \"@tiptap/pm/state\";\nimport { footnotesMarkdownIt, mergeFootnoteSections } from \"./markdown-it\";\nimport {\n generateStructureId,\n presenceStateSpec,\n scrollDomAtPos,\n STRUCTURE_PRIORITY,\n syncInitialContent,\n} from \"./utils\";\n\n/**\n * A footnote as listed by `getFootnotes`.\n */\nexport interface FootnoteInfo {\n id: string;\n /** 1-based number, in document order of the references. */\n number: number;\n /** Plain text of the footnote content (paragraphs joined by blank lines). */\n text: string;\n /** Position of the reference node. */\n referencePos: number;\n /** Position of the footnote node in the footnotes list, if present. */\n footnotePos: number | null;\n}\n\nexport interface FootnotesOptions {\n HTMLAttributes: Record<string, any>;\n /** Generates ids for new footnotes. */\n generateId: () => string;\n}\n\nexport interface InsertFootnoteOptions {\n /** Plain-text content. Blank lines separate paragraphs. */\n content?: string;\n /** Explicit id; generated when omitted. */\n id?: string;\n /**\n * Move the caret into the new footnote (Word's behaviour). Defaults to `true`\n * when no `content` is given.\n */\n focusContent?: boolean;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n footnotes: {\n /** Inserts a footnote reference at the selection, plus its footnote. */\n insertFootnote: (options?: InsertFootnoteOptions) => ReturnType;\n /** Replaces a footnote's content with plain text. */\n updateFootnote: (id: string, content: string) => ReturnType;\n /** Removes a footnote and its reference. */\n deleteFootnote: (id: string) => ReturnType;\n /** Moves the caret into a footnote's content. */\n goToFootnote: (id: string) => ReturnType;\n /** Selects a footnote's reference in the body text. */\n goToFootnoteReference: (id: string) => ReturnType;\n };\n }\n}\n\nexport const footnotesPluginKey = new PluginKey<boolean>(\"footnotes\");\n\nconst REFERENCE = \"footnoteReference\";\nconst LIST = \"footnotes\";\nconst ITEM = \"footnote\";\n\nfunction paragraphsFromText(schema: Schema, text: string): ProsemirrorNode[] {\n const parts = text.split(/\\n\\s*\\n/);\n return parts.map((part) =>\n schema.nodes.paragraph.create(null, part ? schema.text(part) : undefined),\n );\n}\n\nfunction footnoteText(node: ProsemirrorNode): string {\n const parts: string[] = [];\n node.forEach((child) => parts.push(child.textContent));\n return parts.join(\"\\n\\n\");\n}\n\n/**\n * Lists the footnotes of a document in reference order.\n */\nexport function getFootnotes(doc: ProsemirrorNode): FootnoteInfo[] {\n const footnotes = new Map<string, { node: ProsemirrorNode; pos: number }>();\n const refs: { id: string; pos: number }[] = [];\n doc.descendants((node, pos) => {\n if (node.type.name === LIST) {\n node.forEach((child, offset) => {\n if (child.type.name === ITEM && !footnotes.has(child.attrs.id)) {\n footnotes.set(child.attrs.id, { node: child, pos: pos + 1 + offset });\n }\n });\n return false;\n }\n if (node.type.name === REFERENCE) refs.push({ id: node.attrs.id, pos });\n return true;\n });\n return refs.map((ref, index) => {\n const footnote = footnotes.get(ref.id);\n return {\n id: ref.id,\n number: index + 1,\n text: footnote ? footnoteText(footnote.node) : \"\",\n referencePos: ref.pos,\n footnotePos: footnote?.pos ?? null,\n };\n });\n}\n\n/**\n * Brings the footnotes list in line with the references: one footnote per\n * reference, in reference order, numbered 1..n, in a single list that is the\n * last child of the document. Orphaned footnotes are dropped, missing ones are\n * created (empty, or with `contents[id]`), and duplicated references (from\n * copy/paste) get a new id with a copy of the original footnote.\n *\n * Returns true if the transaction was modified.\n */\nexport function syncFootnotes(\n tr: Transaction,\n options: {\n generateId?: () => string;\n contents?: Record<string, string>;\n } = {},\n): boolean {\n const schema = tr.doc.type.schema;\n const listType = schema.nodes[LIST];\n const itemType = schema.nodes[ITEM];\n if (!listType || !itemType) return false;\n const generateId = options.generateId ?? (() => generateStructureId(\"fn\"));\n\n const refs: { node: ProsemirrorNode; pos: number }[] = [];\n const lists: { node: ProsemirrorNode; pos: number }[] = [];\n const existing = new Map<string, ProsemirrorNode>();\n tr.doc.descendants((node, pos) => {\n if (node.type === listType) {\n lists.push({ node, pos });\n node.forEach((child) => {\n if (child.type === itemType && !existing.has(child.attrs.id)) {\n existing.set(child.attrs.id, child);\n }\n });\n return false;\n }\n if (node.type.name === REFERENCE) refs.push({ node, pos });\n return true;\n });\n\n // Desired state.\n const seen = new Set<string>();\n const desiredRefs: { pos: number; id: string; number: number; copyOf?: string }[] = [];\n refs.forEach((ref, index) => {\n let id: string = ref.node.attrs.id;\n let copyOf: string | undefined;\n if (!id || seen.has(id)) {\n copyOf = id || undefined;\n do {\n id = generateId();\n } while (seen.has(id) || existing.has(id));\n }\n seen.add(id);\n desiredRefs.push({ pos: ref.pos, id, number: index + 1, copyOf });\n });\n\n const desiredItems = desiredRefs.map(({ id, number, copyOf }) => {\n const source = existing.get(id) ?? (copyOf ? existing.get(copyOf) : undefined);\n const content =\n source?.content ??\n paragraphsFromText(schema, options.contents?.[id] ?? \"\");\n if (\n source &&\n source.attrs.id === id &&\n source.attrs.number === number\n ) {\n return source;\n }\n return itemType.create({ id, number }, content);\n });\n\n // Is the document already in sync?\n const refsInSync = desiredRefs.every(\n (d, i) =>\n refs[i].node.attrs.id === d.id && refs[i].node.attrs.number === d.number,\n );\n const lastChild = tr.doc.lastChild;\n const listInSync = desiredItems.length\n ? lists.length === 1 &&\n lastChild === lists[0].node &&\n lists[0].node.childCount === desiredItems.length &&\n desiredItems.every((item, i) => lists[0].node.child(i) === item)\n : lists.length === 0;\n if (refsInSync && listInSync) return false;\n\n // Attribute changes keep node sizes, so reference positions stay valid.\n desiredRefs.forEach((d, i) => {\n const node = refs[i].node;\n if (node.attrs.id !== d.id || node.attrs.number !== d.number) {\n tr.setNodeMarkup(d.pos, undefined, { ...node.attrs, id: d.id, number: d.number });\n }\n });\n\n if (!listInSync) {\n for (let i = lists.length - 1; i >= 0; i--) {\n tr.delete(lists[i].pos, lists[i].pos + lists[i].node.nodeSize);\n }\n if (desiredItems.length) {\n tr.insert(tr.doc.content.size, listType.create(null, desiredItems));\n }\n }\n return true;\n}\n\nfunction findFootnote(doc: ProsemirrorNode, id: string) {\n let found: { node: ProsemirrorNode; pos: number } | null = null;\n doc.descendants((node, pos) => {\n if (found) return false;\n if (node.type.name === ITEM && node.attrs.id === id) {\n found = { node, pos };\n return false;\n }\n return true;\n });\n return found as { node: ProsemirrorNode; pos: number } | null;\n}\n\nfunction findReferences(doc: ProsemirrorNode, id: string) {\n const refs: { node: ProsemirrorNode; pos: number }[] = [];\n doc.descendants((node, pos) => {\n if (node.type.name === LIST) return false;\n if (node.type.name === REFERENCE && node.attrs.id === id) refs.push({ node, pos });\n return true;\n });\n return refs;\n}\n\n/**\n * Inline footnote reference, auto-numbered in document order. Its content\n * lives in a `footnote` item of the `footnotes` list at the end of the\n * document, which is created, renumbered, reordered and pruned automatically.\n *\n * Markdown: serialized as `[^n]` with `[^n]: text` definitions, and parsed\n * back when the Markdown extension is installed.\n */\nexport const FootnoteReference = Node.create<FootnotesOptions>({\n name: REFERENCE,\n priority: STRUCTURE_PRIORITY - 5,\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n generateId: () => generateStructureId(\"fn\"),\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.id ? { \"data-id\": attributes.id } : {},\n },\n number: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n Number(element.getAttribute(\"data-number\")) || null,\n renderHTML: (attributes: Record<string, any>) =>\n attributes.number ? { \"data-number\": attributes.number } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'sup[data-type=\"footnote-reference\"]', priority: 60 }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const id = node.attrs.id;\n return [\n \"sup\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"footnote-reference\",\n class: \"pixerate-footnote-ref\",\n ...(id ? { id: `fnref-${id}` } : {}),\n }),\n [\"a\", id ? { href: `#fn-${id}` } : {}, String(node.attrs.number ?? \"\")],\n ];\n },\n\n renderText({ node }) {\n return `[${node.attrs.number ?? \"\"}]`;\n },\n\n addStorage() {\n return {\n markdown: {\n serialize(state: any, node: any) {\n state.write(`[^${node.attrs.number ?? node.attrs.id}]`);\n },\n parse: {\n setup(markdownit: any) {\n footnotesMarkdownIt(markdownit);\n },\n updateDOM(element: HTMLElement) {\n mergeFootnoteSections(element);\n },\n },\n },\n };\n },\n\n addCommands() {\n return {\n insertFootnote:\n (options = {}) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.nodes[REFERENCE];\n if (!type || !state.schema.nodes[ITEM]) return false;\n const { $from } = state.selection;\n // Footnotes cannot contain footnotes.\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === LIST) return false;\n }\n if (!$from.parent.inlineContent) return false;\n if (!dispatch) return true;\n\n const id = options.id ?? this.options.generateId();\n tr.replaceSelectionWith(type.create({ id }), false);\n syncFootnotes(tr, {\n generateId: this.options.generateId,\n contents: options.content ? { [id]: options.content } : undefined,\n });\n const focusContent = options.focusContent ?? !options.content;\n if (focusContent) {\n const footnote = findFootnote(tr.doc, id);\n if (footnote) {\n tr.setSelection(TextSelection.create(tr.doc, footnote.pos + 2));\n }\n }\n tr.scrollIntoView();\n return true;\n },\n\n updateFootnote:\n (id, content) =>\n ({ state, tr, dispatch }) => {\n const footnote = findFootnote(state.doc, id);\n if (!footnote) return false;\n if (dispatch) {\n tr.replaceWith(\n footnote.pos + 1,\n footnote.pos + footnote.node.nodeSize - 1,\n paragraphsFromText(state.schema, content),\n );\n }\n return true;\n },\n\n deleteFootnote:\n (id) =>\n ({ state, tr, dispatch }) => {\n const refs = findReferences(state.doc, id);\n const footnote = findFootnote(state.doc, id);\n if (!refs.length && !footnote) return false;\n if (dispatch) {\n for (let i = refs.length - 1; i >= 0; i--) {\n tr.delete(refs[i].pos, refs[i].pos + refs[i].node.nodeSize);\n }\n syncFootnotes(tr, { generateId: this.options.generateId });\n }\n return true;\n },\n\n goToFootnote:\n (id) =>\n ({ state, tr, dispatch, view }) => {\n const footnote = findFootnote(state.doc, id);\n if (!footnote) return false;\n if (dispatch) {\n tr.setSelection(\n TextSelection.create(tr.doc, footnote.pos + footnote.node.nodeSize - 2),\n );\n tr.scrollIntoView();\n scrollDomAtPos(view, footnote.pos);\n }\n return true;\n },\n\n goToFootnoteReference:\n (id) =>\n ({ state, tr, dispatch, view }) => {\n const [ref] = findReferences(state.doc, id);\n if (!ref) return false;\n if (dispatch) {\n tr.setSelection(NodeSelection.create(tr.doc, ref.pos));\n tr.scrollIntoView();\n scrollDomAtPos(view, ref.pos);\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const generateId = this.options.generateId;\n const editor = this.editor;\n return [\n new Plugin<boolean>({\n key: footnotesPluginKey,\n state: presenceStateSpec([REFERENCE, LIST]),\n appendTransaction: (transactions, _oldState, newState: EditorState) => {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n if (!footnotesPluginKey.getState(newState)) return null;\n const tr = newState.tr;\n return syncFootnotes(tr, { generateId }) ? tr : null;\n },\n props: {\n handleClickOn: (_view, _pos, node, _nodePos, event) => {\n if (node.type.name !== REFERENCE || !node.attrs.id) return false;\n const target = event.target as HTMLElement | null;\n if (!target?.closest?.(\"a\")) return false;\n event.preventDefault();\n return editor.commands.goToFootnote(node.attrs.id);\n },\n },\n }),\n ];\n },\n\n onBeforeCreate() {\n const { generateId } = this.options;\n syncInitialContent(this.editor, (state) => {\n const tr = state.tr;\n return syncFootnotes(tr, { generateId }) ? tr : null;\n });\n },\n});\n\n/**\n * The footnotes list at the end of the document. Managed automatically by\n * `FootnoteReference`; you rarely create it directly.\n */\nexport const Footnotes = Node.create({\n name: LIST,\n group: \"block\",\n content: `${ITEM}+`,\n isolating: true,\n selectable: false,\n draggable: false,\n\n parseHTML() {\n return [{ tag: 'section[data-type=\"footnotes\"]', contentElement: \"ol\", priority: 60 }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"section\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"footnotes\",\n class: \"pixerate-footnotes\",\n role: \"doc-endnotes\",\n }),\n [\"ol\", 0],\n ];\n },\n\n addStorage() {\n return {\n markdown: {\n serialize(state: any, node: ProsemirrorNode) {\n node.forEach((footnote) => {\n const label = footnote.attrs.number ?? footnote.attrs.id;\n state.wrapBlock(\" \", `[^${label}]: `, footnote, () =>\n state.renderContent(footnote),\n );\n });\n },\n parse: {},\n },\n };\n },\n});\n\n/**\n * A single footnote's content inside the `footnotes` list.\n */\nexport const Footnote = Node.create({\n name: ITEM,\n content: \"paragraph+\",\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.id\n ? { \"data-id\": attributes.id, id: `fn-${attributes.id}` }\n : {},\n },\n number: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n Number(element.getAttribute(\"data-number\")) || null,\n renderHTML: (attributes: Record<string, any>) =>\n attributes.number ? { \"data-number\": attributes.number } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'li[data-type=\"footnote\"]', priority: 60 }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"li\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"footnote\",\n class: \"pixerate-footnote\",\n }),\n 0,\n ];\n },\n\n addKeyboardShortcuts() {\n // Backspace at the start of a footnote would join it into the previous\n // footnote (or lift it out of the list); keep footnotes intact instead.\n const atFootnoteStart = () => {\n const { selection } = this.editor.state;\n if (!selection.empty) return false;\n const { $from } = selection;\n if ($from.parentOffset !== 0 || $from.depth < 2) return false;\n const footnote = $from.node($from.depth - 1);\n return footnote.type.name === ITEM && $from.index($from.depth - 1) === 0;\n };\n return {\n Backspace: () => atFootnoteStart(),\n };\n },\n});\n","import { Mark, mergeAttributes } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport { generateStructureId, scrollDomAtPos } from \"./utils\";\n\n/**\n * A bookmark as listed by `getBookmarks`.\n */\nexport interface BookmarkInfo {\n id: string;\n name: string;\n /** Bookmarked text (all ranges carrying the bookmark, in document order). */\n text: string;\n /** Start of the first bookmarked range. */\n from: number;\n /** End of the last bookmarked range. */\n to: number;\n}\n\nexport interface BookmarkOptions {\n HTMLAttributes: Record<string, any>;\n /** Generates ids for new bookmarks. */\n generateId: () => string;\n}\n\nexport interface SetBookmarkOptions {\n /** Display name. Setting a name that already exists moves that bookmark. */\n name: string;\n /** Explicit id; generated (or reused from a same-named bookmark) when omitted. */\n id?: string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n bookmark: {\n /**\n * Bookmarks the selected text (or the word at the caret when the\n * selection is empty).\n */\n setBookmark: (options: SetBookmarkOptions) => ReturnType;\n /** Removes a bookmark (the text stays). */\n removeBookmark: (id: string) => ReturnType;\n /** Renames a bookmark. */\n renameBookmark: (id: string, name: string) => ReturnType;\n /** Selects a bookmark's text and scrolls to it. */\n goToBookmark: (id: string) => ReturnType;\n };\n }\n}\n\nconst BOOKMARK = \"bookmark\";\n\n/**\n * Lists the bookmarks in a document, merging the text nodes that carry each\n * bookmark into one entry.\n */\nexport function getBookmarks(doc: ProsemirrorNode): BookmarkInfo[] {\n const byId = new Map<string, BookmarkInfo>();\n doc.descendants((node, pos) => {\n if (!node.isText) return true;\n for (const mark of node.marks) {\n if (mark.type.name !== BOOKMARK || !mark.attrs.id) continue;\n const end = pos + node.nodeSize;\n const existing = byId.get(mark.attrs.id);\n if (existing) {\n // Separate ranges (e.g. split by an inline node) are joined by a space.\n existing.text += (existing.to === pos ? \"\" : \" \") + node.text;\n existing.to = end;\n } else {\n byId.set(mark.attrs.id, {\n id: mark.attrs.id,\n name: mark.attrs.name ?? mark.attrs.id,\n text: node.text ?? \"\",\n from: pos,\n to: end,\n });\n }\n }\n return false;\n });\n return Array.from(byId.values());\n}\n\nfunction forEachBookmarkRange(\n doc: ProsemirrorNode,\n id: string,\n fn: (from: number, to: number, mark: any) => void,\n) {\n doc.descendants((node, pos) => {\n if (!node.isText) return true;\n const mark = node.marks.find(\n (m) => m.type.name === BOOKMARK && m.attrs.id === id,\n );\n if (mark) fn(pos, pos + node.nodeSize, mark);\n return false;\n });\n}\n\n/**\n * Word-style bookmark: a named, non-inclusive mark over a text range. Several\n * bookmarks may overlap. Cross-references (`CrossReference`) can point to a\n * bookmark by id and display its current text.\n */\nexport const Bookmark = Mark.create<BookmarkOptions>({\n name: BOOKMARK,\n inclusive: false,\n excludes: \"\",\n spanning: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n generateId: () => generateStructureId(\"bm\"),\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-bookmark-id\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.id ? { \"data-bookmark-id\": attributes.id } : {},\n },\n name: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-bookmark-name\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.name ? { \"data-bookmark-name\": attributes.name } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-bookmark-id]\", priority: 60 }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"span\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"pixerate-bookmark\",\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n setBookmark:\n ({ name, id }) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.marks[BOOKMARK];\n if (!type || !name) return false;\n let { from, to } = state.selection;\n if (from === to) {\n // Expand an empty selection to the word around the caret.\n const { $from } = state.selection;\n const text = $from.parent.textBetween(0, $from.parent.content.size, undefined, \"\");\n let start = $from.parentOffset;\n let end = $from.parentOffset;\n while (start > 0 && /[\\p{L}\\p{N}_'-]/u.test(text[start - 1])) start--;\n while (end < text.length && /[\\p{L}\\p{N}_'-]/u.test(text[end])) end++;\n if (start === end) return false;\n from = $from.start() + start;\n to = $from.start() + end;\n }\n if (!dispatch) return true;\n\n // Reuse the id of an existing bookmark with this name, so moving a\n // bookmark keeps cross-references pointing at it.\n const sameName = getBookmarks(state.doc).find((b) => b.name === name);\n const bookmarkId = id ?? sameName?.id ?? this.options.generateId();\n if (sameName) {\n forEachBookmarkRange(tr.doc, sameName.id, (f, t, mark) =>\n tr.removeMark(f, t, mark),\n );\n }\n tr.addMark(from, to, type.create({ id: bookmarkId, name }));\n return true;\n },\n\n removeBookmark:\n (id) =>\n ({ state, tr, dispatch }) => {\n let found = false;\n forEachBookmarkRange(state.doc, id, (from, to, mark) => {\n found = true;\n if (dispatch) tr.removeMark(from, to, mark);\n });\n return found;\n },\n\n renameBookmark:\n (id, name) =>\n ({ state, tr, dispatch }) => {\n let found = false;\n forEachBookmarkRange(state.doc, id, (from, to, mark) => {\n found = true;\n if (dispatch) {\n tr.removeMark(from, to, mark);\n tr.addMark(from, to, mark.type.create({ ...mark.attrs, name }));\n }\n });\n return found;\n },\n\n goToBookmark:\n (id) =>\n ({ state, tr, dispatch, view }) => {\n const bookmark = getBookmarks(state.doc).find((b) => b.id === id);\n if (!bookmark) return false;\n if (dispatch) {\n tr.setSelection(TextSelection.create(tr.doc, bookmark.from, bookmark.to));\n tr.scrollIntoView();\n const domPos = state.doc.resolve(bookmark.from);\n scrollDomAtPos(view, domPos.before(domPos.depth));\n }\n return true;\n },\n };\n },\n});\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n type EditorState,\n type Transaction,\n} from \"@tiptap/pm/state\";\nimport { getBookmarks } from \"./bookmarks\";\nimport { computeOutline } from \"./outline\";\nimport {\n presenceStateSpec,\n scrollDomAtPos,\n STRUCTURE_PRIORITY,\n syncInitialContent,\n} from \"./utils\";\n\nexport type CrossReferenceTargetType = \"heading\" | \"bookmark\";\n\n/**\n * Something a cross-reference can point to.\n */\nexport interface CrossReferenceTarget {\n type: CrossReferenceTargetType;\n id: string;\n /** Current text of the target (heading text or bookmarked text). */\n text: string;\n /** Bookmark name, or heading text. */\n name: string;\n /** Heading level (headings only). */\n level?: number;\n}\n\nexport interface CrossReferenceOptions {\n HTMLAttributes: Record<string, any>;\n /** Heading node types that can be referenced. Defaults to `[\"heading\"]`. */\n headingTypes: string[];\n /** Text shown while the target no longer exists (Word: \"Error! Reference source not found.\"). */\n brokenText: string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n crossReference: {\n /** Inserts a cross-reference to a heading or bookmark at the selection. */\n insertCrossReference: (target: {\n targetType: CrossReferenceTargetType;\n targetId: string;\n }) => ReturnType;\n /**\n * Moves the caret to the target of the cross-reference at `pos` (or the\n * selected cross-reference).\n */\n followCrossReference: (pos?: number) => ReturnType;\n };\n }\n}\n\nexport const crossReferencePluginKey = new PluginKey<boolean>(\"crossReference\");\n\nconst NAME = \"crossReference\";\n\n/**\n * Lists the headings (with stable ids, see `Outline`) and bookmarks in a\n * document, for building a cross-reference picker.\n */\nexport function getCrossReferenceTargets(\n doc: ProsemirrorNode,\n headingTypes: readonly string[] = [\"heading\"],\n): CrossReferenceTarget[] {\n const headings: CrossReferenceTarget[] = computeOutline(doc, headingTypes)\n .filter((h) => !h.id.startsWith(\"outline-\"))\n .map((h) => ({ type: \"heading\", id: h.id, text: h.text, name: h.text, level: h.level }));\n const bookmarks: CrossReferenceTarget[] = getBookmarks(doc).map((b) => ({\n type: \"bookmark\",\n id: b.id,\n text: b.text,\n name: b.name,\n }));\n return [...headings, ...bookmarks];\n}\n\ninterface TargetLookup {\n targets: Map<string, CrossReferenceTarget>;\n headingsByText: Map<string, CrossReferenceTarget>;\n}\n\n/**\n * Updates every cross-reference's cached `label` and `broken` state from its\n * target. A heading reference whose id disappeared (e.g. after a markdown\n * round-trip, which does not keep heading ids) is re-pointed at a heading with\n * exactly the same text, if there is one.\n */\nfunction syncCrossReferences(\n state: EditorState,\n headingTypes: readonly string[],\n): Transaction | null {\n let lookup: TargetLookup | null = null;\n const resolve = (): TargetLookup => {\n if (!lookup) {\n const next: TargetLookup = { targets: new Map(), headingsByText: new Map() };\n for (const t of getCrossReferenceTargets(state.doc, headingTypes)) {\n next.targets.set(`${t.type}:${t.id}`, t);\n if (t.type === \"heading\" && !next.headingsByText.has(t.text)) {\n next.headingsByText.set(t.text, t);\n }\n }\n lookup = next;\n }\n return lookup;\n };\n\n let tr: Transaction | null = null;\n state.doc.descendants((node, pos) => {\n if (node.type.name !== NAME) return true;\n const { targets, headingsByText } = resolve();\n const { targetType } = node.attrs;\n let { targetId } = node.attrs;\n let target = targets.get(`${targetType}:${targetId}`);\n if (!target && targetType === \"heading\" && node.attrs.label) {\n target = headingsByText.get(node.attrs.label);\n if (target) targetId = target.id;\n }\n const label = target ? target.text : node.attrs.label;\n const broken = !target;\n if (\n label !== node.attrs.label ||\n broken !== node.attrs.broken ||\n targetId !== node.attrs.targetId\n ) {\n tr = tr ?? state.tr;\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, targetId, label, broken });\n }\n return false;\n });\n return tr;\n}\n\n/**\n * Inline cross-reference to a heading or bookmark. It displays the target's\n * current text, follows renames, and switches to a broken-reference state\n * (class `is-broken`, `brokenText`) when the target is removed. Undoing the\n * removal restores it. Heading targets need the `Outline` extension, which\n * gives headings stable ids.\n */\nexport const CrossReference = Node.create<CrossReferenceOptions>({\n name: NAME,\n priority: STRUCTURE_PRIORITY - 5,\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n headingTypes: [\"heading\"],\n brokenText: \"Error! Reference source not found.\",\n };\n },\n\n addAttributes() {\n return {\n targetType: {\n default: \"heading\",\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-target-type\") ?? \"heading\",\n renderHTML: (attributes: Record<string, any>) => ({\n \"data-target-type\": attributes.targetType,\n }),\n },\n targetId: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-target-id\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.targetId ? { \"data-target-id\": attributes.targetId } : {},\n },\n label: {\n default: \"\",\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-label\") ?? element.textContent ?? \"\",\n renderHTML: (attributes: Record<string, any>) => ({\n \"data-label\": attributes.label,\n }),\n },\n broken: {\n default: false,\n parseHTML: (element: HTMLElement) => element.hasAttribute(\"data-broken\"),\n renderHTML: (attributes: Record<string, any>) =>\n attributes.broken ? { \"data-broken\": \"true\" } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'a[data-type=\"cross-reference\"]', priority: 60 }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const { targetType, targetId, broken, label } = node.attrs;\n const href =\n !broken && targetType === \"heading\" && targetId ? { href: `#${targetId}` } : {};\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, href, {\n \"data-type\": \"cross-reference\",\n class: broken ? \"pixerate-cross-reference is-broken\" : \"pixerate-cross-reference\",\n }),\n broken ? this.options.brokenText : label,\n ];\n },\n\n renderText({ node }) {\n return node.attrs.broken ? this.options.brokenText : node.attrs.label;\n },\n\n addCommands() {\n return {\n insertCrossReference:\n ({ targetType, targetId }) =>\n ({ state, tr, dispatch }) => {\n const type = state.schema.nodes[NAME];\n if (!type || !state.selection.$from.parent.inlineContent) return false;\n const target = getCrossReferenceTargets(state.doc, this.options.headingTypes).find(\n (t) => t.type === targetType && t.id === targetId,\n );\n if (!target) return false;\n if (dispatch) {\n tr.replaceSelectionWith(\n type.create({ targetType, targetId, label: target.text, broken: false }),\n false,\n );\n }\n return true;\n },\n\n followCrossReference:\n (pos) =>\n ({ state, tr, dispatch, view }) => {\n const node =\n pos != null ? state.doc.nodeAt(pos) : (state.selection as any).node ?? null;\n if (!node || node.type.name !== NAME || node.attrs.broken) return false;\n const { targetType, targetId } = node.attrs;\n let range: { from: number; to: number; blockPos: number } | null = null;\n if (targetType === \"bookmark\") {\n const bookmark = getBookmarks(state.doc).find((b) => b.id === targetId);\n if (bookmark) {\n const $from = state.doc.resolve(bookmark.from);\n range = {\n from: bookmark.from,\n to: bookmark.to,\n blockPos: $from.before($from.depth),\n };\n }\n } else {\n const heading = computeOutline(state.doc, this.options.headingTypes).find(\n (h) => h.id === targetId,\n );\n if (heading) {\n range = { from: heading.pos + 1, to: heading.pos + 1, blockPos: heading.pos };\n }\n }\n if (!range) return false;\n if (dispatch) {\n tr.setSelection(TextSelection.create(tr.doc, range.from, range.to));\n tr.scrollIntoView();\n scrollDomAtPos(view, range.blockPos);\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const { headingTypes } = this.options;\n const editor = this.editor;\n return [\n new Plugin<boolean>({\n key: crossReferencePluginKey,\n state: presenceStateSpec([NAME]),\n appendTransaction: (transactions, _oldState, newState) => {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n if (!crossReferencePluginKey.getState(newState)) return null;\n return syncCrossReferences(newState, headingTypes);\n },\n props: {\n handleClickOn: (_view, _pos, node, nodePos, event) => {\n if (node.type.name !== NAME) return false;\n // Follow on Ctrl/Cmd+click while editing (like Word), plain click when read-only.\n if (editor.isEditable && !(event.metaKey || event.ctrlKey)) return false;\n event.preventDefault();\n return editor.commands.followCrossReference(nodePos);\n },\n },\n }),\n ];\n },\n\n onBeforeCreate() {\n const { headingTypes } = this.options;\n syncInitialContent(this.editor, (state) => syncCrossReferences(state, headingTypes));\n },\n});\n","import type { Editor } from \"@tiptap/core\";\nimport type { CrossReferenceTargetType } from \"./cross-reference\";\n\nexport interface DocumentStructureCommandArgs {\n /** Range to delete first, e.g. the `/toc` text matched by `SlashCommands`. */\n range?: { from: number; to: number };\n /** Bookmark name (bookmark item). */\n name?: string;\n /** Footnote text (footnote item). */\n content?: string;\n /** Cross-reference target (cross-reference item). */\n targetType?: CrossReferenceTargetType;\n targetId?: string;\n}\n\n/**\n * A framework-agnostic menu entry for slash menus and toolbars.\n */\nexport interface DocumentStructureCommandItem {\n id: \"table-of-contents\" | \"footnote\" | \"bookmark\" | \"cross-reference\";\n title: string;\n description: string;\n keywords: string[];\n /** Name of the extension that must be installed for the item to work. */\n extension: string;\n /**\n * Input the host UI must collect before calling `run`: a bookmark name, or\n * a cross-reference target (see `getCrossReferenceTargets`).\n */\n requires?: \"name\" | \"target\";\n run: (editor: Editor, args?: DocumentStructureCommandArgs) => boolean;\n}\n\nconst start = (editor: Editor, args?: DocumentStructureCommandArgs) => {\n const chain = editor.chain().focus();\n return args?.range ? chain.deleteRange(args.range) : chain;\n};\n\n/**\n * Menu entries for the document-structure commands.\n */\nexport const documentStructureCommandItems: DocumentStructureCommandItem[] = [\n {\n id: \"table-of-contents\",\n title: \"Table of contents\",\n description: \"Insert a linked list of the document's headings\",\n keywords: [\"toc\", \"contents\", \"outline\", \"index\"],\n extension: \"tableOfContents\",\n run: (editor, args) => start(editor, args).insertTableOfContents().run(),\n },\n {\n id: \"footnote\",\n title: \"Footnote\",\n description: \"Insert a numbered footnote\",\n keywords: [\"footnote\", \"note\", \"fn\", \"citation\"],\n extension: \"footnoteReference\",\n run: (editor, args) =>\n start(editor, args).insertFootnote({ content: args?.content }).run(),\n },\n {\n id: \"bookmark\",\n title: \"Bookmark\",\n description: \"Name the selected text or word so it can be referenced\",\n keywords: [\"bookmark\", \"anchor\", \"name\"],\n extension: \"bookmark\",\n requires: \"name\",\n run: (editor, args) =>\n !!args?.name && start(editor, args).setBookmark({ name: args.name }).run(),\n },\n {\n id: \"cross-reference\",\n title: \"Cross-reference\",\n description: \"Insert a live reference to a heading or bookmark\",\n keywords: [\"cross\", \"reference\", \"xref\", \"link\", \"ref\"],\n extension: \"crossReference\",\n requires: \"target\",\n run: (editor, args) =>\n !!args?.targetType &&\n !!args.targetId &&\n start(editor, args)\n .insertCrossReference({ targetType: args.targetType, targetId: args.targetId })\n .run(),\n },\n];\n\n/**\n * Returns the document-structure items whose extension is installed in the\n * editor, optionally filtered by a slash-command query.\n */\nexport function getDocumentStructureCommandItems(\n editor: Editor | null | undefined,\n query = \"\",\n): DocumentStructureCommandItem[] {\n if (!editor) return [];\n const installed = new Set(\n editor.extensionManager.extensions.map((extension) => extension.name),\n );\n const q = query.trim().toLowerCase();\n return documentStructureCommandItems.filter(\n (item) =>\n installed.has(item.extension) &&\n (!q ||\n item.title.toLowerCase().includes(q) ||\n item.keywords.some((k) => k.startsWith(q))),\n );\n}\n","// Portions ported from wordcraft/crates/engine/src/cmd/edit.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { Extension, type Editor, type KeyboardShortcutCommand } from \"@tiptap/core\";\nimport { Plugin, PluginKey, TextSelection, type EditorState, type Transaction } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { closeHistory } from \"@tiptap/pm/history\";\nimport type { FindOptions, FindPatternError } from \"./pattern\";\nimport { applyReplacements, searchDocument, type FindMatch } from \"./search\";\n\nexport type FindReplaceMode = \"find\" | \"replace\";\n\n/** Everything a find bar needs. Snapshots are cached, so they suit `useSyncExternalStore`. */\nexport interface FindReplaceSnapshot {\n /** Whether the find bar should be shown (`openFindReplace` / Mod+F). */\n open: boolean;\n mode: FindReplaceMode;\n query: string;\n replacement: string;\n options: Readonly<FindOptions>;\n matches: readonly FindMatch[];\n /** Index of the current match, or -1. */\n currentIndex: number;\n error: FindPatternError | null;\n /** The search stopped at the match cap or time budget. */\n truncated: boolean;\n /** Replacements made by the last `replaceAll` / `replaceCurrent` (`null` before any). */\n lastReplaceCount: number | null;\n /** Bumped whenever the bar is asked to focus its find field (Mod+F while open). */\n focusRequest: number;\n}\n\nconst EMPTY_OPTIONS: Readonly<FindOptions> = Object.freeze({});\n\nexport const EMPTY_FIND_REPLACE_SNAPSHOT: FindReplaceSnapshot = Object.freeze({\n open: false,\n mode: \"find\",\n query: \"\",\n replacement: \"\",\n options: EMPTY_OPTIONS,\n matches: Object.freeze([]) as readonly FindMatch[],\n currentIndex: -1,\n error: null,\n truncated: false,\n lastReplaceCount: null,\n focusRequest: 0,\n}) as FindReplaceSnapshot;\n\n/**\n * External store over the find state. `subscribe` calls the listener\n * immediately (Svelte store contract).\n */\nexport class FindReplaceStore {\n private snapshot: FindReplaceSnapshot = EMPTY_FIND_REPLACE_SNAPSHOT;\n private listeners = new Set<(snapshot: FindReplaceSnapshot) => void>();\n\n subscribe = (listener: (snapshot: FindReplaceSnapshot) => void): (() => void) => {\n this.listeners.add(listener);\n listener(this.snapshot);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n getSnapshot = (): FindReplaceSnapshot => this.snapshot;\n\n /** @internal Called by the extension's plugin view. */\n set(snapshot: FindReplaceSnapshot): void {\n if (snapshot === this.snapshot) return;\n this.snapshot = snapshot;\n this.listeners.forEach((listener) => {\n try {\n listener(snapshot);\n } catch (err) {\n console.error(\"[FindReplaceStore] Error in listener:\", err);\n }\n });\n }\n}\n\nexport interface FindReplaceOptions {\n /** Bind Mod+F / Mod+H (and Mod+Shift+H) to open the bar, F3 / Mod+G to step. Default `true`. */\n shortcuts: boolean;\n /** Class of every match. */\n matchClass: string;\n /** Class of the current match. */\n currentMatchClass: string;\n /** Wall-clock budget per search in milliseconds (default 250). */\n timeLimitMs: number;\n /** Match cap per search (default 10 000). */\n maxMatches: number;\n /** Text of `^c` in Replace with (clipboard reads are async in browsers, so supply it). */\n getClipboardText: () => string;\n /** Longest selection copied into the find field by Mod+F. Default 256. */\n maxPrefillLength: number;\n}\n\nexport interface FindReplaceStorage {\n store: FindReplaceStore;\n}\n\nexport interface SetSearchParams {\n query?: string;\n replacement?: string;\n /** Merged into the current options. */\n options?: Partial<FindOptions>;\n}\n\nexport interface OpenFindReplaceParams {\n mode?: FindReplaceMode;\n /** Find text; defaults to the selected text (single paragraph, short). */\n query?: string;\n}\n\ninterface PluginState {\n active: boolean;\n open: boolean;\n mode: FindReplaceMode;\n query: string;\n replacement: string;\n options: Readonly<FindOptions>;\n matches: readonly FindMatch[];\n currentIndex: number;\n /** Position the current match is chosen from (first match at or after it) after a re-search. */\n anchor: number;\n error: FindPatternError | null;\n truncated: boolean;\n lastReplaceCount: number | null;\n focusRequest: number;\n decorations: DecorationSet;\n}\n\ntype FindReplaceMeta =\n | { type: \"set\"; params: SetSearchParams; anchor: number }\n | { type: \"open\"; mode: FindReplaceMode; query?: string; anchor: number }\n | { type: \"close\" }\n | { type: \"clear\" }\n | { type: \"current\"; index: number }\n | { type: \"replaced\"; anchor: number; count: number };\n\nexport const findReplacePluginKey = new PluginKey<PluginState>(\"findReplace\");\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n findReplace: {\n /** Sets the find text, replace text and/or options and searches. */\n setSearch: (params: SetSearchParams) => ReturnType;\n /** Shows the find bar (and searches its text). */\n openFindReplace: (params?: OpenFindReplaceParams) => ReturnType;\n /** Hides the find bar and its highlights; the find text is kept. */\n closeFindReplace: () => ReturnType;\n /** Clears the find text and highlights. */\n clearSearch: () => ReturnType;\n /** Selects the next match after the selection, wrapping around. */\n findNext: () => ReturnType;\n /** Selects the previous match before the selection, wrapping around. */\n findPrevious: () => ReturnType;\n /** Replaces the current match and moves on to the next one. */\n replaceCurrent: () => ReturnType;\n /** Replaces every match in one transaction (one undo step). */\n replaceAll: () => ReturnType;\n };\n }\n}\n\n/** The extension's plugin state, or `null` without `FindReplace`. */\nexport function getFindReplaceState(source: Editor | EditorState | null | undefined): FindReplaceSnapshot | null {\n const state: EditorState | undefined = (source as any)?.state ?? (source as any);\n if (!state || typeof (state as any).plugins === \"undefined\") return null;\n const plugin = findReplacePluginKey.getState(state);\n return plugin ? toSnapshot(plugin) : null;\n}\n\n/** Returns the find store of an editor using `FindReplace`. */\nexport function getFindReplaceStore(editor: Editor | null | undefined): FindReplaceStore | null {\n return (editor?.storage as any)?.findReplace?.store ?? null;\n}\n\nconst snapshotCache = new WeakMap<PluginState, FindReplaceSnapshot>();\n\nfunction toSnapshot(s: PluginState): FindReplaceSnapshot {\n let snapshot = snapshotCache.get(s);\n if (!snapshot) {\n snapshot = Object.freeze({\n open: s.open,\n mode: s.mode,\n query: s.query,\n replacement: s.replacement,\n options: s.options,\n matches: s.active ? s.matches : EMPTY_FIND_REPLACE_SNAPSHOT.matches,\n currentIndex: s.active ? s.currentIndex : -1,\n error: s.error,\n truncated: s.truncated,\n lastReplaceCount: s.lastReplaceCount,\n focusRequest: s.focusRequest,\n });\n snapshotCache.set(s, snapshot);\n }\n return snapshot;\n}\n\nexport interface FindOptionToggle {\n key: keyof FindOptions;\n label: string;\n /** Compact button text. */\n short: string;\n /** Shown under \"More options\" rather than as a toolbar toggle. */\n advanced: boolean;\n}\n\n/** The option toggles of the React and Svelte find bars, in display order. */\nexport const FIND_OPTION_TOGGLES: readonly FindOptionToggle[] = Object.freeze([\n { key: \"matchCase\", label: \"Match case\", short: \"Aa\", advanced: false },\n { key: \"wholeWord\", label: \"Whole words only\", short: \"ab\", advanced: false },\n { key: \"wildcards\", label: \"Use wildcards\", short: \"*?\", advanced: false },\n { key: \"regex\", label: \"Regular expression\", short: \".*\", advanced: false },\n { key: \"matchPrefix\", label: \"Match prefix\", short: \"ab-\", advanced: true },\n { key: \"matchSuffix\", label: \"Match suffix\", short: \"-ab\", advanced: true },\n { key: \"ignorePunctuation\", label: \"Ignore punctuation\", short: \".,\", advanced: true },\n { key: \"ignoreWhitespace\", label: \"Ignore white space\", short: \"_\", advanced: true },\n { key: \"literal\", label: \"No special characters (^)\", short: \"^\", advanced: true },\n]);\n\n/**\n * Text of a find bar's match counter: `\"3 of 12\"`, `\"12 results\"` (no\n * current match), `\"No results\"`, `\"10000+ results\"` when truncated, or the\n * pattern error. Empty without a query.\n */\nexport function formatFindStatus(\n s: Pick<FindReplaceSnapshot, \"query\" | \"matches\" | \"currentIndex\" | \"error\" | \"truncated\">,\n): string {\n if (!s.query) return \"\";\n if (s.error) return s.error.message;\n const n = s.matches.length;\n if (n === 0) return \"No results\";\n const total = s.truncated ? `${n}+` : `${n}`;\n return s.currentIndex >= 0 ? `${s.currentIndex + 1} of ${total}` : `${total} results`;\n}\n\n/** Index of the first match starting at or after `pos`, wrapping to the first match. */\nfunction indexFrom(matches: readonly FindMatch[], pos: number): number {\n if (!matches.length) return -1;\n const i = matches.findIndex((m) => m.from >= pos);\n return i < 0 ? 0 : i;\n}\n\n/** Text of a short selection inside one textblock, for prefilling the find field. */\nfunction selectedQuery(state: EditorState, maxLength: number): string | undefined {\n const { from, to, $from, $to } = state.selection;\n if (from === to || !$from.sameParent($to)) return undefined;\n const text = state.doc.textBetween(from, to, \"\", \"\");\n return text && text.length <= maxLength && !/[\\r\\n]/.test(text) ? text : undefined;\n}\n\n/**\n * Word-style Find and Replace: Match case, Whole words, prefix/suffix,\n * Ignore punctuation/white space, `^` special characters, wildcards (with\n * `\\1` groups in the replacement) and a raw regex mode. Matches are\n * decorated; tracked-deleted text is skipped, and replacements made while\n * Track Changes is on become tracked changes.\n */\nexport const FindReplace = Extension.create<FindReplaceOptions, FindReplaceStorage>({\n name: \"findReplace\",\n\n addOptions() {\n return {\n shortcuts: true,\n matchClass: \"pixerate-find-match\",\n currentMatchClass: \"pixerate-find-match-current\",\n timeLimitMs: 250,\n maxMatches: 10_000,\n getClipboardText: () => \"\",\n maxPrefillLength: 256,\n };\n },\n\n addStorage() {\n return { store: new FindReplaceStore() };\n },\n\n addCommands() {\n const meta = (tr: Transaction, value: FindReplaceMeta) => tr.setMeta(findReplacePluginKey, value);\n const current = (state: EditorState) => findReplacePluginKey.getState(state);\n const maxPrefill = () => this.options.maxPrefillLength;\n\n const select = (tr: Transaction, match: FindMatch) => {\n tr.setSelection(TextSelection.create(tr.doc, match.from, match.to)).scrollIntoView();\n };\n\n return {\n setSearch:\n (params) =>\n ({ tr, state, dispatch }) => {\n if (!current(state)) return false;\n if (dispatch) meta(tr, { type: \"set\", params, anchor: state.selection.from });\n return true;\n },\n openFindReplace:\n (params = {}) =>\n ({ tr, state, dispatch }) => {\n if (!current(state)) return false;\n if (dispatch) {\n meta(tr, {\n type: \"open\",\n mode: params.mode ?? \"find\",\n query: params.query ?? selectedQuery(state, maxPrefill()),\n anchor: state.selection.from,\n });\n }\n return true;\n },\n closeFindReplace:\n () =>\n ({ tr, state, dispatch }) => {\n if (!current(state)) return false;\n if (dispatch) meta(tr, { type: \"close\" });\n return true;\n },\n clearSearch:\n () =>\n ({ tr, state, dispatch }) => {\n if (!current(state)) return false;\n if (dispatch) meta(tr, { type: \"clear\" });\n return true;\n },\n findNext:\n () =>\n ({ tr, state, dispatch }) => {\n const s = current(state);\n if (!s || !s.active || !s.matches.length) return false;\n const { from, to } = state.selection;\n const cur = s.matches[s.currentIndex];\n const onCurrent = cur && cur.from === from && cur.to === to;\n const index = onCurrent\n ? (s.currentIndex + 1) % s.matches.length\n : indexFrom(s.matches, to);\n if (dispatch) {\n meta(tr, { type: \"current\", index });\n select(tr, s.matches[index]);\n }\n return true;\n },\n findPrevious:\n () =>\n ({ tr, state, dispatch }) => {\n const s = current(state);\n if (!s || !s.active || !s.matches.length) return false;\n const { from, to } = state.selection;\n const n = s.matches.length;\n const cur = s.matches[s.currentIndex];\n const onCurrent = cur && cur.from === from && cur.to === to;\n let index: number;\n if (onCurrent) {\n index = (s.currentIndex - 1 + n) % n;\n } else {\n index = -1;\n for (let i = n - 1; i >= 0; i--) {\n if (s.matches[i].to <= from) {\n index = i;\n break;\n }\n }\n if (index < 0) index = n - 1;\n }\n if (dispatch) {\n meta(tr, { type: \"current\", index });\n select(tr, s.matches[index]);\n }\n return true;\n },\n replaceCurrent:\n () =>\n ({ tr, state, dispatch }) => {\n const s = current(state);\n if (!s || !s.active || s.currentIndex < 0 || !s.matches[s.currentIndex]) return false;\n if (dispatch) {\n // A replacement is its own undo step, not merged with typing before it.\n closeHistory(tr);\n const [end] = applyReplacements(tr, [s.matches[s.currentIndex]]);\n tr.setSelection(TextSelection.create(tr.doc, end)).scrollIntoView();\n meta(tr, { type: \"replaced\", anchor: end, count: 1 });\n }\n return true;\n },\n replaceAll:\n () =>\n ({ tr, state, dispatch }) => {\n const s = current(state);\n if (!s || !s.active || !s.matches.length) return false;\n if (dispatch) {\n closeHistory(tr);\n const ends = applyReplacements(tr, s.matches);\n meta(tr, { type: \"replaced\", anchor: ends[ends.length - 1], count: s.matches.length });\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts(): Record<string, KeyboardShortcutCommand> {\n if (!this.options.shortcuts) return {};\n const open = (mode: FindReplaceMode) => () => this.editor.commands.openFindReplace({ mode });\n const step = (forward: boolean) => () => {\n const s = findReplacePluginKey.getState(this.editor.state);\n if (!s?.active || !s.matches.length) return false;\n return forward ? this.editor.commands.findNext() : this.editor.commands.findPrevious();\n };\n return {\n \"Mod-f\": open(\"find\"),\n \"Mod-h\": open(\"replace\"),\n \"Mod-Shift-h\": open(\"replace\"),\n F3: step(true),\n \"Shift-F3\": step(false),\n \"Mod-g\": step(true),\n \"Mod-Shift-g\": step(false),\n };\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n const store = this.storage.store;\n\n const search = (s: PluginState, doc: EditorState[\"doc\"]): PluginState => {\n if (!s.active || !s.query) {\n return { ...s, matches: [], currentIndex: -1, error: null, truncated: false };\n }\n const result = searchDocument(doc, s.query, s.options, {\n replacement: s.replacement,\n clipboardText: safeClipboard(options.getClipboardText),\n timeLimitMs: options.timeLimitMs,\n maxMatches: options.maxMatches,\n });\n return {\n ...s,\n matches: result.matches,\n currentIndex: indexFrom(result.matches, s.anchor),\n error: result.error,\n truncated: result.truncated,\n };\n };\n\n const decorate = (s: PluginState, doc: EditorState[\"doc\"]): PluginState => {\n if (!s.active || !s.matches.length) return { ...s, decorations: DecorationSet.empty };\n const decorations = s.matches.map((m, i) =>\n Decoration.inline(m.from, m.to, {\n class: i === s.currentIndex ? `${options.matchClass} ${options.currentMatchClass}` : options.matchClass,\n }),\n );\n return { ...s, decorations: DecorationSet.create(doc, decorations) };\n };\n\n return [\n new Plugin<PluginState>({\n key: findReplacePluginKey,\n state: {\n init: () => ({\n active: false,\n open: false,\n mode: \"find\",\n query: \"\",\n replacement: \"\",\n options: EMPTY_OPTIONS,\n matches: [],\n currentIndex: -1,\n anchor: 0,\n error: null,\n truncated: false,\n lastReplaceCount: null,\n focusRequest: 0,\n decorations: DecorationSet.empty,\n }),\n apply: (tr, prev, _oldState, newState) => {\n const m = tr.getMeta(findReplacePluginKey) as FindReplaceMeta | undefined;\n if (!m && !tr.docChanged) return prev;\n let s: PluginState = prev;\n let research = false;\n let redecorate = false;\n if (tr.docChanged) {\n s = { ...s, anchor: tr.mapping.map(s.anchor) };\n research = s.active;\n }\n if (m) {\n switch (m.type) {\n case \"set\": {\n const p = m.params;\n s = {\n ...s,\n active: true,\n query: p.query ?? s.query,\n replacement: p.replacement ?? s.replacement,\n options: p.options ? Object.freeze({ ...s.options, ...p.options }) : s.options,\n anchor: m.anchor,\n lastReplaceCount: null,\n };\n research = true;\n break;\n }\n case \"open\":\n s = {\n ...s,\n active: true,\n open: true,\n mode: m.mode,\n query: m.query ?? s.query,\n anchor: m.anchor,\n focusRequest: s.focusRequest + 1,\n };\n research = true;\n break;\n case \"close\":\n s = { ...s, open: false, active: false };\n research = true;\n break;\n case \"clear\":\n s = { ...s, active: false, query: \"\", lastReplaceCount: null };\n research = true;\n break;\n case \"current\":\n s = {\n ...s,\n currentIndex: m.index,\n anchor: s.matches[m.index]?.from ?? s.anchor,\n };\n redecorate = true;\n break;\n case \"replaced\":\n s = { ...s, anchor: m.anchor, lastReplaceCount: m.count };\n research = true;\n break;\n }\n }\n if (research) s = search(s, newState.doc);\n if (research || redecorate) s = decorate(s, newState.doc);\n return s;\n },\n },\n props: {\n decorations: (state) => findReplacePluginKey.getState(state)?.decorations ?? DecorationSet.empty,\n },\n view: (view) => {\n const sync = () => {\n const s = findReplacePluginKey.getState(view.state);\n if (s) store.set(toSnapshot(s));\n };\n sync();\n return { update: sync };\n },\n }),\n ];\n },\n});\n\nfunction safeClipboard(get: () => string): string {\n try {\n return String(get() ?? \"\");\n } catch {\n return \"\";\n }\n}\n","// Portions ported from wordcraft/crates/engine/src/cmd/find_pattern.rs and crates/engine/src/cmd/edit.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n/**\n * Word's Find and Replace patterns: special characters (`^p`, `^t`, `^#` …),\n * the \"Use wildcards\" language (`?`, `*`, `[a-z]`, `[!x]`, `{n,m}`, `@`, `<`,\n * `>`, `( )`) and a raw regular-expression mode.\n *\n * Special and wildcard patterns are compiled to a small program run by a\n * Pike VM, which takes time linear in the text for a given pattern, so no\n * Find text can backtrack catastrophically (JavaScript's `RegExp` would). The\n * raw regex mode uses the native `RegExp` engine; it rejects nested\n * repetition and is bounded by the search budget between matches only.\n *\n * Pure TypeScript: no ProseMirror or DOM.\n */\n\n/** A paragraph mark in the searched text (`^p`). */\nexport const FIND_PARAGRAPH_MARK = \"\\r\";\n/** Longest Find what text, in characters. */\nexport const MAX_FIND_PATTERN_LENGTH = 1024;\n/** Largest count in `{n,m}`. */\nconst MAX_COUNT = 1000;\n/** Largest compiled program (instructions). Larger patterns are `too_complex`. */\nconst MAX_PROGRAM_SIZE = 20_000;\n\nexport interface FindOptions {\n matchCase?: boolean;\n /** Find whole words only (ignored with wildcards, like Word). */\n wholeWord?: boolean;\n /** The match must start a word. */\n matchPrefix?: boolean;\n /** The match must end a word. */\n matchSuffix?: boolean;\n /** Skip punctuation between the characters of the Find text. */\n ignorePunctuation?: boolean;\n /** Skip spaces and tabs between the characters of the Find text. */\n ignoreWhitespace?: boolean;\n /** Word's \"Use wildcards\". Always matches case. */\n wildcards?: boolean;\n /** A JavaScript regular expression (wins over `wildcards`). Replace text is literal. */\n regex?: boolean;\n /** Read the Find and Replace text literally: no `^` codes. */\n literal?: boolean;\n}\n\nexport type FindPatternErrorCode = \"too_long\" | \"invalid_pattern\" | \"too_complex\";\n\n/** Why a Find text cannot be used. Commands report it; they never throw it. */\nexport interface FindPatternError {\n code: FindPatternErrorCode;\n message: string;\n}\n\n/** One match in a searched string (UTF-16 offsets). */\nexport interface PatternMatch {\n start: number;\n end: number;\n /** Text of each group; index 0 is the whole match, unmatched groups are `undefined`. */\n groups: (string | undefined)[];\n}\n\n/** Shared limit on the work one search may do. */\nexport interface SearchBudget {\n /** `performance.now()`/`Date.now()` value after which the search stops. */\n deadline: number;\n /** VM steps left. */\n steps: number;\n /** Set once the budget ran out. */\n exhausted: boolean;\n}\n\nexport interface SearchBudgetOptions {\n /** Wall-clock limit in milliseconds (default 250). */\n timeLimitMs?: number;\n /** Pike VM thread steps (default 50 million). */\n maxSteps?: number;\n}\n\nconst now = (): number =>\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n\nexport function createSearchBudget(options: SearchBudgetOptions = {}): SearchBudget {\n return {\n deadline: now() + (options.timeLimitMs ?? 250),\n steps: options.maxSteps ?? 50_000_000,\n exhausted: false,\n };\n}\n\nexport interface CompiledFindPattern {\n mode: \"special\" | \"wildcards\" | \"regex\";\n /** The pattern can match a paragraph mark, so paragraphs must be read together. */\n spansParagraphs: boolean;\n caseInsensitive: boolean;\n /** Number of capture groups (not counting the whole match). */\n groupCount: number;\n /**\n * The leftmost match in `hay[start, end)`; text outside the range is\n * context for word assertions. `\"budget\"` when the budget ran out.\n */\n exec(hay: string, start: number, end: number, budget: SearchBudget): PatternMatch | null | \"budget\";\n}\n\nexport type CompileFindPatternResult =\n | { ok: true; pattern: CompiledFindPattern }\n | { ok: false; error: FindPatternError };\n\n// ---------------------------------------------------------------------------\n// Character tests\n// ---------------------------------------------------------------------------\n\n/** Tests a code point (and its case fold when matching ignores case). */\ntype CharTest = (cp: number, folded: number) => boolean;\n\nconst PARA = 13; // \"\\r\"\nconst ANY: CharTest = (cp) => cp !== PARA;\n\nconst LETTER = /\\p{L}/u;\nconst PUNCT = /\\p{P}/u;\nconst WORD = /[\\p{L}\\p{M}\\p{Nd}\\p{Pc}]/u;\n\nconst foldCache = new Map<number, number>();\n/** Simple (one code point to one code point) lower-case fold. */\nexport function foldCodePoint(cp: number): number {\n if (cp < 128) return cp >= 65 && cp <= 90 ? cp + 32 : cp;\n const cached = foldCache.get(cp);\n if (cached !== undefined) return cached;\n const lower = String.fromCodePoint(cp).toLowerCase();\n const folded = [...lower].length === 1 ? lower.codePointAt(0)! : cp;\n if (foldCache.size < 4096) foldCache.set(cp, folded);\n return folded;\n}\n\nfunction isWordChar(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 128) {\n return (cp >= 48 && cp <= 57) || (cp >= 65 && cp <= 90) || (cp >= 97 && cp <= 122) || cp === 95;\n }\n return WORD.test(String.fromCodePoint(cp));\n}\n\nconst isLetter = (cp: number) =>\n cp < 128 ? (cp >= 65 && cp <= 90) || (cp >= 97 && cp <= 122) : LETTER.test(String.fromCodePoint(cp));\n\nfunction isPunct(cp: number): boolean {\n if (cp < 128) {\n return (cp >= 33 && cp <= 47) || (cp >= 58 && cp <= 64) || (cp >= 91 && cp <= 96) || (cp >= 123 && cp <= 126);\n }\n return (cp >= 0x2010 && cp <= 0x2027) || cp === 0xa1 || cp === 0xbf || cp === 0xab || cp === 0xbb || PUNCT.test(String.fromCodePoint(cp));\n}\n\nconst isSpace = (cp: number) => cp === 32 || cp === 9 || cp === 0xa0;\n\n/** Code point before `pos` in `hay` (-1 at the start). */\nfunction cpBefore(hay: string, pos: number): number {\n if (pos <= 0) return -1;\n const low = hay.charCodeAt(pos - 1);\n if (low >= 0xdc00 && low <= 0xdfff && pos >= 2) {\n const high = hay.charCodeAt(pos - 2);\n if (high >= 0xd800 && high <= 0xdbff) return hay.codePointAt(pos - 2)!;\n }\n return low;\n}\n\nconst cpAt = (hay: string, pos: number): number => (pos < hay.length ? hay.codePointAt(pos)! : -1);\n\n// ---------------------------------------------------------------------------\n// Pattern AST\n// ---------------------------------------------------------------------------\n\ntype AssertKind = \"boundary\" | \"wordStart\" | \"wordEnd\";\n\ntype Node =\n | { k: \"char\"; test: CharTest }\n | { k: \"cat\"; items: Node[] }\n | { k: \"group\"; index: number; body: Node }\n | { k: \"rep\"; body: Node; min: number; max: number; lazy: boolean } // max -1 = unbounded\n | { k: \"assert\"; kind: AssertKind };\n\nclass PatternError extends Error {\n constructor(\n readonly code: FindPatternErrorCode,\n message: string,\n ) {\n super(message);\n }\n}\n\nconst charNode = (test: CharTest): Node => ({ k: \"char\", test });\nconst exact = (cp: number): Node => charNode((c) => c === cp);\nconst literalNode = (cp: number, caseInsensitive: boolean): Node => {\n if (!caseInsensitive) return exact(cp);\n const f = foldCodePoint(cp);\n return charNode((_c, folded) => folded === f);\n};\nconst star = (body: Node, lazy: boolean): Node => ({ k: \"rep\", body, min: 0, max: -1, lazy });\n\n/** What a `^` code stands for in Find what. */\nfunction findCode(c: string): Node | null {\n switch (c) {\n case \"p\": return exact(PARA);\n case \"t\": return exact(9);\n case \"?\": return charNode(ANY);\n case \"#\": return charNode((cp) => cp >= 48 && cp <= 57);\n case \"$\": return charNode((cp) => isLetter(cp));\n case \"^\": return exact(94);\n case \"l\": return exact(10);\n case \"m\": return exact(0x0c);\n case \"n\": return exact(0x0e);\n case \"+\": return exact(0x2014);\n case \"=\": return exact(0x2013);\n case \"s\": return exact(0xa0);\n case \"~\": return exact(0x2011);\n case \"-\": return exact(0xad);\n case \"w\": return { k: \"rep\", body: charNode((cp) => isSpace(cp)), min: 1, max: -1, lazy: false };\n case \"g\": return exact(0xfffc);\n case \"%\": return exact(0xa7);\n case \"v\": return exact(0xb6);\n default: return null;\n }\n}\n\n/** What a `^` code stands for in Replace with. */\nfunction replaceCode(c: string): string | null {\n switch (c) {\n case \"p\": return FIND_PARAGRAPH_MARK;\n case \"t\": return \"\\t\";\n case \"^\": return \"^\";\n case \"l\": return \"\\n\";\n case \"m\": return \"\\u000c\";\n case \"n\": return \"\\u000e\";\n case \"+\": return \"\\u2014\";\n case \"=\": return \"\\u2013\";\n case \"s\": return \"\\u00a0\";\n case \"~\": return \"\\u2011\";\n case \"-\": return \"\\u00ad\";\n case \"%\": return \"\\u00a7\";\n case \"v\": return \"\\u00b6\";\n default: return null;\n }\n}\n\n/** A character code (`^13`, `^0151`, `^u8212`) as the character it stands for. */\nfunction codeChar(n: number): number | null {\n switch (n) {\n case 13: return PARA;\n case 11: return 10;\n case 12: return 0x0c;\n case 14: return 0x0e;\n case 30: return 0x2011;\n case 31: return 0xad;\n }\n if (n > 0x10ffff || (n >= 0xd800 && n <= 0xdfff)) return null;\n // Control characters other than tab stand for nothing here.\n if ((n < 32 && n !== 9) || (n >= 0x7f && n < 0xa0)) return null;\n return n;\n}\n\n/** A numeric code after `^` starting at `chars[i]`: the code point and characters used. */\nfunction numericCode(chars: string[], i: number): { cp: number; used: number } | null {\n const unicode = chars[i] === \"u\";\n const start = unicode ? i + 1 : i;\n const max = unicode ? 5 : 4;\n let digits = \"\";\n for (let j = start; j < chars.length && digits.length < max && /[0-9]/.test(chars[j]); j++) digits += chars[j];\n if (!digits) return null;\n const cp = codeChar(parseInt(digits, 10));\n return cp === null ? null : { cp, used: start - i + digits.length };\n}\n\nconst toChars = (s: string): string[] => Array.from(s);\nconst cpOf = (ch: string): number => ch.codePointAt(0)!;\n\n/** Normal search: literal text with `^` codes, optionally skipping punctuation and white space. */\nfunction parseSpecial(query: string, o: FindOptions, caseInsensitive: boolean): { node: Node; spans: boolean } {\n const chars = toChars(query);\n const atoms: Node[] = [];\n let spans = false;\n let i = 0;\n while (i < chars.length) {\n const c = chars[i++];\n if (c === \"^\" && !o.literal && i < chars.length) {\n const n = chars[i];\n const code = findCode(n);\n if (code) {\n if (n === \"p\") spans = true;\n atoms.push(code);\n i++;\n continue;\n }\n const num = numericCode(chars, i);\n if (num) {\n if (num.cp === PARA) spans = true;\n atoms.push(literalNode(num.cp, caseInsensitive));\n i += num.used;\n continue;\n }\n // Not a code: the caret itself.\n }\n const cp = cpOf(c);\n if ((o.ignorePunctuation && isPunct(cp)) || (o.ignoreWhitespace && isSpace(cp))) continue;\n atoms.push(literalNode(cp, caseInsensitive));\n }\n const filler: CharTest | null =\n o.ignorePunctuation && o.ignoreWhitespace\n ? (cp) => isPunct(cp) || isSpace(cp)\n : o.ignorePunctuation\n ? (cp) => isPunct(cp)\n : o.ignoreWhitespace\n ? (cp) => isSpace(cp)\n : null;\n const items: Node[] = [];\n atoms.forEach((atom, index) => {\n if (index > 0 && filler) items.push(star(charNode(filler), false));\n items.push(atom);\n });\n return { node: { k: \"cat\", items }, spans };\n}\n\n/** `{n}`, `{n,}`, `{n,m}` (and `{,m}`). */\nfunction parseCount(body: string): { min: number; max: number } {\n const bad = () => new PatternError(\"invalid_pattern\", `{${body}} is not a valid count`);\n const num = (s: string): number | null => {\n const t = s.trim();\n if (!t) return null;\n if (!/^[0-9]+$/.test(t)) throw bad();\n const n = parseInt(t, 10);\n if (n > MAX_COUNT) throw new PatternError(\"invalid_pattern\", `counts go up to ${MAX_COUNT}`);\n return n;\n };\n const sep = body.search(/[,;]/);\n if (sep < 0) {\n const n = num(body);\n if (n === null) throw bad();\n return { min: n, max: n };\n }\n const a = num(body.slice(0, sep)) ?? 0;\n const b = num(body.slice(sep + 1));\n if (b !== null && b < a) throw bad();\n return { min: a, max: b ?? -1 };\n}\n\n/** `[abc]`, `[a-z]`, `[!x]`: the characters inside are literal. */\nfunction parseClass(inner: string[]): CharTest {\n let negated = false;\n if (inner[0] === \"!\") {\n negated = true;\n inner = inner.slice(1);\n }\n if (inner.length === 0) throw new PatternError(\"invalid_pattern\", \"[ ] needs at least one character\");\n const singles = new Set<number>();\n const ranges: [number, number][] = [];\n let i = 0;\n while (i < inner.length) {\n let c = inner[i];\n if (c === \"\\\\\" && i + 1 < inner.length) c = inner[++i];\n i++;\n if (inner[i] === \"-\" && i + 1 < inner.length) {\n const hi = inner[i + 1];\n if (cpOf(hi) < cpOf(c)) throw new PatternError(\"invalid_pattern\", `[${c}-${hi}] is not in ascending order`);\n ranges.push([cpOf(c), cpOf(hi)]);\n i += 2;\n } else {\n singles.add(cpOf(c));\n }\n }\n const inSet = (cp: number) => singles.has(cp) || ranges.some(([lo, hi]) => cp >= lo && cp <= hi);\n return negated ? (cp) => cp !== PARA && !inSet(cp) : (cp) => inSet(cp);\n}\n\n/** \"Use wildcards\" search. */\nfunction parseWildcards(query: string): { node: Node; spans: boolean; groups: number } {\n const chars = toChars(query);\n const stack: { items: Node[]; group: number }[] = [{ items: [], group: 0 }];\n let groups = 0;\n let spans = false;\n const top = () => stack[stack.length - 1].items;\n const quantify = (min: number, max: number, what: string) => {\n const items = top();\n const last = items[items.length - 1];\n if (!last || last.k === \"assert\" || last.k === \"rep\") {\n throw new PatternError(\"invalid_pattern\", `${what} needs something to repeat before it`);\n }\n items[items.length - 1] = { k: \"rep\", body: last, min, max, lazy: false };\n };\n let i = 0;\n while (i < chars.length) {\n const c = chars[i++];\n switch (c) {\n case \"?\":\n top().push(charNode(ANY));\n break;\n case \"*\":\n top().push(star(charNode(ANY), true));\n break;\n case \"@\":\n quantify(1, -1, \"@\");\n break;\n case \"<\":\n top().push({ k: \"assert\", kind: \"wordStart\" });\n break;\n case \">\":\n top().push({ k: \"assert\", kind: \"wordEnd\" });\n break;\n case \"(\":\n stack.push({ items: [], group: ++groups });\n break;\n case \")\": {\n if (stack.length === 1) throw new PatternError(\"invalid_pattern\", \"a ) has no opening (\");\n const frame = stack.pop()!;\n top().push({ k: \"group\", index: frame.group, body: { k: \"cat\", items: frame.items } });\n break;\n }\n case \"{\": {\n const end = chars.indexOf(\"}\", i);\n if (end < 0) throw new PatternError(\"invalid_pattern\", \"a { needs a closing }\");\n const { min, max } = parseCount(chars.slice(i, end).join(\"\"));\n quantify(min, max, `{${chars.slice(i, end).join(\"\")}}`);\n i = end + 1;\n break;\n }\n case \"[\": {\n const end = chars.indexOf(\"]\", i);\n if (end < 0) throw new PatternError(\"invalid_pattern\", \"a [ needs a closing ]\");\n top().push(charNode(parseClass(chars.slice(i, end))));\n i = end + 1;\n break;\n }\n case \"\\\\\": {\n if (i >= chars.length) {\n top().push(exact(92));\n } else if (/[0-9]/.test(chars[i])) {\n throw new PatternError(\"invalid_pattern\", \"back-references (\\\\1) work in Replace with, not in Find what\");\n } else {\n top().push(exact(cpOf(chars[i++])));\n }\n break;\n }\n case \"^\": {\n if (i >= chars.length) {\n top().push(exact(94));\n break;\n }\n const n = chars[i];\n const code = findCode(n);\n if (code) {\n if (n === \"p\") spans = true;\n top().push(code);\n i++;\n break;\n }\n const num = numericCode(chars, i);\n if (num) {\n if (num.cp === PARA) spans = true;\n top().push(exact(num.cp));\n i += num.used;\n } else {\n top().push(exact(94));\n }\n break;\n }\n default:\n top().push(exact(cpOf(c)));\n }\n }\n if (stack.length > 1) throw new PatternError(\"invalid_pattern\", \"a ( needs a closing )\");\n return { node: { k: \"cat\", items: stack[0].items }, spans, groups };\n}\n\n// ---------------------------------------------------------------------------\n// Program and Pike VM\n// ---------------------------------------------------------------------------\n\nenum Op {\n Char,\n Split,\n Jmp,\n Save,\n Assert,\n Match,\n}\n\ntype Inst =\n | { op: Op.Char; test: CharTest }\n | { op: Op.Split; x: number; y: number }\n | { op: Op.Jmp; x: number }\n | { op: Op.Save; n: number }\n | { op: Op.Assert; kind: AssertKind }\n | { op: Op.Match };\n\nfunction compileProgram(node: Node): Inst[] {\n const prog: Inst[] = [];\n const push = (inst: Inst): number => {\n if (prog.length >= MAX_PROGRAM_SIZE) {\n throw new PatternError(\"too_complex\", \"the pattern is too complex (too many repeats)\");\n }\n prog.push(inst);\n return prog.length - 1;\n };\n const emit = (n: Node): void => {\n switch (n.k) {\n case \"char\":\n push({ op: Op.Char, test: n.test });\n return;\n case \"cat\":\n n.items.forEach(emit);\n return;\n case \"group\":\n push({ op: Op.Save, n: 2 * n.index });\n emit(n.body);\n push({ op: Op.Save, n: 2 * n.index + 1 });\n return;\n case \"assert\":\n push({ op: Op.Assert, kind: n.kind });\n return;\n case \"rep\": {\n for (let k = 0; k < n.min; k++) emit(n.body);\n if (n.max < 0) {\n const split = push({ op: Op.Split, x: 0, y: 0 });\n emit(n.body);\n push({ op: Op.Jmp, x: split });\n const exit = prog.length;\n const inst = prog[split] as { op: Op.Split; x: number; y: number };\n inst.x = n.lazy ? exit : split + 1;\n inst.y = n.lazy ? split + 1 : exit;\n return;\n }\n const splits: number[] = [];\n for (let k = n.min; k < n.max; k++) {\n splits.push(push({ op: Op.Split, x: 0, y: 0 }));\n emit(n.body);\n }\n const exit = prog.length;\n for (const s of splits) {\n const inst = prog[s] as { op: Op.Split; x: number; y: number };\n inst.x = n.lazy ? exit : s + 1;\n inst.y = n.lazy ? s + 1 : exit;\n }\n return;\n }\n }\n };\n push({ op: Op.Save, n: 0 });\n emit(node);\n push({ op: Op.Save, n: 1 });\n push({ op: Op.Match });\n return prog;\n}\n\nfunction checkAssert(kind: AssertKind, hay: string, pos: number): boolean {\n const before = isWordChar(cpBefore(hay, pos));\n const after = isWordChar(cpAt(hay, pos));\n switch (kind) {\n case \"boundary\": return before !== after;\n case \"wordStart\": return !before && after;\n case \"wordEnd\": return before && !after;\n }\n}\n\n/**\n * Leftmost-first search (Perl/Rust priorities: greedy, lazy) with a Pike VM:\n * every position is visited once per live instruction, so time is\n * O(text × program) whatever the pattern.\n */\nfunction pikeExec(\n prog: Inst[],\n groupCount: number,\n caseInsensitive: boolean,\n hay: string,\n start: number,\n end: number,\n budget: SearchBudget,\n): PatternMatch | null | \"budget\" {\n const ncap = 2 * (groupCount + 1);\n const mark = new Int32Array(prog.length);\n let gen = 1;\n let clistPc: number[] = [];\n let clistCaps: Int32Array[] = [];\n let nlistPc: number[] = [];\n let nlistCaps: Int32Array[] = [];\n const stackPc: number[] = [];\n const stackCaps: Int32Array[] = [];\n let matched: Int32Array | null = null;\n const initial = new Int32Array(ncap).fill(-1);\n\n const add = (listPc: number[], listCaps: Int32Array[], pc0: number, caps0: Int32Array, pos: number) => {\n stackPc.push(pc0);\n stackCaps.push(caps0);\n while (stackPc.length) {\n const pc = stackPc.pop()!;\n const caps = stackCaps.pop()!;\n if (mark[pc] === gen) continue;\n mark[pc] = gen;\n const inst = prog[pc];\n switch (inst.op) {\n case Op.Jmp:\n stackPc.push(inst.x);\n stackCaps.push(caps);\n break;\n case Op.Split:\n stackPc.push(inst.y, inst.x);\n stackCaps.push(caps, caps);\n break;\n case Op.Save: {\n const next = caps.slice();\n next[inst.n] = pos;\n stackPc.push(pc + 1);\n stackCaps.push(next);\n break;\n }\n case Op.Assert:\n if (checkAssert(inst.kind, hay, pos)) {\n stackPc.push(pc + 1);\n stackCaps.push(caps);\n }\n break;\n default:\n listPc.push(pc);\n listCaps.push(caps);\n }\n }\n };\n\n let i = start;\n if (budget.steps <= 0 || now() > budget.deadline) {\n budget.exhausted = true;\n return \"budget\";\n }\n let steps = 0;\n for (;;) {\n if (!matched) add(clistPc, clistCaps, 0, initial, i);\n const cp = i < end ? hay.codePointAt(i)! : -1;\n const width = cp > 0xffff ? 2 : 1;\n if (clistPc.length === 0) {\n // Nothing alive here (e.g. an assertion failed at the start): move on.\n if (matched || i >= end) break;\n gen++;\n i += width;\n continue;\n }\n const folded = cp >= 0 && caseInsensitive ? foldCodePoint(cp) : cp;\n gen++;\n nlistPc = [];\n nlistCaps = [];\n for (let t = 0; t < clistPc.length; t++) {\n if (++steps >= 4096) {\n budget.steps -= steps;\n steps = 0;\n if (budget.steps <= 0 || now() > budget.deadline) {\n budget.exhausted = true;\n return \"budget\";\n }\n }\n const inst = prog[clistPc[t]];\n if (inst.op === Op.Char) {\n if (cp >= 0 && inst.test(cp, folded)) add(nlistPc, nlistCaps, clistPc[t] + 1, clistCaps[t], i + width);\n } else if (inst.op === Op.Match) {\n matched = clistCaps[t];\n // Lower-priority threads lose to this match.\n break;\n }\n }\n clistPc = nlistPc;\n clistCaps = nlistCaps;\n if (i >= end) break;\n i += width;\n }\n budget.steps -= steps;\n if (!matched) return null;\n const groups: (string | undefined)[] = [];\n for (let g = 0; g <= groupCount; g++) {\n const a = matched[2 * g];\n const b = matched[2 * g + 1];\n groups.push(a >= 0 && b >= 0 ? hay.slice(a, b) : undefined);\n }\n return { start: matched[0], end: matched[1], groups };\n}\n\n// ---------------------------------------------------------------------------\n// Raw regex mode\n// ---------------------------------------------------------------------------\n\nconst WORD_CLASS = \"[\\\\p{L}\\\\p{M}\\\\p{Nd}\\\\p{Pc}]\";\nconst REGEX_BOUNDARY = `(?:(?<=${WORD_CLASS})(?!${WORD_CLASS})|(?<!${WORD_CLASS})(?=${WORD_CLASS}))`;\n\n/**\n * Rejects a repeated group that itself contains a repeat (`(a+)+`, `(\\w*)*`),\n * the shape behind most catastrophic backtracking in `RegExp`.\n */\nfunction hasNestedRepeat(source: string): boolean {\n /** The quantifier at `i`: whether it repeats at all, and whether more than once. */\n const quantifierAt = (i: number): { repeats: boolean; many: boolean } => {\n const c = source[i];\n if (c === \"*\" || c === \"+\") return { repeats: true, many: true };\n if (c === \"{\") {\n const m = /^\\{(\\d*)(,?)(\\d*)\\}/.exec(source.slice(i));\n if (m) {\n const max = m[2] ? (m[3] ? Number(m[3]) : Infinity) : Number(m[1]);\n return { repeats: max > 1, many: max > 1 };\n }\n }\n return { repeats: false, many: false };\n };\n // For each open group: whether it contains a repeat.\n const stack: boolean[] = [];\n let inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i];\n if (c === \"\\\\\") {\n i++;\n continue;\n }\n if (inClass) {\n if (c === \"]\") inClass = false;\n continue;\n }\n if (c === \"[\") {\n inClass = true;\n } else if (c === \"(\") {\n stack.push(false);\n } else if (c === \")\") {\n const inner = stack.pop() ?? false;\n const q = quantifierAt(i + 1);\n if (inner && q.many) return true;\n if (stack.length && (inner || q.repeats)) stack[stack.length - 1] = true;\n } else if (stack.length && quantifierAt(i).repeats) {\n stack[stack.length - 1] = true;\n }\n }\n return false;\n}\n\nfunction compileRegex(query: string, o: FindOptions): CompiledFindPattern {\n if (hasNestedRepeat(query)) {\n throw new PatternError(\n \"too_complex\",\n \"a repeated group containing a repeat, like (a+)+, can take exponential time; rewrite it without nesting\",\n );\n }\n let source = query;\n if (o.wholeWord || (o.matchPrefix && o.matchSuffix)) source = `${REGEX_BOUNDARY}(?:${query})${REGEX_BOUNDARY}`;\n else if (o.matchPrefix) source = `${REGEX_BOUNDARY}(?:${query})`;\n else if (o.matchSuffix) source = `(?:${query})${REGEX_BOUNDARY}`;\n let re: RegExp;\n try {\n re = new RegExp(source, o.matchCase ? \"gu\" : \"giu\");\n } catch (error) {\n throw new PatternError(\"invalid_pattern\", `bad pattern: ${error instanceof Error ? error.message : String(error)}`);\n }\n let slicedFor: { hay: string; end: number; text: string } | null = null;\n return {\n mode: \"regex\",\n spansParagraphs: false,\n caseInsensitive: !o.matchCase,\n groupCount: 0,\n exec(hay, start, end, budget) {\n if (now() > budget.deadline) {\n budget.exhausted = true;\n return \"budget\";\n }\n let text = hay;\n if (end < hay.length) {\n if (!slicedFor || slicedFor.hay !== hay || slicedFor.end !== end) {\n slicedFor = { hay, end, text: hay.slice(0, end) };\n }\n text = slicedFor.text;\n }\n re.lastIndex = start;\n const m = re.exec(text);\n if (!m) return null;\n return { start: m.index, end: m.index + m[0].length, groups: Array.from(m) };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Translates Word's Find what text. Never throws: invalid text returns `{ ok: false, error }`. */\nexport function compileFindPattern(query: string, options: FindOptions = {}): CompileFindPatternResult {\n try {\n if (Array.from(query).length > MAX_FIND_PATTERN_LENGTH) {\n throw new PatternError(\"too_long\", `the Find what text is longer than ${MAX_FIND_PATTERN_LENGTH} characters`);\n }\n if (options.regex) return { ok: true, pattern: compileRegex(query, options) };\n\n const wildcards = !!options.wildcards && !options.literal;\n // Word's wildcard search always matches case.\n const caseInsensitive = !options.matchCase && !wildcards;\n let node: Node;\n let spans: boolean;\n let groups = 0;\n if (wildcards) {\n ({ node, spans, groups } = parseWildcards(query));\n } else {\n ({ node, spans } = parseSpecial(query, options, caseInsensitive));\n const before = options.wholeWord || options.matchPrefix;\n const after = options.wholeWord || options.matchSuffix;\n if (before || after) {\n const items: Node[] = [];\n if (before) items.push({ k: \"assert\", kind: \"boundary\" });\n items.push(node);\n if (after) items.push({ k: \"assert\", kind: \"boundary\" });\n node = { k: \"cat\", items };\n }\n }\n const prog = compileProgram(node);\n return {\n ok: true,\n pattern: {\n mode: wildcards ? \"wildcards\" : \"special\",\n spansParagraphs: spans,\n caseInsensitive,\n groupCount: groups,\n exec: (hay, start, end, budget) => pikeExec(prog, groups, caseInsensitive, hay, start, end, budget),\n },\n };\n } catch (error) {\n if (error instanceof PatternError) return { ok: false, error: { code: error.code, message: error.message } };\n return { ok: false, error: { code: \"invalid_pattern\", message: error instanceof Error ? error.message : String(error) } };\n }\n}\n\nexport interface FindAllOptions {\n /**\n * Offsets where the live text breaks (e.g. where tracked-deleted text was\n * skipped): no match spans a cut.\n */\n cuts?: readonly number[];\n budget?: SearchBudget;\n /** Stop after this many matches (default 10 000). */\n maxMatches?: number;\n}\n\nexport interface FindAllResult {\n matches: PatternMatch[];\n /** The search stopped early (match cap or time budget). */\n truncated: boolean;\n}\n\n/**\n * Every non-empty match in `hay`, left to right, without overlaps. Empty\n * matches are stepped past so the search always moves on.\n */\nexport function findAllMatches(\n pattern: CompiledFindPattern,\n hay: string,\n options: FindAllOptions = {},\n): FindAllResult {\n const budget = options.budget ?? createSearchBudget();\n const maxMatches = options.maxMatches ?? 10_000;\n const cuts = [...(options.cuts ?? []), hay.length].sort((a, b) => a - b);\n const matches: PatternMatch[] = [];\n let from = 0;\n for (const cut of cuts) {\n if (cut <= from) continue;\n let pos = from;\n from = cut;\n for (;;) {\n const m = pattern.exec(hay, pos, cut, budget);\n if (m === \"budget\") return { matches, truncated: true };\n if (!m) break;\n const empty = m.end === m.start;\n const next = empty ? m.end + (cpAt(hay, m.end) > 0xffff ? 2 : 1) : m.end;\n if (next > cut) break;\n pos = next;\n if (empty) continue;\n matches.push(m);\n if (matches.length >= maxMatches) return { matches, truncated: true };\n }\n }\n return { matches, truncated: false };\n}\n\n/** A piece of Replace with text. */\nexport type ReplacePiece =\n | { type: \"text\"; text: string }\n /** `^&`: the text found. */\n | { type: \"found\" }\n /** `\\n` with wildcards: group `n`. */\n | { type: \"group\"; index: number }\n /** `^c`: the clipboard. */\n | { type: \"clipboard\" };\n\n/** Reads Replace with text: `^` codes (unless `literal`), and `\\1`–`\\9` with wildcards. Regex mode is literal. */\nexport function parseReplacement(replacement: string, options: FindOptions = {}): ReplacePiece[] {\n if (options.literal || options.regex) return replacement ? [{ type: \"text\", text: replacement }] : [];\n const chars = toChars(replacement);\n const out: ReplacePiece[] = [];\n let cur = \"\";\n const flush = () => {\n if (cur) out.push({ type: \"text\", text: cur });\n cur = \"\";\n };\n let i = 0;\n while (i < chars.length) {\n const c = chars[i++];\n if (c === \"\\\\\" && options.wildcards && i < chars.length) {\n const d = chars[i];\n if (/[1-9]/.test(d)) {\n flush();\n out.push({ type: \"group\", index: Number(d) });\n } else {\n cur += d;\n }\n i++;\n continue;\n }\n if (c === \"^\" && i < chars.length) {\n const n = chars[i];\n if (n === \"&\" || n === \"c\") {\n flush();\n out.push(n === \"&\" ? { type: \"found\" } : { type: \"clipboard\" });\n i++;\n continue;\n }\n const code = replaceCode(n);\n if (code !== null) {\n cur += code;\n i++;\n continue;\n }\n const num = numericCode(chars, i);\n if (num) {\n cur += String.fromCodePoint(num.cp);\n i += num.used;\n continue;\n }\n }\n cur += c;\n }\n flush();\n return out;\n}\n\n/** Fills in Replace with text for one match. Paragraph marks in the result are `\\r`. */\nexport function expandReplacement(pieces: readonly ReplacePiece[], match: PatternMatch, clipboardText = \"\"): string {\n let out = \"\";\n for (const piece of pieces) {\n switch (piece.type) {\n case \"text\":\n out += piece.text;\n break;\n case \"found\":\n out += match.groups[0] ?? \"\";\n break;\n case \"group\":\n out += match.groups[piece.index] ?? \"\";\n break;\n case \"clipboard\":\n out += clipboardText.replace(/\\r\\n/g, \"\\r\").replace(/\\n/g, \"\\r\");\n break;\n }\n }\n return out;\n}\n","// Portions ported from wordcraft/crates/engine/src/cmd/edit.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { Mark as ProsemirrorMark, Node as ProsemirrorNode, Schema } from \"@tiptap/pm/model\";\nimport type { Transaction } from \"@tiptap/pm/state\";\nimport {\n FIND_PARAGRAPH_MARK,\n compileFindPattern,\n createSearchBudget,\n expandReplacement,\n findAllMatches,\n parseReplacement,\n type FindOptions,\n type FindPatternError,\n} from \"./pattern\";\n\n/** Name of the tracked-deletion mark (see `track-changes.ts`); deleted text is not searched. */\nconst DELETION_MARK = \"deletion\";\n/** Review marks the replacement text does not inherit from the found text. */\nconst DROPPED_REPLACEMENT_MARKS = new Set([DELETION_MARK, \"formatChange\"]);\n/** Stands for an inline node other than text or a hard break (`^g`). */\nconst OBJECT_CHAR = \"\\ufffc\";\n\nexport interface FindMatch {\n /** Document position of the first matched character. */\n from: number;\n /** Document position after the last matched character. */\n to: number;\n /** The matched text (`\\r` for paragraph marks, `\\n` for hard breaks). */\n text: string;\n /** The Replace with text for this match (`\\r` splits paragraphs). */\n replacement: string;\n}\n\nexport interface DocumentSearchOptions {\n /** Replace with text (`^&`, `^c`, `\\1`…). */\n replacement?: string;\n /** Text of `^c` in the replacement. */\n clipboardText?: string;\n /** Wall-clock budget for the whole search (default 250 ms). */\n timeLimitMs?: number;\n /** Match cap (default 10 000). */\n maxMatches?: number;\n}\n\nexport interface DocumentSearchResult {\n matches: FindMatch[];\n /** The search stopped early at the match cap or time budget. */\n truncated: boolean;\n error: FindPatternError | null;\n}\n\ninterface Block {\n node: ProsemirrorNode;\n pos: number;\n parent: ProsemirrorNode | null;\n index: number;\n}\n\n/**\n * Finds `query` in a document. Each textblock is read as text without\n * tracked-deleted runs (a deletion \"cuts\" the text, so no match spans it, but\n * word boundaries see the live text on both sides); a pattern that can match\n * `^p` reads runs of sibling textblocks as one text with `\\r` between them.\n */\nexport function searchDocument(\n doc: ProsemirrorNode,\n query: string,\n options: FindOptions = {},\n searchOptions: DocumentSearchOptions = {},\n): DocumentSearchResult {\n if (!query) return { matches: [], truncated: false, error: null };\n const compiled = compileFindPattern(query, options);\n if (!compiled.ok) return { matches: [], truncated: false, error: compiled.error };\n const pattern = compiled.pattern;\n const pieces = parseReplacement(searchOptions.replacement ?? \"\", options);\n const budget = createSearchBudget({ timeLimitMs: searchOptions.timeLimitMs });\n const maxMatches = searchOptions.maxMatches ?? 10_000;\n\n const blocks: Block[] = [];\n doc.descendants((node, pos, parent, index) => {\n if (!node.isTextblock) return true;\n blocks.push({ node, pos, parent, index });\n return false;\n });\n\n // Textblocks read as one text: consecutive siblings when the pattern spans paragraphs.\n const chunks: Block[][] = [];\n blocks.forEach((block, i) => {\n const prev = blocks[i - 1];\n const joins =\n pattern.spansParagraphs && prev && prev.parent === block.parent && prev.index + 1 === block.index;\n if (joins) chunks[chunks.length - 1].push(block);\n else chunks.push([block]);\n });\n\n const matches: FindMatch[] = [];\n let truncated = false;\n for (const chunk of chunks) {\n let hay = \"\";\n // Document position of each hay offset, and the position after it.\n const posOf: number[] = [];\n const endOf: number[] = [];\n const cuts: number[] = [];\n chunk.forEach((block, k) => {\n const contentStart = block.pos + 1;\n block.node.forEach((child, offset) => {\n const at = contentStart + offset;\n if (child.marks.some((m) => m.type.name === DELETION_MARK)) {\n if (cuts[cuts.length - 1] !== hay.length) cuts.push(hay.length);\n return;\n }\n if (child.isText) {\n const text = child.text ?? \"\";\n for (let j = 0; j < text.length; j++) {\n posOf.push(at + j);\n endOf.push(at + j + 1);\n }\n hay += text;\n } else {\n posOf.push(at);\n endOf.push(at + child.nodeSize);\n hay += child.type.name === \"hardBreak\" ? \"\\n\" : OBJECT_CHAR;\n }\n });\n const next = chunk[k + 1];\n if (next) {\n posOf.push(contentStart + block.node.content.size);\n endOf.push(next.pos + 1);\n hay += FIND_PARAGRAPH_MARK;\n }\n });\n if (!hay) continue;\n const result = findAllMatches(pattern, hay, {\n cuts,\n budget,\n maxMatches: maxMatches - matches.length,\n });\n for (const m of result.matches) {\n matches.push({\n from: posOf[m.start],\n to: endOf[m.end - 1],\n text: m.groups[0] ?? hay.slice(m.start, m.end),\n replacement: expandReplacement(pieces, m, searchOptions.clipboardText ?? \"\"),\n });\n }\n if (result.truncated) {\n truncated = true;\n break;\n }\n }\n return { matches, truncated, error: null };\n}\n\n/** Marks the replacement for a match inherits: the found text's, minus tracked-change marks. */\nfunction replacementMarks(doc: ProsemirrorNode, from: number, to: number): readonly ProsemirrorMark[] {\n const $from = doc.resolve(from);\n const node = from < to ? $from.nodeAfter : null;\n const marks = node ? node.marks : $from.marks();\n return marks.filter((m) => !DROPPED_REPLACEMENT_MARKS.has(m.type.name));\n}\n\n/** Inline content for a piece of replacement text: `\\n` becomes a hard break when the schema has one. */\nfunction inlineContent(schema: Schema, text: string, marks: readonly ProsemirrorMark[]): ProsemirrorNode[] {\n const nodes: ProsemirrorNode[] = [];\n const hardBreak = schema.nodes.hardBreak;\n const parts = hardBreak ? text.split(\"\\n\") : [text];\n parts.forEach((part, i) => {\n if (i > 0) nodes.push(hardBreak.create(null, null, marks));\n if (part) nodes.push(schema.text(part, marks));\n });\n return nodes;\n}\n\n/**\n * Replaces matches in one transaction, last first so earlier positions stay\n * valid. A paragraph mark (`\\r` or U+2029) in a replacement splits the\n * paragraph. Returns the mapped end of each replacement (in match order).\n */\nexport function applyReplacements(tr: Transaction, matches: readonly FindMatch[]): number[] {\n const ends: number[] = new Array(matches.length);\n const schema = tr.doc.type.schema;\n for (let i = matches.length - 1; i >= 0; i--) {\n const { from, to, replacement } = matches[i];\n const marks = replacementMarks(tr.doc, from, to);\n const parts = replacement.split(/[\\r\\u2029]/);\n const stepsBefore = tr.steps.length;\n const first = inlineContent(schema, parts[0], marks);\n if (first.length) tr.replaceWith(from, to, first);\n else if (to > from) tr.delete(from, to);\n let pos = tr.mapping.slice(stepsBefore).map(to, 1);\n for (let k = 1; k < parts.length; k++) {\n tr.split(pos);\n pos += 2;\n const content = inlineContent(schema, parts[k], marks);\n if (content.length) {\n tr.insert(pos, content);\n pos += content.reduce((size, node) => size + node.nodeSize, 0);\n }\n }\n // Positions of later replacements were already mapped; record this one's end\n // and shift the later ends by what this replacement changed.\n const map = tr.mapping.slice(stepsBefore);\n for (let j = i + 1; j < matches.length; j++) ends[j] = map.map(ends[j], 1);\n ends[i] = pos;\n }\n return ends;\n}\n","import { Extension, Mark, mergeAttributes, type Editor } from \"@tiptap/core\";\nimport { Plugin, PluginKey, type EditorState, type Transaction } from \"@tiptap/pm/state\";\nimport type { Node as ProsemirrorNode, Mark as ProsemirrorMark } from \"@tiptap/pm/model\";\nimport {\n NORMAL_STYLE_ID,\n StyleRegistry,\n createStyleRegistry,\n isValidStyleId,\n type CharacterFormat,\n type ParagraphFormat,\n type StyleDefinition,\n type StyleRegistrySnapshot,\n} from \"./registry\";\n\n/** Node attribute naming a block's paragraph style (`data-style` in HTML). */\nexport const STYLE_ID_ATTRIBUTE = \"styleId\";\n/** Mark applying a character style (`<span data-char-style>`). */\nexport const CHARACTER_STYLE_MARK_NAME = \"characterStyle\";\n\nexport interface ParagraphStylesOptions {\n /** The style registry. Defaults to a new registry with the built-in styles per editor. */\n registry: StyleRegistry | null;\n /** Block types that carry the `styleId` attribute. */\n types: string[];\n /**\n * Inject a `<style>` element with `registry.toCSS({ scope })` while the\n * editor exists (kept up to date). Default `true`.\n */\n injectCSS: boolean;\n /** Selector the injected CSS is scoped to. Default `.ProseMirror`. */\n cssScope: string;\n /** Nonce of the injected `<style>` element (Content Security Policy). */\n cssNonce?: string;\n /**\n * Applying a paragraph style to a partial selection inside one paragraph\n * applies its linked character style instead (as in Word). Default `true`.\n */\n linkedCharacterStyles: boolean;\n}\n\nexport interface ParagraphStylesStorage {\n registry: StyleRegistry;\n}\n\nexport interface CreateStyleFromSelectionOptions {\n /** Id of the new style. Default: derived from the name. */\n id?: string;\n /** Base style. Default: the style at the selection. */\n basedOn?: string | null;\n /** Apply the new style to the selected paragraphs. Default `true`. */\n apply?: boolean;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n paragraphStyles: {\n /** Applies a paragraph style to the selected blocks (changing headings/code blocks as the style needs). */\n setParagraphStyle: (id: string) => ReturnType;\n /** Resets the selected blocks to the Normal style. */\n clearParagraphStyle: () => ReturnType;\n /** Applies a character style to the selection. */\n setCharacterStyle: (id: string) => ReturnType;\n unsetCharacterStyle: () => ReturnType;\n /**\n * Updates a style (default: the style at the selection) to the direct\n * formatting at the selection (\"Update to match selection\").\n */\n updateParagraphStyleFromSelection: (id?: string) => ReturnType;\n /** Creates a paragraph style from the formatting at the selection (\"New style from selection\"). */\n createParagraphStyleFromSelection: (\n name: string,\n options?: CreateStyleFromSelectionOptions,\n ) => ReturnType;\n };\n }\n}\n\nexport const paragraphStylesPluginKey = new PluginKey(\"paragraphStyles\");\n\n/** The style registry of an editor using `ParagraphStyles`. */\nexport function getStyleRegistry(editor: Editor | null | undefined): StyleRegistry | null {\n return (editor?.storage as any)?.paragraphStyles?.registry ?? null;\n}\n\n/** Heading levels the editor's heading node renders (all levels when unknown). */\nfunction headingLevels(editor: Editor | null | undefined): number[] | null {\n const heading = editor?.extensionManager?.extensions.find((e) => e.name === \"heading\");\n const levels = heading?.options?.levels;\n return Array.isArray(levels) ? levels : null;\n}\n\n/**\n * Whether a paragraph style can be applied in this editor: its block type is\n * in the schema (and, for headings, its level is configured).\n */\nexport function isParagraphStyleAvailable(editor: Editor, registry: StyleRegistry, id: string): boolean {\n const style = registry.get(id);\n if (!style || style.kind !== \"paragraph\") return false;\n const block = registry.resolve(id).block;\n if (!editor.schema.nodes[block.type]) return false;\n if (block.type === \"heading\") {\n const levels = headingLevels(editor);\n if (levels && !levels.includes(Number(block.attrs?.level))) return false;\n }\n return true;\n}\n\n/** The paragraph style of the textblock at `pos` (defaults to the selection start). */\nexport function getParagraphStyleAt(\n state: EditorState,\n registry: StyleRegistry,\n pos: number = state.selection.from,\n): string | null {\n const $pos = state.doc.resolve(Math.max(0, Math.min(pos, state.doc.content.size)));\n const block = $pos.parent;\n if (!block.isTextblock) return null;\n return registry.styleOfBlock(block.type.name, block.attrs);\n}\n\nconst MARK_FORMAT: Record<string, keyof CharacterFormat> = {\n bold: \"bold\",\n italic: \"italic\",\n underline: \"underline\",\n strike: \"strike\",\n};\n\n/** Marks common to all text in the selection (or at the caret). */\nfunction selectionMarks(state: EditorState): readonly ProsemirrorMark[] {\n const { from, to, empty, $from } = state.selection;\n if (empty) return state.storedMarks ?? $from.marks();\n let common: readonly ProsemirrorMark[] | null = null;\n state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return true;\n common = common === null ? node.marks : common.filter((m) => m.isInSet(node.marks));\n return false;\n });\n return common ?? $from.marks();\n}\n\n/**\n * The direct formatting at the selection, as style formats: bold, italic,\n * underline, strike, font family/size, color and highlight from marks, and\n * the alignment of the block.\n */\nexport function captureSelectionFormat(state: EditorState): {\n paragraph: ParagraphFormat;\n character: CharacterFormat;\n} {\n const character: CharacterFormat = {};\n selectionMarks(state).forEach((mark) => {\n const name = mark.type.name;\n if (MARK_FORMAT[name]) (character as any)[MARK_FORMAT[name]] = true;\n if (name === \"textStyle\") {\n if (mark.attrs.fontFamily) character.fontFamily = mark.attrs.fontFamily;\n if (mark.attrs.fontSize) character.fontSize = mark.attrs.fontSize;\n if (mark.attrs.color) character.color = mark.attrs.color;\n }\n if (name === \"highlight\") character.backgroundColor = mark.attrs.color || \"#fef08a\";\n });\n const paragraph: ParagraphFormat = {};\n const align = state.selection.$from.parent.attrs?.textAlign;\n if (align && align !== \"left\") paragraph.textAlign = align;\n return { paragraph, character };\n}\n\n/** Attributes of `node` that the target type also has (alignment, ids, …). */\nfunction carriedAttributes(node: ProsemirrorNode, type: ProsemirrorNode[\"type\"]): Record<string, any> {\n const spec = type.spec.attrs ?? {};\n return Object.fromEntries(Object.entries(node.attrs).filter(([key]) => key in spec));\n}\n\n/**\n * Sets the block at `pos` to style `id`: its node type and attributes follow\n * the style's block, `styleId` is omitted when the style is the block's\n * default (Normal paragraphs, Heading N headings), and alignment is reset to\n * the style's.\n */\nfunction applyStyleToBlock(\n tr: Transaction,\n pos: number,\n id: string,\n registry: StyleRegistry,\n): boolean {\n const node = tr.doc.nodeAt(pos);\n if (!node || !node.isTextblock) return false;\n const resolved = registry.resolve(id);\n const type = tr.doc.type.schema.nodes[resolved.block.type];\n if (!type) return false;\n const blockAttrs = resolved.block.attrs ?? {};\n const isDefault = registry.defaultStyleFor(resolved.block.type, blockAttrs) === id;\n const attrs: Record<string, any> = { ...carriedAttributes(node, type), ...blockAttrs };\n if (STYLE_ID_ATTRIBUTE in (type.spec.attrs ?? {})) attrs[STYLE_ID_ATTRIBUTE] = isDefault ? null : id;\n if (\"textAlign\" in (type.spec.attrs ?? {})) {\n // Direct alignment is reset so the style's (from the stylesheet) shows.\n // With a non-null default alignment, TextAlign renders it inline, which\n // would hide the stylesheet's, so the style's alignment is set directly.\n const fallback = type.spec.attrs!.textAlign.default ?? null;\n attrs.textAlign = fallback === null ? null : resolved.paragraph.textAlign ?? fallback;\n }\n if (node.type === type && Object.entries(attrs).every(([k, v]) => node.attrs[k] === v)) return false;\n try {\n tr.setNodeMarkup(pos, type, attrs);\n } catch {\n // Content that does not fit the new type (e.g. marks in a code block).\n try {\n tr.setBlockType(pos + 1, pos + 1, type, attrs);\n } catch {\n return false;\n }\n }\n return true;\n}\n\n/** Textblocks touched by the selection, as positions. */\nfunction selectedBlocks(state: EditorState): number[] {\n const { from, to } = state.selection;\n const positions: number[] = [];\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock) {\n positions.push(pos);\n return false;\n }\n return true;\n });\n if (positions.length === 0 && state.selection.$from.parent.isTextblock) {\n positions.push(state.selection.$from.before());\n }\n return positions;\n}\n\nfunction setParagraphStyle(\n tr: Transaction,\n state: EditorState,\n id: string,\n registry: StyleRegistry,\n): void {\n const start = tr.steps.length;\n selectedBlocks(state).forEach((pos) => {\n applyStyleToBlock(tr, tr.mapping.slice(start).map(pos), id, registry);\n });\n}\n\n/**\n * Applies the style named by `next` to the block created by pressing Enter\n * at the end of a styled paragraph. Runs on the resulting state, so it\n * works with every Enter implementation (splitBlock, list keymaps, …).\n */\nfunction nextStyleTransaction(\n transactions: readonly Transaction[],\n oldState: EditorState,\n newState: EditorState,\n registry: StyleRegistry,\n): Transaction | null {\n if (transactions.length !== 1) return null;\n const [tr] = transactions;\n if (!tr.docChanged || tr.getMeta(\"uiEvent\") || tr.getMeta(\"history$\") || tr.getMeta(\"y-sync$\")) {\n return null;\n }\n const old = oldState.selection;\n const $old = old.$from;\n if (!old.empty || !$old.parent.isTextblock || $old.parent.type.spec.code) return null;\n if ($old.parentOffset !== $old.parent.content.size) return null;\n if (newState.doc.content.size !== oldState.doc.content.size + 2) return null;\n const $new = newState.selection.$from;\n if (!newState.selection.empty || !$new.parent.isTextblock || $new.parent.content.size !== 0) return null;\n const depth = $new.depth;\n const index = $new.index(depth - 1);\n if (index === 0 || $new.depth !== $old.depth) return null;\n const previous = $new.node(depth - 1).child(index - 1);\n if (!previous.isTextblock || !previous.eq($old.parent)) return null;\n\n const style = registry.styleOfBlock($old.parent.type.name, $old.parent.attrs);\n if (!style) return null;\n const next = registry.nextStyleId(style);\n const current = registry.styleOfBlock($new.parent.type.name, $new.parent.attrs);\n const target = registry.resolve(next).block;\n const typeMatches =\n $new.parent.type.name === target.type &&\n Object.entries(target.attrs ?? {}).every(([k, v]) => $new.parent.attrs[k] === v);\n if (current === next && typeMatches) return null;\n const out = newState.tr;\n if (!applyStyleToBlock(out, $new.before(), next, registry)) return null;\n return out;\n}\n\n/** Character style applied to a run of text. */\nexport const CharacterStyle = Mark.create({\n name: CHARACTER_STYLE_MARK_NAME,\n addAttributes() {\n return {\n [STYLE_ID_ATTRIBUTE]: {\n default: null,\n parseHTML: (el: HTMLElement) => {\n const id = el.getAttribute(\"data-char-style\");\n return isValidStyleId(id) ? id : null;\n },\n renderHTML: (attrs: Record<string, any>) =>\n attrs[STYLE_ID_ATTRIBUTE] ? { \"data-char-style\": attrs[STYLE_ID_ATTRIBUTE] } : {},\n },\n };\n },\n parseHTML() {\n return [{ tag: \"span[data-char-style]\" }];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"span\", mergeAttributes(HTMLAttributes), 0];\n },\n});\n\n/**\n * Paragraph styles (Normal, Title, Heading 1, …) from a `StyleRegistry`:\n * a `styleId` attribute on paragraphs and headings (`data-style` in HTML),\n * a `characterStyle` mark, apply/clear/update/create commands, next-style\n * on Enter and an injected stylesheet. Headings without a `styleId` use\n * Heading N, plain paragraphs Normal, so existing documents are unchanged.\n */\nexport const ParagraphStyles = Extension.create<ParagraphStylesOptions, ParagraphStylesStorage>({\n name: \"paragraphStyles\",\n\n addOptions() {\n return {\n registry: null,\n types: [\"paragraph\", \"heading\", \"codeBlock\"],\n injectCSS: true,\n cssScope: \".ProseMirror\",\n cssNonce: undefined,\n linkedCharacterStyles: true,\n };\n },\n\n addStorage() {\n return { registry: this.options.registry ?? createStyleRegistry() };\n },\n\n addExtensions() {\n return [CharacterStyle];\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n [STYLE_ID_ATTRIBUTE]: {\n default: null,\n keepOnSplit: true,\n parseHTML: (el: HTMLElement) => {\n const id = el.getAttribute(\"data-style\");\n return isValidStyleId(id) ? id : null;\n },\n renderHTML: (attrs: Record<string, any>) => {\n const id = attrs[STYLE_ID_ATTRIBUTE];\n return isValidStyleId(id) ? { \"data-style\": id, class: `pixerate-style-${id}` } : {};\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n const registry = () => this.storage.registry;\n const editor = () => this.editor;\n return {\n setParagraphStyle:\n (id) =>\n ({ state, tr, dispatch }) => {\n const reg = registry();\n if (!isParagraphStyleAvailable(editor(), reg, id)) return false;\n const { $from, $to, empty } = state.selection;\n const linked = this.options.linkedCharacterStyles ? reg.linkedCharacterStyle(id) : undefined;\n const partial =\n !empty &&\n $from.sameParent($to) &&\n $from.parent.isTextblock &&\n ($from.parentOffset > 0 || $to.parentOffset < $from.parent.content.size);\n const markType = state.schema.marks[CHARACTER_STYLE_MARK_NAME];\n if (partial && linked && markType) {\n if (dispatch) {\n tr.addMark($from.pos, $to.pos, markType.create({ [STYLE_ID_ATTRIBUTE]: linked.id }));\n }\n return true;\n }\n if (dispatch) setParagraphStyle(tr, state, id, reg);\n return true;\n },\n clearParagraphStyle:\n () =>\n ({ commands }) =>\n commands.setParagraphStyle(NORMAL_STYLE_ID),\n setCharacterStyle:\n (id) =>\n ({ commands }) => {\n if (registry().get(id)?.kind !== \"character\") return false;\n return commands.setMark(CHARACTER_STYLE_MARK_NAME, { [STYLE_ID_ATTRIBUTE]: id });\n },\n unsetCharacterStyle:\n () =>\n ({ commands }) =>\n commands.unsetMark(CHARACTER_STYLE_MARK_NAME),\n updateParagraphStyleFromSelection:\n (id) =>\n ({ state, dispatch }) => {\n const reg = registry();\n const target = id ?? getParagraphStyleAt(state, reg);\n const style = target ? reg.get(target) : undefined;\n if (!style || style.kind !== \"paragraph\") return false;\n if (dispatch) {\n const captured = captureSelectionFormat(state);\n reg.update(style.id, captured);\n }\n return true;\n },\n createParagraphStyleFromSelection:\n (name, options = {}) =>\n ({ state, tr, dispatch }) => {\n const reg = registry();\n const trimmed = name.trim();\n if (!trimmed) return false;\n const id = options.id ?? reg.newId(trimmed);\n if (!isValidStyleId(id) || reg.get(id)) return false;\n const basedOn =\n options.basedOn === undefined ? getParagraphStyleAt(state, reg) : options.basedOn;\n if (dispatch) {\n const captured = captureSelectionFormat(state);\n const definition: StyleDefinition = {\n id,\n name: trimmed,\n kind: \"paragraph\",\n basedOn: basedOn ?? NORMAL_STYLE_ID,\n paragraph: captured.paragraph,\n character: captured.character,\n priority: 50,\n quick: true,\n };\n reg.upsert(definition);\n if (options.apply !== false) setParagraphStyle(tr, state, id, reg);\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const registry = this.storage.registry;\n return [\n new Plugin({\n key: paragraphStylesPluginKey,\n appendTransaction: (transactions, oldState, newState) =>\n nextStyleTransaction(transactions, oldState, newState, registry),\n }),\n ];\n },\n\n onBeforeCreate() {\n if (!this.options.injectCSS || typeof document === \"undefined\") return;\n const element = document.createElement(\"style\");\n element.setAttribute(\"data-pixerate-paragraph-styles\", \"\");\n if (this.options.cssNonce) element.nonce = this.options.cssNonce;\n document.head.appendChild(element);\n const scope = this.options.cssScope;\n const unsubscribe = this.storage.registry.subscribe(() => {\n element.textContent = this.storage.registry.toCSS({ scope });\n });\n (this.storage as any).cleanup = () => {\n unsubscribe();\n element.remove();\n };\n },\n\n onDestroy() {\n (this.storage as any).cleanup?.();\n },\n});\n\n// ---------------------------------------------------------------------------\n// Store for UI bindings\n// ---------------------------------------------------------------------------\n\nexport interface ParagraphStylesSnapshot {\n /** Paragraph styles for the gallery (quick, not hidden, available in this editor). */\n gallery: readonly StyleDefinition[];\n /** All paragraph styles available in this editor. */\n styles: readonly StyleDefinition[];\n /** Character styles. */\n characterStyles: readonly StyleDefinition[];\n /** The style of the block at the selection. */\n currentStyleId: string | null;\n /** Registry version (changes when styles change). */\n version: number;\n}\n\nexport interface ParagraphStylesStore {\n getSnapshot(): ParagraphStylesSnapshot;\n subscribe(listener: () => void): () => void;\n destroy(): void;\n}\n\nconst EMPTY_STYLES: ParagraphStylesSnapshot = Object.freeze({\n gallery: [],\n styles: [],\n characterStyles: [],\n currentStyleId: null,\n version: -1,\n}) as ParagraphStylesSnapshot;\n\n/**\n * External store over an editor's paragraph styles and the style at the\n * selection, for `useSyncExternalStore` and Svelte runes. Snapshots change\n * only when the styles or the current style change. Listeners are attached\n * to the editor only while subscribed.\n */\nexport function createParagraphStylesStore(editor: Editor | null | undefined): ParagraphStylesStore {\n const registry = getStyleRegistry(editor);\n const listeners = new Set<() => void>();\n let snapshot = EMPTY_STYLES;\n let unsubscribeRegistry: (() => void) | null = null;\n\n const compute = (): ParagraphStylesSnapshot => {\n if (!editor || editor.isDestroyed || !registry) return EMPTY_STYLES;\n const { version } = registry.getSnapshot();\n const currentStyleId = getParagraphStyleAt(editor.state, registry);\n if (snapshot.version === version && snapshot.currentStyleId === currentStyleId) return snapshot;\n if (snapshot.version === version) return { ...snapshot, currentStyleId };\n const styles = registry\n .list(\"paragraph\")\n .filter((style) => !style.hidden && isParagraphStyleAvailable(editor, registry, style.id));\n return {\n gallery: styles.filter((style) => style.quick),\n styles,\n characterStyles: registry.list(\"character\").filter((style) => !style.hidden),\n currentStyleId,\n version,\n };\n };\n\n const update = () => {\n const next = compute();\n if (next !== snapshot) {\n snapshot = next;\n listeners.forEach((listener) => listener());\n }\n };\n\n const detach = () => {\n editor?.off(\"transaction\", update);\n unsubscribeRegistry?.();\n unsubscribeRegistry = null;\n };\n\n return {\n getSnapshot: () => {\n if (!listeners.size) snapshot = compute();\n return snapshot;\n },\n subscribe(listener) {\n if (!listeners.size) {\n snapshot = compute();\n editor?.on(\"transaction\", update);\n unsubscribeRegistry = registry ? registry.subscribe(update) : null;\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (!listeners.size) detach();\n };\n },\n destroy() {\n detach();\n listeners.clear();\n },\n };\n}\n\nexport type { StyleRegistrySnapshot };\n","// Portions ported from wordcraft/crates/doc/src/styles.rs and wordcraft/crates/doc/src/resolve.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/** Paragraph styles format whole blocks; character styles format runs of text. */\nexport type StyleKind = \"paragraph\" | \"character\";\n\n/** Character formatting of a style (CSS values). */\nexport interface CharacterFormat {\n fontFamily?: string;\n /** CSS length, e.g. `\"1.5em\"` or `\"18px\"`. */\n fontSize?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n color?: string;\n backgroundColor?: string;\n letterSpacing?: string;\n textTransform?: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\";\n smallCaps?: boolean;\n}\n\n/** Paragraph formatting of a style (CSS values). */\nexport interface ParagraphFormat {\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\n lineHeight?: string;\n spaceBefore?: string;\n spaceAfter?: string;\n indentLeft?: string;\n indentRight?: string;\n indentFirstLine?: string;\n /** CSS border shorthand, e.g. `\"3px solid currentColor\"`. */\n borderLeft?: string;\n paddingLeft?: string;\n backgroundColor?: string;\n}\n\n/** The block node a paragraph style uses (`heading` with `level` for Heading N). */\nexport interface StyleBlock {\n type: string;\n attrs?: Record<string, any>;\n}\n\nexport interface StyleDefinition {\n /** Stable id (`Heading1`): letters, digits, `_` and `-`, starting with a letter. */\n id: string;\n /** Display name (`Heading 1`). */\n name: string;\n kind: StyleKind;\n /** Style this one inherits from; what it sets wins over its base. */\n basedOn?: string | null;\n /** Style of the paragraph after this one when Enter is pressed at its end (paragraph styles). */\n next?: string | null;\n /** Linked style: a paragraph style's character style, or a character style's paragraph style. */\n linked?: string | null;\n paragraph?: ParagraphFormat;\n character?: CharacterFormat;\n /** Block node of a paragraph style. Inherited along `basedOn`; `paragraph` by default. */\n block?: StyleBlock | null;\n /** Gallery order (lower first). */\n priority?: number;\n /** Shown in the styles gallery. */\n quick?: boolean;\n hidden?: boolean;\n /** Built in (cannot be removed). */\n builtin?: boolean;\n}\n\n/** A style with its `basedOn` chain and the defaults merged. */\nexport interface ResolvedStyle {\n id: string;\n paragraph: ParagraphFormat;\n character: CharacterFormat;\n block: StyleBlock;\n /** Id of the style after Enter at the end of a paragraph. */\n next: string;\n}\n\nexport interface StyleDefaults {\n paragraph?: ParagraphFormat;\n character?: CharacterFormat;\n}\n\nexport interface StyleRegistryOptions {\n /** Styles added to (or replacing) the built-in ones. */\n styles?: readonly StyleDefinition[];\n /** Include the built-in styles. Default `true`. */\n builtins?: boolean;\n /** Document defaults, applied below every style. */\n defaults?: StyleDefaults;\n}\n\nexport interface StyleRegistrySnapshot {\n styles: readonly StyleDefinition[];\n defaults: StyleDefaults;\n /** Increases on every change. */\n version: number;\n}\n\n/** Serializable registry content (`registry.toJSON()`). */\nexport interface StyleRegistryJSON {\n styles: StyleDefinition[];\n defaults: StyleDefaults;\n}\n\nexport interface StyleCSSOptions {\n /** Selector the rules are scoped to. Default `.ProseMirror`. */\n scope?: string;\n /**\n * Element selector of blocks that use a style without naming it\n * (`data-style` absent), e.g. `h2` for Heading 2. Return `null` for none.\n */\n tagFor?: (block: StyleBlock) => string | null;\n}\n\n/** Longest `basedOn` chain followed (cycle and depth guard). */\nconst MAX_CHAIN = 32;\nconst STYLE_ID = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;\n/** CSS values that could escape a declaration or load resources are dropped. */\nconst UNSAFE_CSS = /[;{}<>\\\\]|\\/\\*|url\\s*\\(|expression\\s*\\(|@import|javascript:/i;\n\nexport const NORMAL_STYLE_ID = \"Normal\";\n\nconst PREVIEW_PROPERTIES = new Set([\n \"font-family\",\n \"font-weight\",\n \"font-style\",\n \"color\",\n \"text-decoration-line\",\n \"text-transform\",\n \"letter-spacing\",\n \"font-variant-caps\",\n]);\n\n/** Whether `id` is a valid style id. */\nexport function isValidStyleId(id: unknown): id is string {\n return typeof id === \"string\" && STYLE_ID.test(id);\n}\n\nconst MUTED = \"var(--pixerate-style-muted, #6b7280)\";\nconst HEADING_SIZES = [\"2em\", \"1.5em\", \"1.25em\", \"1.1em\", \"1em\", \"0.9em\"];\n\nfunction builtinStyles(): StyleDefinition[] {\n const styles: StyleDefinition[] = [\n {\n id: NORMAL_STYLE_ID,\n name: \"Normal\",\n kind: \"paragraph\",\n block: { type: \"paragraph\" },\n priority: 0,\n quick: true,\n builtin: true,\n },\n {\n id: \"Title\",\n name: \"Title\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n linked: \"TitleChar\",\n paragraph: { spaceAfter: \"0.25em\", lineHeight: \"1.15\" },\n character: { fontSize: \"2.5em\", bold: true, letterSpacing: \"-0.01em\" },\n priority: 10,\n quick: true,\n builtin: true,\n },\n {\n id: \"Subtitle\",\n name: \"Subtitle\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n linked: \"SubtitleChar\",\n paragraph: { spaceAfter: \"0.75em\" },\n character: { fontSize: \"1.25em\", color: MUTED },\n priority: 11,\n quick: true,\n builtin: true,\n },\n ];\n HEADING_SIZES.forEach((fontSize, i) => {\n const level = i + 1;\n styles.push({\n id: `Heading${level}`,\n name: `Heading ${level}`,\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n linked: `Heading${level}Char`,\n block: { type: \"heading\", attrs: { level } },\n paragraph: { spaceBefore: level <= 2 ? \"1em\" : \"0.75em\", spaceAfter: \"0.25em\" },\n character: { fontSize, bold: true },\n priority: 11 + level,\n quick: level <= 3,\n builtin: true,\n });\n });\n styles.push(\n {\n id: \"Quote\",\n name: \"Quote\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n linked: \"QuoteChar\",\n paragraph: { indentLeft: \"1em\", paddingLeft: \"0.75em\", borderLeft: \"3px solid currentColor\" },\n character: { italic: true, color: MUTED },\n priority: 29,\n quick: true,\n builtin: true,\n },\n {\n id: \"Code\",\n name: \"Code\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n block: { type: \"codeBlock\" },\n character: {\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n fontSize: \"0.9em\",\n },\n priority: 30,\n quick: true,\n builtin: true,\n },\n {\n id: \"ListParagraph\",\n name: \"List Paragraph\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n paragraph: { indentLeft: \"2em\" },\n priority: 34,\n quick: true,\n builtin: true,\n },\n );\n // Linked character styles: their formatting is the paragraph style's.\n const linked = [\"Title\", \"Subtitle\", \"Quote\", ...HEADING_SIZES.map((_, i) => `Heading${i + 1}`)];\n linked.forEach((paragraphId) => {\n const name = styles.find((s) => s.id === paragraphId)!.name;\n styles.push({\n id: `${paragraphId}Char`,\n name: `${name} Char`,\n kind: \"character\",\n linked: paragraphId,\n priority: 99,\n hidden: true,\n builtin: true,\n });\n });\n styles.push(\n {\n id: \"Emphasis\",\n name: \"Emphasis\",\n kind: \"character\",\n character: { italic: true },\n priority: 20,\n quick: true,\n builtin: true,\n },\n {\n id: \"Strong\",\n name: \"Strong\",\n kind: \"character\",\n character: { bold: true },\n priority: 22,\n quick: true,\n builtin: true,\n },\n );\n return styles;\n}\n\n/** The built-in styles: Normal, Title, Subtitle, Heading 1–6, Quote, Code, List Paragraph and character styles. */\nexport const DEFAULT_STYLES: readonly StyleDefinition[] = Object.freeze(builtinStyles());\n\nconst clone = <T>(value: T): T => (value === undefined ? value : JSON.parse(JSON.stringify(value)));\n\n/** Copies only defined values of `patch` over `base`. */\nfunction overlay<T extends object>(base: T, patch: T | undefined | null): T {\n if (!patch) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n Object.entries(patch).forEach(([key, value]) => {\n if (value !== undefined && value !== null) out[key] = value;\n });\n return out as T;\n}\n\nfunction sameBlock(a: StyleBlock, type: string, attrs: Record<string, any>): boolean {\n if (a.type !== type) return false;\n return Object.entries(a.attrs ?? {}).every(([key, value]) => attrs[key] === value);\n}\n\n/**\n * Style definitions with `basedOn` inheritance, next-style and linked\n * character/paragraph styles, resolved in cascade order: document defaults →\n * style chain (base first) → direct formatting. Chains are cycle-safe.\n *\n * `subscribe` calls the listener immediately and on every change (Svelte\n * store contract); `getSnapshot` is stable between changes.\n */\nexport class StyleRegistry {\n private styles = new Map<string, StyleDefinition>();\n private defaults: StyleDefaults;\n private version = 0;\n private snapshot: StyleRegistrySnapshot | null = null;\n private listeners = new Set<(snapshot: StyleRegistrySnapshot) => void>();\n\n constructor(options: StyleRegistryOptions = {}) {\n this.defaults = clone(options.defaults ?? {});\n if (options.builtins !== false) DEFAULT_STYLES.forEach((style) => this.styles.set(style.id, clone(style)));\n (options.styles ?? []).forEach((style) => this.put(style));\n }\n\n // -- Reading --------------------------------------------------------------\n\n get(id: string | null | undefined): StyleDefinition | undefined {\n return id ? this.styles.get(id) : undefined;\n }\n\n /** Finds a style by id or display name (case-insensitive). */\n find(nameOrId: string): StyleDefinition | undefined {\n const direct = this.styles.get(nameOrId);\n if (direct) return direct;\n const lower = nameOrId.toLowerCase();\n return this.list().find((style) => style.name.toLowerCase() === lower);\n }\n\n /** All styles (optionally of one kind) in gallery order. */\n list(kind?: StyleKind): StyleDefinition[] {\n return Array.from(this.styles.values())\n .filter((style) => !kind || style.kind === kind)\n .sort((a, b) => (a.priority ?? 99) - (b.priority ?? 99) || a.name.localeCompare(b.name));\n }\n\n /** Styles shown in the gallery (`quick`, not hidden), paragraph styles by default. */\n gallery(kind: StyleKind = \"paragraph\"): StyleDefinition[] {\n return this.list(kind).filter((style) => style.quick && !style.hidden);\n }\n\n /** The `basedOn` chain from the root style down to `id` (cycle-safe, bounded). */\n chain(id: string): StyleDefinition[] {\n const out: StyleDefinition[] = [];\n let current = this.styles.get(id);\n while (current && out.length < MAX_CHAIN && !out.includes(current)) {\n out.push(current);\n current = current.basedOn ? this.styles.get(current.basedOn) : undefined;\n }\n return out.reverse();\n }\n\n /**\n * Resolves a paragraph style: defaults, then each style of the chain (base\n * first). Unknown ids resolve to the defaults in a `paragraph` block.\n */\n resolve(id: string): ResolvedStyle {\n let paragraph = overlay<ParagraphFormat>({}, this.defaults.paragraph);\n let character = overlay<CharacterFormat>({}, this.defaults.character);\n let block: StyleBlock = { type: \"paragraph\" };\n this.chain(id).forEach((style) => {\n if (style.kind !== \"paragraph\") return;\n paragraph = overlay(paragraph, style.paragraph);\n character = overlay(character, style.character);\n if (style.block) block = clone(style.block);\n });\n return { id, paragraph, character, block, next: this.nextStyleId(id) };\n }\n\n /** Character formatting a paragraph style's chain sets (without defaults). */\n private paragraphCharacter(id: string): CharacterFormat {\n let character: CharacterFormat = {};\n this.chain(id).forEach((style) => {\n if (style.kind === \"paragraph\") character = overlay(character, style.character);\n });\n return character;\n }\n\n /**\n * Character formatting of a character style's chain. A style linked to a\n * paragraph style takes that style's character formatting first.\n */\n resolveCharacterStyle(id: string): CharacterFormat {\n let character: CharacterFormat = {};\n this.chain(id).forEach((style) => {\n if (style.kind === \"character\" && style.linked && this.get(style.linked)?.kind === \"paragraph\") {\n character = overlay(character, this.paragraphCharacter(style.linked));\n }\n character = overlay(character, style.character);\n });\n return character;\n }\n\n /**\n * Character formatting of text: defaults → paragraph style chain →\n * character style chain → direct formatting.\n */\n resolveText(input: {\n paragraphStyle?: string | null;\n characterStyle?: string | null;\n direct?: CharacterFormat;\n }): CharacterFormat {\n let character = this.resolve(input.paragraphStyle || NORMAL_STYLE_ID).character;\n if (input.characterStyle) character = overlay(character, this.resolveCharacterStyle(input.characterStyle));\n return overlay(character, input.direct);\n }\n\n /** The style after Enter at the end of a paragraph of `id` (itself when unset or unknown). */\n nextStyleId(id: string): string {\n const next = this.styles.get(id)?.next;\n return next && this.styles.get(next)?.kind === \"paragraph\" ? next : id;\n }\n\n /** The linked character style of a paragraph style, if any. */\n linkedCharacterStyle(id: string): StyleDefinition | undefined {\n const style = this.styles.get(id);\n const linked = style?.linked ? this.styles.get(style.linked) : undefined;\n return style?.kind === \"paragraph\" && linked?.kind === \"character\" ? linked : undefined;\n }\n\n /**\n * The style a block uses when it names none: Normal for paragraphs,\n * Heading N for headings of level N, Code for code blocks (the built-in\n * style whose own `block` matches).\n */\n defaultStyleFor(type: string, attrs: Record<string, any> = {}): string | null {\n if (type === \"paragraph\" && this.styles.get(NORMAL_STYLE_ID)) return NORMAL_STYLE_ID;\n const candidates = this.list(\"paragraph\").filter(\n (style) => style.block && sameBlock(style.block, type, attrs),\n );\n return (candidates.find((s) => s.builtin) ?? candidates[0])?.id ?? null;\n }\n\n /** The style of a block: its `styleId` when known, otherwise the block's default style. */\n styleOfBlock(type: string, attrs: Record<string, any> = {}): string | null {\n const id = attrs.styleId;\n if (id && this.styles.get(id)?.kind === \"paragraph\") return id;\n return this.defaultStyleFor(type, attrs);\n }\n\n getSnapshot = (): StyleRegistrySnapshot => {\n if (!this.snapshot) {\n this.snapshot = Object.freeze({\n styles: Object.freeze(this.list()),\n defaults: this.defaults,\n version: this.version,\n });\n }\n return this.snapshot;\n };\n\n subscribe = (listener: (snapshot: StyleRegistrySnapshot) => void): (() => void) => {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n toJSON(): StyleRegistryJSON {\n return { styles: clone(Array.from(this.styles.values())), defaults: clone(this.defaults) };\n }\n\n // -- Writing --------------------------------------------------------------\n\n /** Adds or replaces a style. Throws on an invalid id. */\n upsert(style: StyleDefinition): StyleDefinition {\n const stored = this.put(style);\n this.changed();\n return stored;\n }\n\n /** Merges `patch` into a style (formats are merged key by key). Returns `undefined` for unknown ids. */\n update(id: string, patch: Partial<Omit<StyleDefinition, \"id\">>): StyleDefinition | undefined {\n const current = this.styles.get(id);\n if (!current) return undefined;\n const next: StyleDefinition = {\n ...current,\n ...patch,\n id,\n paragraph: patch.paragraph ? { ...current.paragraph, ...patch.paragraph } : current.paragraph,\n character: patch.character ? { ...current.character, ...patch.character } : current.character,\n };\n return this.upsert(next);\n }\n\n /**\n * Removes a style and returns it. Built-in styles cannot be removed. Styles\n * based on it are rebased onto its own base, and `next`/`linked`\n * references to it are dropped.\n */\n remove(id: string): StyleDefinition | undefined {\n const gone = this.styles.get(id);\n if (!gone || gone.builtin) return undefined;\n this.styles.delete(id);\n this.styles.forEach((style, key) => {\n let changed = style;\n if (style.basedOn === id) {\n changed = { ...changed, basedOn: gone.basedOn && gone.basedOn !== key ? gone.basedOn : null };\n }\n if (style.next === id) changed = { ...changed, next: null };\n if (style.linked === id) changed = { ...changed, linked: null };\n if (changed !== style) this.styles.set(key, changed);\n });\n this.changed();\n return gone;\n }\n\n /** Replaces the document defaults. */\n setDefaults(defaults: StyleDefaults): void {\n this.defaults = clone(defaults);\n this.changed();\n }\n\n /** An unused id derived from a display name (`My Style` → `MyStyle`, then `MyStyle1`, …). */\n newId(name: string): string {\n let base = name.replace(/[^A-Za-z0-9_-]+/g, \"\").replace(/^[^A-Za-z]+/, \"\").slice(0, 56);\n if (!base) base = \"Style\";\n if (!this.styles.has(base)) return base;\n for (let i = 1; i < 100000; i++) {\n const id = `${base}${i}`;\n if (!this.styles.has(id)) return id;\n }\n return `${base}${Date.now()}`;\n }\n\n // -- CSS --------------------------------------------------------------------\n\n /** CSS declarations (`property: value`) of a resolved paragraph or character style. */\n cssDeclarations(id: string): Record<string, string> {\n const style = this.styles.get(id);\n if (style?.kind === \"character\") return characterCSS(this.resolveCharacterStyle(id));\n const resolved = this.resolve(id);\n return { ...paragraphCSS(resolved.paragraph), ...characterCSS(resolved.character) };\n }\n\n /**\n * Declarations for previewing a style in a menu or gallery: font family,\n * weight, style, color, decoration, case and letter spacing (no sizes,\n * margins or borders).\n */\n previewDeclarations(id: string): Record<string, string> {\n return Object.fromEntries(\n Object.entries(this.cssDeclarations(id)).filter(([property]) => PREVIEW_PROPERTIES.has(property)),\n );\n }\n\n /**\n * A stylesheet for the styles: `[data-style=\"Id\"]` rules for paragraph\n * styles (plus the plain element of blocks that use their default style,\n * e.g. `h2:not([data-style])`), `[data-char-style=\"Id\"]` for character\n * styles and the defaults on the scope element.\n */\n toCSS(options: StyleCSSOptions = {}): string {\n const scope = options.scope ?? \".ProseMirror\";\n const tagFor = options.tagFor ?? defaultTagFor;\n const rules: string[] = [];\n const rule = (selectors: string[], declarations: Record<string, string>) => {\n const body = Object.entries(declarations)\n .map(([property, value]) => `${property}: ${value};`)\n .join(\" \");\n if (body) rules.push(`${selectors.join(\", \")} { ${body} }`);\n };\n rule([scope], {\n ...paragraphCSS(this.defaults.paragraph ?? {}),\n ...characterCSS(this.defaults.character ?? {}),\n });\n this.list().forEach((style) => {\n if (style.kind === \"character\") {\n rule([`${scope} [data-char-style=\"${style.id}\"]`], this.cssDeclarations(style.id));\n return;\n }\n const selectors = [`${scope} [data-style=\"${style.id}\"]`];\n const block = this.resolve(style.id).block;\n if (this.defaultStyleFor(block.type, block.attrs ?? {}) === style.id) {\n const tag = tagFor(block);\n if (tag) selectors.push(`${scope} ${tag}:not([data-style])`);\n }\n // Defaults already apply to the scope; repeat only what the chain sets.\n const resolved = this.resolve(style.id);\n const own = {\n ...paragraphCSS(withoutDefaults(resolved.paragraph, this.defaults.paragraph)),\n ...characterCSS(withoutDefaults(resolved.character, this.defaults.character)),\n };\n rule(selectors, own);\n });\n return rules.join(\"\\n\");\n }\n\n // -- Internals --------------------------------------------------------------\n\n private put(style: StyleDefinition): StyleDefinition {\n if (!isValidStyleId(style.id)) throw new Error(`Invalid style id: ${String(style.id)}`);\n if (style.kind !== \"paragraph\" && style.kind !== \"character\") {\n throw new Error(`Invalid style kind: ${String(style.kind)}`);\n }\n const stored = clone({ ...style, name: style.name || style.id });\n this.styles.set(style.id, stored);\n return stored;\n }\n\n private changed(): void {\n this.version++;\n this.snapshot = null;\n const snapshot = this.getSnapshot();\n this.listeners.forEach((listener) => {\n try {\n listener(snapshot);\n } catch (err) {\n console.error(\"[StyleRegistry] Error in listener:\", err);\n }\n });\n }\n}\n\nfunction withoutDefaults<T extends object>(format: T, defaults: T | undefined): T {\n if (!defaults) return format;\n const out: Record<string, unknown> = {};\n Object.entries(format).forEach(([key, value]) => {\n if ((defaults as Record<string, unknown>)[key] !== value) out[key] = value;\n });\n return out as T;\n}\n\nfunction defaultTagFor(block: StyleBlock): string | null {\n if (block.type === \"paragraph\") return \"p\";\n if (block.type === \"heading\") {\n const level = Number(block.attrs?.level);\n return level >= 1 && level <= 6 ? `h${level}` : null;\n }\n if (block.type === \"codeBlock\") return \"pre\";\n return null;\n}\n\n/** A CSS value, or `undefined` when it is unsafe or empty. */\nexport function safeCSSValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed || trimmed.length > 200 || UNSAFE_CSS.test(trimmed)) return undefined;\n return trimmed;\n}\n\nfunction paragraphCSS(format: ParagraphFormat): Record<string, string> {\n const out: Record<string, string> = {};\n const set = (property: string, value: unknown) => {\n const safe = safeCSSValue(value);\n if (safe) out[property] = safe;\n };\n set(\"text-align\", format.textAlign);\n set(\"line-height\", format.lineHeight);\n set(\"margin-top\", format.spaceBefore);\n set(\"margin-bottom\", format.spaceAfter);\n set(\"margin-left\", format.indentLeft);\n set(\"margin-right\", format.indentRight);\n set(\"text-indent\", format.indentFirstLine);\n set(\"border-left\", format.borderLeft);\n set(\"padding-left\", format.paddingLeft);\n set(\"background-color\", format.backgroundColor);\n return out;\n}\n\nfunction characterCSS(format: CharacterFormat): Record<string, string> {\n const out: Record<string, string> = {};\n const set = (property: string, value: unknown) => {\n const safe = safeCSSValue(value);\n if (safe) out[property] = safe;\n };\n set(\"font-family\", format.fontFamily);\n set(\"font-size\", format.fontSize);\n if (format.bold !== undefined) out[\"font-weight\"] = format.bold ? \"700\" : \"400\";\n if (format.italic !== undefined) out[\"font-style\"] = format.italic ? \"italic\" : \"normal\";\n const lines = [format.underline && \"underline\", format.strike && \"line-through\"].filter(Boolean);\n if (format.underline !== undefined || format.strike !== undefined) {\n out[\"text-decoration-line\"] = lines.length ? lines.join(\" \") : \"none\";\n }\n set(\"color\", format.color);\n set(\"background-color\", format.backgroundColor);\n set(\"letter-spacing\", format.letterSpacing);\n set(\"text-transform\", format.textTransform);\n if (format.smallCaps !== undefined) out[\"font-variant-caps\"] = format.smallCaps ? \"small-caps\" : \"normal\";\n return out;\n}\n\n/** Creates a style registry with the built-in styles (unless `builtins: false`) and `styles`. */\nexport function createStyleRegistry(options: StyleRegistryOptions | StyleRegistryJSON = {}): StyleRegistry {\n return new StyleRegistry(options as StyleRegistryOptions);\n}\n","import type { Editor } from \"@tiptap/core\";\nimport type { CommandParamsSchema, CommandSpec } from \"../../commands/registry\";\nimport { compileFindPattern, type FindOptions } from \"./pattern\";\nimport { findReplacePluginKey, getFindReplaceState } from \"./extension\";\n\nexport interface FindReplaceCommandOptions {\n /** Id prefix (default `findReplace.`). */\n prefix?: string;\n group?: string;\n scope?: string;\n /**\n * Give the open commands default shortcuts (Mod+F, Mod+H). Off by default\n * because the `FindReplace` extension already binds them inside the editor.\n */\n shortcuts?: boolean;\n}\n\ninterface SearchParams extends FindOptions {\n query?: string;\n replacement?: string;\n}\n\nconst OPTION_KEYS = [\n \"matchCase\",\n \"wholeWord\",\n \"matchPrefix\",\n \"matchSuffix\",\n \"ignorePunctuation\",\n \"ignoreWhitespace\",\n \"wildcards\",\n \"regex\",\n \"literal\",\n] as const satisfies readonly (keyof FindOptions)[];\n\nconst searchParams = (withReplacement: boolean): CommandParamsSchema => ({\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Find what. Word ^ codes (^p, ^t, ^#) unless literal.\" },\n ...(withReplacement\n ? {\n replacement: {\n type: \"string\",\n description: \"Replace with. ^& is the found text; with wildcards, \\\\1-\\\\9 are groups.\",\n },\n }\n : {}),\n ...Object.fromEntries(OPTION_KEYS.map((key) => [key, { type: \"boolean\" }])),\n },\n additionalProperties: false,\n});\n\nfunction splitParams(params: SearchParams | undefined) {\n if (!params) return null;\n const options: Partial<FindOptions> = {};\n for (const key of OPTION_KEYS) if (params[key] !== undefined) options[key] = params[key];\n return {\n ...(params.query !== undefined ? { query: params.query } : {}),\n ...(params.replacement !== undefined ? { replacement: params.replacement } : {}),\n options,\n };\n}\n\nconst usable = (editor: Editor) =>\n !editor.isDestroyed && findReplacePluginKey.getState(editor.state)\n ? true\n : \"Find and Replace is not available.\";\n\n/**\n * Find and Replace commands for the command registry (`@pixerate/editor/commands`):\n * open the bar, step through matches, and find / replace with explicit\n * params (useful for agents). Requires the `FindReplace` extension.\n */\nexport function createFindReplaceCommands(\n editor: Editor,\n options: FindReplaceCommandOptions = {},\n): CommandSpec[] {\n const prefix = options.prefix ?? \"findReplace.\";\n const group = options.group ?? \"Edit\";\n const scope = options.scope ? { scope: options.scope } : {};\n const state = () => getFindReplaceState(editor);\n const hasMatches = () => {\n const ok = usable(editor);\n if (ok !== true) return ok;\n return state()?.matches.length ? true : \"No matches.\";\n };\n const apply = (params: SearchParams | undefined) => {\n const split = splitParams(params);\n if (split) editor.commands.setSearch(split);\n };\n const failIfInvalid = () => {\n const s = state();\n if (s?.error) throw new Error(s.error.message);\n };\n\n return [\n {\n id: `${prefix}open`,\n label: \"Find\",\n group,\n keywords: [\"search\", \"find\"],\n description: \"Shows the find bar.\",\n ...(options.shortcuts ? { shortcut: \"Mod+F\" } : {}),\n ...scope,\n enabled: () => usable(editor),\n run: () => editor.commands.openFindReplace({ mode: \"find\" }),\n },\n {\n id: `${prefix}openReplace`,\n label: \"Replace\",\n group,\n keywords: [\"search\", \"substitute\"],\n description: \"Shows the find bar with the replace field.\",\n ...(options.shortcuts ? { shortcut: \"Mod+H\" } : {}),\n ...scope,\n enabled: () => usable(editor),\n run: () => editor.commands.openFindReplace({ mode: \"replace\" }),\n },\n {\n id: `${prefix}find`,\n label: \"Find text\",\n group,\n description: \"Searches the document and returns the number of matches.\",\n params: searchParams(false),\n readOnly: true,\n ...scope,\n enabled: () => usable(editor),\n run: (_ctx: unknown, params: SearchParams) => {\n apply(params);\n failIfInvalid();\n const s = state();\n return {\n count: s?.matches.length ?? 0,\n truncated: s?.truncated ?? false,\n matches: (s?.matches ?? []).slice(0, 200).map(({ from, to, text }) => ({ from, to, text })),\n };\n },\n },\n {\n id: `${prefix}next`,\n label: \"Find next\",\n group,\n ...scope,\n enabled: hasMatches,\n run: () => editor.commands.findNext(),\n },\n {\n id: `${prefix}previous`,\n label: \"Find previous\",\n group,\n ...scope,\n enabled: hasMatches,\n run: () => editor.commands.findPrevious(),\n },\n {\n id: `${prefix}replaceAll`,\n label: \"Replace all\",\n group,\n description: \"Replaces every match (one undo step). Tracked when Track Changes is on.\",\n params: searchParams(true),\n ...scope,\n enabled: (_ctx: unknown, params: SearchParams | undefined) =>\n params?.query !== undefined ? usable(editor) : hasMatches(),\n run: (_ctx: unknown, params: SearchParams) => {\n apply(params);\n failIfInvalid();\n const count = state()?.matches.length ?? 0;\n if (count) editor.commands.replaceAll();\n return { replaced: count };\n },\n },\n ];\n}\n\n/** Validates Find text without an editor (e.g. to show an error while typing). */\nexport function validateFindPattern(query: string, options: FindOptions = {}) {\n const result = compileFindPattern(query, options);\n return result.ok ? null : result.error;\n}\n"],"mappings":"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","names":["start","Plugin","Extension","Node","Extension","Extension","Plugin","Decoration","DecorationSet","Extension","MarkdownTightLists","Extension","create","name","addOptions","tight","tightClass","listTypes","addGlobalAttributes","types","options","attributes","default","parseHTML","element","getAttribute","querySelector","renderHTML","class","addCommands","_this","toggleTight","arguments","length","undefined","_ref","editor","commands","isActive","attrs","getAttributes","updateAttributes","some","md","markdownit","scanDelims","text","pos","inline","State","prototype","call","src","posMax","state","shiftDelim","delim","start","offset","res","substring","trimStart","from","to","can_open","trimEnd","can_close","trimInline","MarkdownSerializerState","BaseMarkdownSerializerState","constructor","nodes","marks","inTable","inlines","render","node","parent","index","top","end","delimiter","normalizeInline","out","pop","markString","mark","open","info","type","expelEnclosingWhitespace","push","charAt","match","Mark","addStorage","markdown","serialize","_getMarkTags$","_getMarkTags","storage","html","console","warn","getMarkTags","close","_getMarkTags$2","_getMarkTags2","parse","schema","getHTMLFromFragment","Fragment","elementFromString","value","wrappedValue","window","DOMParser","parseFromString","body","escapeHTML","replace","extractElement","parentElement","prepend","cloneNode","firstChild","appendChild","childNodes","insertBefore","remove","unwrapElement","parentNode","removeChild","Node","write","serializeHTML","isBlock","closeBlock","topNodeType","formatBlock","dom","firstElementChild","innerHTML","trim","outerHTML","Blockquote","extend","defaultMarkdownSerializer","blockquote","BulletList","renderList","bulletListMarker","CodeBlock","language","textContent","ensureNewLine","setup","_this$options$languag","set","langPrefix","languageClassPrefix","updateDOM","HardBreak","i","childCount","child","HTMLNode","Heading","heading","HorizontalRule","horizontal_rule","Image","image","ListItem","list_item","OrderedList","findIndexOfAdjacentNode","maxW","String","space","repeat","adjacentIndex","separator","nStr","Paragraph","paragraph","_node$content$content","_node$content","content","Table","isMarkdownSerializable","forEach","row","p","col","j","cellContent","renderInline","delimiterRow","Array","map","join","hasSpan","colspan","rowspan","rows","firstRow","bodyRows","slice","cell","TaskItem","check","checked","renderContent","querySelectorAll","item","input","setAttribute","TaskList","use","taskListPlugin","list","Text","Bold","strong","Code","code","Italic","em","Link","link","Strike","HTMLMark","getMarkdownSpec","extension","_extension$storage","_markdownExtensions$f","markdownSpec","defaultMarkdownSpec","markdownExtensions","find","e","MarkdownSerializer","hardBreakNodeName","_this$editor$extensio","Object","fromEntries","keys","serializeNode","extensionManager","extensions","filter","_this$editor$extensio2","serializeMark","_getMarkdownSpec","bind","_getMarkdownSpec2","MarkdownParser","linkify","breaks","withPatchedRenderer","renderedHTML","normalizeDOM","_ref2","normalizeBlocks","el","_el$nextSibling","nextSibling","nodeType","TEXT_NODE","closest","blocks","values","selector","block","_block$spec$parseDOM","spec","parseDOM","tag","flat","Boolean","matches","_node$firstElementChi","_content$match$","_content$match","_content$match$2","_content$match2","firstParagraph","nextElementSibling","startSpaces","endSpaces","withoutNewLine","renderer","rendered","rules","hardbreak","softbreak","fence","code_block","renderToken","MarkdownClipboard","transformPastedText","transformCopiedText","addProseMirrorPlugins","Plugin","key","PluginKey","props","clipboardTextParser","context","plainText","parsed","parser","fromSchema","parseSlice","preserveWhitespace","clipboardTextSerializer","serializer","Markdown","priority","tightLists","tightListClass","Commands","config","setContent","emitUpdate","parseOptions","insertContentAt","range","onBeforeCreate","getMarkdown","doc","initialContent","onCreate","addExtensions","configure","Markdown","Plugin","PluginKey","resolveExt","Image","Mark","mergeAttributes","Plugin","PluginKey","Decoration","DecorationSet","PluginKey","Mark","mergeAttributes","Decoration","DecorationSet","Plugin","view","Extension","Extension","Extension","Plugin","PluginKey","start","part","PluginKey","Extension","Plugin","Extension","Plugin","PluginKey","PluginKey","Extension","Plugin","Extension","Plugin","PluginKey","tr","start","Extension","Plugin","PluginKey","TextSelection","PluginKey","TextSelection","Extension","Plugin","Node","mergeAttributes","Plugin","PluginKey","TextSelection","md","start","PluginKey","Node","mergeAttributes","markdownit","Plugin","TextSelection","Node","mergeAttributes","Plugin","PluginKey","TextSelection","PluginKey","Node","mergeAttributes","markdownit","TextSelection","Plugin","tr","Mark","mergeAttributes","TextSelection","Mark","mergeAttributes","start","TextSelection","Node","mergeAttributes","Plugin","PluginKey","TextSelection","PluginKey","Node","mergeAttributes","TextSelection","Plugin","installed","Extension","Plugin","PluginKey","TextSelection","Decoration","DecorationSet","closeHistory","start","exit","start","PluginKey","Extension","TextSelection","closeHistory","DecorationSet","Decoration","Plugin","Extension","Mark","mergeAttributes","Plugin","PluginKey","PluginKey","start","Mark","mergeAttributes","Extension","Plugin","resolveExt","Link","TaskList","TaskItem","headingLevels","extensions","Markdown","Image"]}