@prosekit/extensions 0.11.4 → 0.11.6

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 (384) hide show
  1. package/dist/commit/style.css +2 -0
  2. package/dist/commit/style.css.map +1 -0
  3. package/dist/commit/style.js +1 -0
  4. package/dist/drop-indicator-E7nCfdnR.js +58 -0
  5. package/dist/drop-indicator-E7nCfdnR.js.map +1 -0
  6. package/dist/enter-rule-RdhEA900.js +2 -1
  7. package/dist/enter-rule-RdhEA900.js.map +1 -0
  8. package/dist/file-DVUhe5KJ.js +134 -0
  9. package/dist/file-DVUhe5KJ.js.map +1 -0
  10. package/dist/gap-cursor/style.css +2 -0
  11. package/dist/gap-cursor/style.css.map +1 -0
  12. package/dist/gap-cursor/style.js +1 -0
  13. package/dist/index-DY6lIIYV.d.ts +134 -0
  14. package/dist/index-DY6lIIYV.d.ts.map +1 -0
  15. package/dist/{input-rule-Gji4N7Oe.js → input-rule-B17tpW4m.js} +3 -3
  16. package/dist/input-rule-B17tpW4m.js.map +1 -0
  17. package/dist/list/style.css +2 -0
  18. package/dist/list/style.css.map +1 -0
  19. package/dist/list/style.js +1 -0
  20. package/dist/loro/style.css +2 -0
  21. package/dist/loro/style.css.map +1 -0
  22. package/dist/loro/style.js +1 -0
  23. package/dist/{mark-rule-D7zaa32n.js → mark-rule-CGmswjQ_.js} +3 -3
  24. package/dist/mark-rule-CGmswjQ_.js.map +1 -0
  25. package/dist/{paste-rule-Cca3n5TA.js → paste-rule-BIztzELg.js} +5 -15
  26. package/dist/paste-rule-BIztzELg.js.map +1 -0
  27. package/dist/placeholder/style.css +2 -0
  28. package/dist/placeholder/style.css.map +1 -0
  29. package/dist/placeholder/style.js +1 -0
  30. package/dist/prosekit-extensions-autocomplete.d.ts +2 -1
  31. package/dist/prosekit-extensions-autocomplete.d.ts.map +1 -0
  32. package/dist/prosekit-extensions-autocomplete.js +2 -9
  33. package/dist/prosekit-extensions-autocomplete.js.map +1 -0
  34. package/dist/prosekit-extensions-blockquote.d.ts +2 -1
  35. package/dist/prosekit-extensions-blockquote.d.ts.map +1 -0
  36. package/dist/prosekit-extensions-blockquote.js +4 -4
  37. package/dist/prosekit-extensions-blockquote.js.map +1 -0
  38. package/dist/prosekit-extensions-bold.d.ts +2 -1
  39. package/dist/prosekit-extensions-bold.d.ts.map +1 -0
  40. package/dist/prosekit-extensions-bold.js +3 -2
  41. package/dist/prosekit-extensions-bold.js.map +1 -0
  42. package/dist/prosekit-extensions-code-block.d.ts +3 -2
  43. package/dist/prosekit-extensions-code-block.d.ts.map +1 -0
  44. package/dist/prosekit-extensions-code-block.js +5 -6
  45. package/dist/prosekit-extensions-code-block.js.map +1 -0
  46. package/dist/prosekit-extensions-code.d.ts +2 -1
  47. package/dist/prosekit-extensions-code.d.ts.map +1 -0
  48. package/dist/prosekit-extensions-code.js +3 -2
  49. package/dist/prosekit-extensions-code.js.map +1 -0
  50. package/dist/prosekit-extensions-commit.d.ts +2 -1
  51. package/dist/prosekit-extensions-commit.d.ts.map +1 -0
  52. package/dist/prosekit-extensions-commit.js +11 -13
  53. package/dist/prosekit-extensions-commit.js.map +1 -0
  54. package/dist/prosekit-extensions-doc.d.ts +2 -1
  55. package/dist/prosekit-extensions-doc.d.ts.map +1 -0
  56. package/dist/prosekit-extensions-doc.js +2 -1
  57. package/dist/prosekit-extensions-doc.js.map +1 -0
  58. package/dist/prosekit-extensions-drop-cursor.d.ts +2 -1
  59. package/dist/prosekit-extensions-drop-cursor.d.ts.map +1 -0
  60. package/dist/prosekit-extensions-drop-cursor.js +2 -1
  61. package/dist/prosekit-extensions-drop-cursor.js.map +1 -0
  62. package/dist/prosekit-extensions-drop-indicator.d.ts +5 -107
  63. package/dist/prosekit-extensions-drop-indicator.d.ts.map +1 -0
  64. package/dist/prosekit-extensions-drop-indicator.js +1 -1
  65. package/dist/prosekit-extensions-enter-rule.d.ts +2 -1
  66. package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -0
  67. package/dist/prosekit-extensions-file.d.ts +2 -125
  68. package/dist/prosekit-extensions-file.js +1 -139
  69. package/dist/prosekit-extensions-gap-cursor.d.ts +2 -2
  70. package/dist/prosekit-extensions-gap-cursor.d.ts.map +1 -0
  71. package/dist/prosekit-extensions-gap-cursor.js +2 -1
  72. package/dist/prosekit-extensions-gap-cursor.js.map +1 -0
  73. package/dist/prosekit-extensions-hard-break.d.ts +2 -5
  74. package/dist/prosekit-extensions-hard-break.d.ts.map +1 -0
  75. package/dist/prosekit-extensions-hard-break.js +2 -1
  76. package/dist/prosekit-extensions-hard-break.js.map +1 -0
  77. package/dist/prosekit-extensions-heading.d.ts +2 -1
  78. package/dist/prosekit-extensions-heading.d.ts.map +1 -0
  79. package/dist/prosekit-extensions-heading.js +5 -6
  80. package/dist/prosekit-extensions-heading.js.map +1 -0
  81. package/dist/prosekit-extensions-horizontal-rule.d.ts +2 -1
  82. package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -0
  83. package/dist/prosekit-extensions-horizontal-rule.js +5 -6
  84. package/dist/prosekit-extensions-horizontal-rule.js.map +1 -0
  85. package/dist/prosekit-extensions-image.d.ts +80 -3
  86. package/dist/prosekit-extensions-image.d.ts.map +1 -0
  87. package/dist/prosekit-extensions-image.js +90 -10
  88. package/dist/prosekit-extensions-image.js.map +1 -0
  89. package/dist/prosekit-extensions-input-rule.d.ts +2 -1
  90. package/dist/prosekit-extensions-input-rule.d.ts.map +1 -0
  91. package/dist/prosekit-extensions-input-rule.js +1 -1
  92. package/dist/prosekit-extensions-italic.d.ts +2 -1
  93. package/dist/prosekit-extensions-italic.d.ts.map +1 -0
  94. package/dist/prosekit-extensions-italic.js +3 -2
  95. package/dist/prosekit-extensions-italic.js.map +1 -0
  96. package/dist/prosekit-extensions-link.d.ts +2 -1
  97. package/dist/prosekit-extensions-link.d.ts.map +1 -0
  98. package/dist/prosekit-extensions-link.js +6 -5
  99. package/dist/prosekit-extensions-link.js.map +1 -0
  100. package/dist/prosekit-extensions-list.d.ts +22 -21
  101. package/dist/prosekit-extensions-list.d.ts.map +1 -0
  102. package/dist/prosekit-extensions-list.js +7 -8
  103. package/dist/prosekit-extensions-list.js.map +1 -0
  104. package/dist/prosekit-extensions-loro.d.ts +14 -13
  105. package/dist/prosekit-extensions-loro.d.ts.map +1 -0
  106. package/dist/prosekit-extensions-loro.js +2 -1
  107. package/dist/prosekit-extensions-loro.js.map +1 -0
  108. package/dist/prosekit-extensions-mark-rule.d.ts +2 -1
  109. package/dist/prosekit-extensions-mark-rule.d.ts.map +1 -0
  110. package/dist/prosekit-extensions-mark-rule.js +1 -1
  111. package/dist/prosekit-extensions-mention.d.ts +2 -1
  112. package/dist/prosekit-extensions-mention.d.ts.map +1 -0
  113. package/dist/prosekit-extensions-mention.js +2 -1
  114. package/dist/prosekit-extensions-mention.js.map +1 -0
  115. package/dist/prosekit-extensions-mod-click-prevention.d.ts +2 -1
  116. package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +1 -0
  117. package/dist/prosekit-extensions-mod-click-prevention.js +2 -1
  118. package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -0
  119. package/dist/prosekit-extensions-paragraph.d.ts +2 -5
  120. package/dist/prosekit-extensions-paragraph.d.ts.map +1 -0
  121. package/dist/prosekit-extensions-paragraph.js +2 -1
  122. package/dist/prosekit-extensions-paragraph.js.map +1 -0
  123. package/dist/prosekit-extensions-paste-rule.d.ts +2 -1
  124. package/dist/prosekit-extensions-paste-rule.d.ts.map +1 -0
  125. package/dist/prosekit-extensions-paste-rule.js +1 -1
  126. package/dist/prosekit-extensions-placeholder.d.ts +2 -1
  127. package/dist/prosekit-extensions-placeholder.d.ts.map +1 -0
  128. package/dist/prosekit-extensions-placeholder.js +5 -5
  129. package/dist/prosekit-extensions-placeholder.js.map +1 -0
  130. package/dist/prosekit-extensions-readonly.d.ts +2 -1
  131. package/dist/prosekit-extensions-readonly.d.ts.map +1 -0
  132. package/dist/prosekit-extensions-readonly.js +2 -1
  133. package/dist/prosekit-extensions-readonly.js.map +1 -0
  134. package/dist/prosekit-extensions-search.d.ts +2 -1
  135. package/dist/prosekit-extensions-search.d.ts.map +1 -0
  136. package/dist/prosekit-extensions-search.js +3 -3
  137. package/dist/prosekit-extensions-search.js.map +1 -0
  138. package/dist/prosekit-extensions-strike.d.ts +2 -1
  139. package/dist/prosekit-extensions-strike.d.ts.map +1 -0
  140. package/dist/prosekit-extensions-strike.js +3 -2
  141. package/dist/prosekit-extensions-strike.js.map +1 -0
  142. package/dist/prosekit-extensions-table.d.ts +47 -114
  143. package/dist/prosekit-extensions-table.d.ts.map +1 -0
  144. package/dist/prosekit-extensions-table.js +2 -2
  145. package/dist/prosekit-extensions-text-align.d.ts +2 -1
  146. package/dist/prosekit-extensions-text-align.d.ts.map +1 -0
  147. package/dist/prosekit-extensions-text-align.js +2 -1
  148. package/dist/prosekit-extensions-text-align.js.map +1 -0
  149. package/dist/prosekit-extensions-text.d.ts +2 -1
  150. package/dist/prosekit-extensions-text.d.ts.map +1 -0
  151. package/dist/prosekit-extensions-text.js +2 -1
  152. package/dist/prosekit-extensions-text.js.map +1 -0
  153. package/dist/prosekit-extensions-underline.d.ts +2 -1
  154. package/dist/prosekit-extensions-underline.d.ts.map +1 -0
  155. package/dist/prosekit-extensions-underline.js +2 -1
  156. package/dist/prosekit-extensions-underline.js.map +1 -0
  157. package/dist/prosekit-extensions-virtual-selection.d.ts +2 -1
  158. package/dist/prosekit-extensions-virtual-selection.d.ts.map +1 -0
  159. package/dist/prosekit-extensions-virtual-selection.js +3 -3
  160. package/dist/prosekit-extensions-virtual-selection.js.map +1 -0
  161. package/dist/prosekit-extensions-yjs.d.ts +2 -1
  162. package/dist/prosekit-extensions-yjs.d.ts.map +1 -0
  163. package/dist/prosekit-extensions-yjs.js +2 -1
  164. package/dist/prosekit-extensions-yjs.js.map +1 -0
  165. package/dist/prosekit-extensions.js +1 -0
  166. package/dist/search/style.css +2 -0
  167. package/dist/search/style.css.map +1 -0
  168. package/dist/search/style.js +1 -0
  169. package/dist/{shiki-highlighter-chunk-DSPM0T27.d.ts → shiki-highlighter-chunk-Cwu1Jr9o.d.ts} +2 -1
  170. package/dist/shiki-highlighter-chunk-Cwu1Jr9o.d.ts.map +1 -0
  171. package/dist/shiki-highlighter-chunk.d.ts +1 -1
  172. package/dist/shiki-highlighter-chunk.js +3 -5
  173. package/dist/shiki-highlighter-chunk.js.map +1 -0
  174. package/dist/table/style.css +2 -0
  175. package/dist/table/style.css.map +1 -0
  176. package/dist/table/style.js +1 -0
  177. package/dist/table-BNwuK7xg.js +297 -0
  178. package/dist/table-BNwuK7xg.js.map +1 -0
  179. package/dist/virtual-selection/style.css +2 -0
  180. package/dist/virtual-selection/style.css.map +1 -0
  181. package/dist/virtual-selection/style.js +1 -0
  182. package/dist/yjs/style.css +2 -0
  183. package/dist/yjs/style.css.map +1 -0
  184. package/dist/yjs/style.js +1 -0
  185. package/package.json +12 -10
  186. package/src/autocomplete/autocomplete-helpers.ts +74 -0
  187. package/src/autocomplete/autocomplete-plugin.ts +186 -0
  188. package/src/autocomplete/autocomplete-rule.ts +117 -0
  189. package/src/autocomplete/autocomplete.spec.ts +132 -0
  190. package/src/autocomplete/autocomplete.ts +29 -0
  191. package/src/autocomplete/index.ts +9 -0
  192. package/src/blockquote/blockquote-commands.ts +32 -0
  193. package/src/blockquote/blockquote-input-rule.ts +14 -0
  194. package/src/blockquote/blockquote-keymap.spec.ts +45 -0
  195. package/src/blockquote/blockquote-keymap.ts +31 -0
  196. package/src/blockquote/blockquote-spec.ts +24 -0
  197. package/src/blockquote/blockquote.ts +34 -0
  198. package/src/blockquote/index.ts +14 -0
  199. package/src/bold/bold-commands.ts +23 -0
  200. package/src/bold/bold-input-rule.spec.ts +51 -0
  201. package/src/bold/bold-input-rule.ts +18 -0
  202. package/src/bold/bold-keymap.ts +14 -0
  203. package/src/bold/bold-spec.ts +53 -0
  204. package/src/bold/bold.ts +32 -0
  205. package/src/bold/index.ts +14 -0
  206. package/src/code/code-commands.ts +23 -0
  207. package/src/code/code-input-rule.ts +18 -0
  208. package/src/code/code-keymap.ts +14 -0
  209. package/src/code/code-spec.ts +28 -0
  210. package/src/code/code.ts +32 -0
  211. package/src/code/index.ts +14 -0
  212. package/src/code-block/code-block-commands.ts +44 -0
  213. package/src/code-block/code-block-highlight.ts +40 -0
  214. package/src/code-block/code-block-input-rule.ts +36 -0
  215. package/src/code-block/code-block-keymap.ts +61 -0
  216. package/src/code-block/code-block-shiki.ts +58 -0
  217. package/src/code-block/code-block-spec.spec.ts +164 -0
  218. package/src/code-block/code-block-spec.ts +71 -0
  219. package/src/code-block/code-block-types.ts +8 -0
  220. package/src/code-block/code-block.ts +46 -0
  221. package/src/code-block/index.ts +32 -0
  222. package/src/code-block/shiki-bundle.ts +8 -0
  223. package/src/code-block/shiki-highlighter-chunk.ts +84 -0
  224. package/src/code-block/shiki-highlighter.ts +22 -0
  225. package/src/code-block/shiki-parser.ts +36 -0
  226. package/src/commit/index.ts +330 -0
  227. package/src/commit/style.css +7 -0
  228. package/src/doc/index.ts +21 -0
  229. package/src/drop-cursor/drop-cursor.ts +46 -0
  230. package/src/drop-cursor/index.ts +5 -0
  231. package/src/drop-indicator/drop-indicator-facet.ts +62 -0
  232. package/src/drop-indicator/drop-indicator.ts +35 -0
  233. package/src/drop-indicator/index.ts +14 -0
  234. package/src/enter-rule/index.ts +241 -0
  235. package/src/file/file-drop-handler.ts +75 -0
  236. package/src/file/file-paste-handler.spec.ts +95 -0
  237. package/src/file/file-paste-handler.ts +59 -0
  238. package/src/file/file-upload.ts +140 -0
  239. package/src/file/helpers.ts +39 -0
  240. package/src/file/index.ts +16 -0
  241. package/src/gap-cursor/gap-cursor.ts +28 -0
  242. package/src/gap-cursor/index.ts +4 -0
  243. package/src/gap-cursor/style.css +25 -0
  244. package/src/hard-break/hard-break-commands.ts +31 -0
  245. package/src/hard-break/hard-break-keymap.spec.ts +45 -0
  246. package/src/hard-break/hard-break-keymap.ts +16 -0
  247. package/src/hard-break/hard-break-spec.ts +31 -0
  248. package/src/hard-break/hard-break.ts +32 -0
  249. package/src/hard-break/index.ts +13 -0
  250. package/src/heading/heading-commands.ts +37 -0
  251. package/src/heading/heading-input-rule.ts +22 -0
  252. package/src/heading/heading-keymap.spec.ts +53 -0
  253. package/src/heading/heading-keymap.ts +40 -0
  254. package/src/heading/heading-spec.ts +39 -0
  255. package/src/heading/heading-types.ts +3 -0
  256. package/src/heading/heading.ts +34 -0
  257. package/src/heading/index.ts +15 -0
  258. package/src/horizontal-rule/horizontal-rule-commands.spec.ts +61 -0
  259. package/src/horizontal-rule/horizontal-rule-commands.ts +37 -0
  260. package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +61 -0
  261. package/src/horizontal-rule/horizontal-rule-input-rule.ts +26 -0
  262. package/src/horizontal-rule/horizontal-rule-spec.ts +21 -0
  263. package/src/horizontal-rule/horizontal-rule.ts +29 -0
  264. package/src/horizontal-rule/index.ts +14 -0
  265. package/src/image/image-commands.ts +36 -0
  266. package/src/image/image-spec.ts +72 -0
  267. package/src/image/image-upload-handler.ts +156 -0
  268. package/src/image/image.ts +25 -0
  269. package/src/image/index.ts +22 -0
  270. package/src/index.ts +1 -0
  271. package/src/input-rule/index.ts +237 -0
  272. package/src/italic/index.ts +14 -0
  273. package/src/italic/italic-commands.spec.ts +75 -0
  274. package/src/italic/italic-commands.ts +23 -0
  275. package/src/italic/italic-input-rule.spec.ts +25 -0
  276. package/src/italic/italic-input-rule.ts +18 -0
  277. package/src/italic/italic-keymap.ts +14 -0
  278. package/src/italic/italic-spec.ts +35 -0
  279. package/src/italic/italic.ts +34 -0
  280. package/src/link/index.spec.ts +88 -0
  281. package/src/link/index.ts +156 -0
  282. package/src/link/link-paste-rule.spec.ts +194 -0
  283. package/src/link/link-paste-rule.ts +22 -0
  284. package/src/link/link-regex.spec.ts +82 -0
  285. package/src/link/link-regex.ts +79 -0
  286. package/src/link/link-types.ts +8 -0
  287. package/src/list/index.ts +25 -0
  288. package/src/list/list-commands.ts +61 -0
  289. package/src/list/list-drop-indicator.ts +37 -0
  290. package/src/list/list-input-rules.ts +14 -0
  291. package/src/list/list-keymap.spec.ts +39 -0
  292. package/src/list/list-keymap.ts +48 -0
  293. package/src/list/list-plugins.ts +35 -0
  294. package/src/list/list-serializer.ts +38 -0
  295. package/src/list/list-spec.ts +60 -0
  296. package/src/list/list-types.spec.ts +10 -0
  297. package/src/list/list-types.ts +23 -0
  298. package/src/list/list.spec.ts +134 -0
  299. package/src/list/list.ts +38 -0
  300. package/src/list/style.css +128 -0
  301. package/src/loro/index.ts +17 -0
  302. package/src/loro/loro-commands.ts +27 -0
  303. package/src/loro/loro-cursor-plugin.ts +28 -0
  304. package/src/loro/loro-keymap.ts +23 -0
  305. package/src/loro/loro-sync-plugin.ts +14 -0
  306. package/src/loro/loro-undo-plugin.ts +12 -0
  307. package/src/loro/loro.ts +75 -0
  308. package/src/loro/style.css +33 -0
  309. package/src/mark-rule/apply.ts +129 -0
  310. package/src/mark-rule/index.ts +2 -0
  311. package/src/mark-rule/mark-rule.spec.ts +123 -0
  312. package/src/mark-rule/mark-rule.ts +48 -0
  313. package/src/mark-rule/range.ts +107 -0
  314. package/src/mark-rule/types.ts +30 -0
  315. package/src/mention/index.ts +90 -0
  316. package/src/mod-click-prevention/index.ts +35 -0
  317. package/src/paragraph/index.ts +7 -0
  318. package/src/paragraph/paragraph-commands.ts +29 -0
  319. package/src/paragraph/paragraph-keymap.ts +15 -0
  320. package/src/paragraph/paragraph-spec.ts +31 -0
  321. package/src/paragraph/paragraph.ts +37 -0
  322. package/src/paste-rule/index.ts +10 -0
  323. package/src/paste-rule/mark-paste-rule.spec.ts +112 -0
  324. package/src/paste-rule/mark-paste-rule.ts +194 -0
  325. package/src/paste-rule/paste-rule-plugin.ts +53 -0
  326. package/src/paste-rule/paste-rule.spec.ts +96 -0
  327. package/src/paste-rule/paste-rule.ts +60 -0
  328. package/src/paste-rule/split-text-by-regex.spec.ts +97 -0
  329. package/src/paste-rule/split-text-by-regex.ts +44 -0
  330. package/src/placeholder/index.ts +113 -0
  331. package/src/placeholder/style.css +7 -0
  332. package/src/readonly/index.ts +22 -0
  333. package/src/search/index.ts +140 -0
  334. package/src/search/style.css +13 -0
  335. package/src/strike/index.ts +101 -0
  336. package/src/table/index.ts +53 -0
  337. package/src/table/style.css +42 -0
  338. package/src/table/table-commands/delete-cell-selection.spec.ts +41 -0
  339. package/src/table/table-commands/delete-cell-selection.ts +1 -0
  340. package/src/table/table-commands/exit-table.spec.ts +45 -0
  341. package/src/table/table-commands/exit-table.ts +49 -0
  342. package/src/table/table-commands/insert-table.spec.ts +39 -0
  343. package/src/table/table-commands/insert-table.ts +80 -0
  344. package/src/table/table-commands/move-table-column.spec.ts +618 -0
  345. package/src/table/table-commands/move-table-column.ts +4 -0
  346. package/src/table/table-commands/move-table-row.spec.ts +380 -0
  347. package/src/table/table-commands/move-table-row.ts +4 -0
  348. package/src/table/table-commands/select-table-cell.spec.ts +34 -0
  349. package/src/table/table-commands/select-table-cell.ts +35 -0
  350. package/src/table/table-commands/select-table-column.spec.ts +33 -0
  351. package/src/table/table-commands/select-table-column.ts +39 -0
  352. package/src/table/table-commands/select-table-row.spec.ts +32 -0
  353. package/src/table/table-commands/select-table-row.ts +39 -0
  354. package/src/table/table-commands/select-table.spec.ts +36 -0
  355. package/src/table/table-commands/select-table.ts +50 -0
  356. package/src/table/table-commands.ts +110 -0
  357. package/src/table/table-drop-indicator.ts +40 -0
  358. package/src/table/table-plugins.ts +15 -0
  359. package/src/table/table-spec.spec.ts +113 -0
  360. package/src/table/table-spec.ts +109 -0
  361. package/src/table/table-utils.ts +16 -0
  362. package/src/table/table.ts +49 -0
  363. package/src/table/test-utils.ts +28 -0
  364. package/src/testing/clipboard.ts +58 -0
  365. package/src/testing/format-html.ts +5 -0
  366. package/src/testing/index.ts +161 -0
  367. package/src/testing/keyboard.ts +36 -0
  368. package/src/testing/markdown.ts +23 -0
  369. package/src/text/index.ts +24 -0
  370. package/src/text-align/index.ts +133 -0
  371. package/src/types/assert-type-equal.ts +8 -0
  372. package/src/underline/index.ts +83 -0
  373. package/src/virtual-selection/index.ts +100 -0
  374. package/src/virtual-selection/style.css +5 -0
  375. package/src/yjs/index.ts +22 -0
  376. package/src/yjs/style.css +31 -0
  377. package/src/yjs/yjs-commands.ts +27 -0
  378. package/src/yjs/yjs-cursor-plugin.ts +25 -0
  379. package/src/yjs/yjs-keymap.ts +23 -0
  380. package/src/yjs/yjs-sync-plugin.ts +23 -0
  381. package/src/yjs/yjs-undo-plugin.ts +87 -0
  382. package/src/yjs/yjs.ts +84 -0
  383. package/dist/drop-indicator-dB9rZn8e.js +0 -267
  384. package/dist/table-CPI9ZxbK.js +0 -760
@@ -0,0 +1,25 @@
1
+ .ProseMirror-gapcursor {
2
+ display: none;
3
+ position: relative;
4
+ pointer-events: none;
5
+ }
6
+
7
+ .ProseMirror-gapcursor:after {
8
+ display: block;
9
+ position: absolute;
10
+ top: -2px;
11
+ width: 20px;
12
+ border-top: 1px solid currentColor;
13
+ content: "";
14
+ animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;
15
+ }
16
+
17
+ @keyframes ProseMirror-cursor-blink {
18
+ to {
19
+ visibility: hidden;
20
+ }
21
+ }
22
+
23
+ .ProseMirror-focused .ProseMirror-gapcursor {
24
+ display: block;
25
+ }
@@ -0,0 +1,31 @@
1
+ import {
2
+ defineCommands,
3
+ insertNode,
4
+ type Extension,
5
+ } from '@prosekit/core'
6
+ import type { Command } from '@prosekit/pm/state'
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export type HardBreakCommandsExtension = Extension<{
12
+ Commands: {
13
+ insertHardBreak: []
14
+ }
15
+ }>
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export function insertHardBreak(): Command {
21
+ return insertNode({ type: 'hardBreak' })
22
+ }
23
+
24
+ /**
25
+ * @internal
26
+ */
27
+ export function defineHardBreakCommands(): HardBreakCommandsExtension {
28
+ return defineCommands({
29
+ insertHardBreak: insertHardBreak,
30
+ })
31
+ }
@@ -0,0 +1,45 @@
1
+ import {
2
+ describe,
3
+ expect,
4
+ it,
5
+ } from 'vitest'
6
+
7
+ import { setupTest } from '../testing'
8
+ import {
9
+ inputText,
10
+ pressKey,
11
+ } from '../testing/keyboard'
12
+
13
+ describe('defineHardBreakKeymap', () => {
14
+ it('should insert hard break', async () => {
15
+ const { editor, n } = setupTest()
16
+
17
+ const doc1 = n.doc(n.p('foo<a>bar'))
18
+ const doc2 = n.doc(n.p('foo', n.hardBreak(), 'bar'))
19
+
20
+ editor.set(doc1)
21
+ expect(editor.state.doc.toJSON()).toEqual(doc1.toJSON())
22
+ await pressKey('Shift-Enter')
23
+ expect(editor.state.doc.toJSON()).toEqual(doc2.toJSON())
24
+
25
+ editor.set(doc1)
26
+ expect(editor.state.doc.toJSON()).toEqual(doc1.toJSON())
27
+ await pressKey('Mod-Enter')
28
+ expect(editor.state.doc.toJSON()).toEqual(doc2.toJSON())
29
+ })
30
+
31
+ it('can continue to type after a hard break', async () => {
32
+ const { editor, n } = setupTest()
33
+
34
+ const doc1 = n.doc(n.p('foo<a>bar'))
35
+ const doc2 = n.doc(n.p('foo', n.hardBreak(), 'bar'))
36
+ const doc3 = n.doc(n.p('foo', n.hardBreak(), 'bazbar'))
37
+
38
+ editor.set(doc1)
39
+ expect(editor.state.doc.toJSON()).toEqual(doc1.toJSON())
40
+ await pressKey('Shift-Enter')
41
+ expect(editor.state.doc.toJSON()).toEqual(doc2.toJSON())
42
+ await inputText('baz')
43
+ expect(editor.state.doc.toJSON()).toEqual(doc3.toJSON())
44
+ })
45
+ })
@@ -0,0 +1,16 @@
1
+ import {
2
+ defineKeymap,
3
+ type PlainExtension,
4
+ } from '@prosekit/core'
5
+
6
+ import { insertHardBreak } from './hard-break-commands'
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export function defineHardBreakKeymap(): PlainExtension {
12
+ return defineKeymap({
13
+ 'Mod-Enter': insertHardBreak(),
14
+ 'Shift-Enter': insertHardBreak(),
15
+ })
16
+ }
@@ -0,0 +1,31 @@
1
+ import {
2
+ defineNodeSpec,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+ import type { Attrs } from '@prosekit/pm/model'
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export type HardBreakSpecExtension = Extension<{
11
+ Nodes: {
12
+ hardBreak: Attrs
13
+ }
14
+ }>
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ export function defineHardBreakSpec(): HardBreakSpecExtension {
20
+ return defineNodeSpec({
21
+ name: 'hardBreak',
22
+ inline: true,
23
+ selectable: false,
24
+ leafText: () => '\n',
25
+ group: 'inline',
26
+ parseDOM: [{ tag: 'br' }],
27
+ toDOM() {
28
+ return ['br']
29
+ },
30
+ })
31
+ }
@@ -0,0 +1,32 @@
1
+ import {
2
+ union,
3
+ type Union,
4
+ } from '@prosekit/core'
5
+
6
+ import {
7
+ defineHardBreakCommands,
8
+ type HardBreakCommandsExtension,
9
+ } from './hard-break-commands'
10
+ import { defineHardBreakKeymap } from './hard-break-keymap'
11
+ import {
12
+ defineHardBreakSpec,
13
+ type HardBreakSpecExtension,
14
+ } from './hard-break-spec'
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ export type HardBreakExtension = Union<
20
+ [HardBreakSpecExtension, HardBreakCommandsExtension]
21
+ >
22
+
23
+ /**
24
+ * @public
25
+ */
26
+ export function defineHardBreak(): HardBreakExtension {
27
+ return union(
28
+ defineHardBreakSpec(),
29
+ defineHardBreakKeymap(),
30
+ defineHardBreakCommands(),
31
+ )
32
+ }
@@ -0,0 +1,13 @@
1
+ export {
2
+ defineHardBreak,
3
+ type HardBreakExtension,
4
+ } from './hard-break'
5
+ export {
6
+ defineHardBreakCommands,
7
+ type HardBreakCommandsExtension,
8
+ } from './hard-break-commands'
9
+ export { defineHardBreakKeymap } from './hard-break-keymap'
10
+ export {
11
+ defineHardBreakSpec,
12
+ type HardBreakSpecExtension,
13
+ } from './hard-break-spec'
@@ -0,0 +1,37 @@
1
+ import {
2
+ defineCommands,
3
+ insertNode,
4
+ setBlockType,
5
+ toggleNode,
6
+ type Extension,
7
+ } from '@prosekit/core'
8
+
9
+ import type { HeadingAttrs } from './heading-types'
10
+
11
+ /**
12
+ * @internal
13
+ */
14
+ export type HeadingCommandsExtension = Extension<{
15
+ Commands: {
16
+ setHeading: [attrs?: HeadingAttrs | undefined]
17
+ insertHeading: [attrs?: HeadingAttrs | undefined]
18
+ toggleHeading: [attrs?: HeadingAttrs | undefined]
19
+ }
20
+ }>
21
+
22
+ /**
23
+ * @internal
24
+ */
25
+ export function defineHeadingCommands(): HeadingCommandsExtension {
26
+ return defineCommands({
27
+ setHeading: (attrs?: HeadingAttrs) => {
28
+ return setBlockType({ type: 'heading', attrs })
29
+ },
30
+ insertHeading: (attrs?: HeadingAttrs) => {
31
+ return insertNode({ type: 'heading', attrs })
32
+ },
33
+ toggleHeading: (attrs?: HeadingAttrs) => {
34
+ return toggleNode({ type: 'heading', attrs })
35
+ },
36
+ })
37
+ }
@@ -0,0 +1,22 @@
1
+ import type { PlainExtension } from '@prosekit/core'
2
+
3
+ import { defineTextBlockInputRule } from '../input-rule'
4
+
5
+ import type { HeadingAttrs } from './heading-types'
6
+
7
+ /**
8
+ * Converts the text block to a heading when `#` is typed at the start of a new
9
+ * line followed by a space.
10
+ *
11
+ * @internal
12
+ */
13
+ export function defineHeadingInputRule(): PlainExtension {
14
+ return defineTextBlockInputRule({
15
+ regex: /^(#{1,6})\s$/,
16
+ type: 'heading',
17
+ attrs: (match) => {
18
+ const level: number = match[1]?.length ?? 1
19
+ return { level } satisfies HeadingAttrs
20
+ },
21
+ })
22
+ }
@@ -0,0 +1,53 @@
1
+ import {
2
+ describe,
3
+ expect,
4
+ it,
5
+ } from 'vitest'
6
+
7
+ import { setupTest } from '../testing'
8
+ import { pressKey } from '../testing/keyboard'
9
+
10
+ describe('defineHeadingKeymap', () => {
11
+ it('should toggle heading', async () => {
12
+ const { editor, n } = setupTest()
13
+
14
+ const doc = n.doc(n.p('<a>Foo'), n.p('Bar'))
15
+ const docH1 = n.doc(n.h1('Foo'), n.p('Bar'))
16
+ const docH3 = n.doc(n.h3('Foo'), n.p('Bar'))
17
+
18
+ editor.set(doc)
19
+ expect(editor.state.doc.toJSON()).toEqual(doc.toJSON())
20
+ await pressKey('mod-alt-1')
21
+ expect(editor.state.doc.toJSON()).toEqual(docH1.toJSON())
22
+ await pressKey('mod-alt-1')
23
+ expect(editor.state.doc.toJSON()).toEqual(doc.toJSON())
24
+ await pressKey('mod-alt-3')
25
+ expect(editor.state.doc.toJSON()).toEqual(docH3.toJSON())
26
+ await pressKey('mod-alt-1')
27
+ expect(editor.state.doc.toJSON()).toEqual(docH1.toJSON())
28
+ })
29
+
30
+ it('should unset heading by pressing Backspace', async () => {
31
+ const { editor, n } = setupTest()
32
+
33
+ const doc1 = n.doc(n.h1('<a>'))
34
+ const doc2 = n.doc(n.p('<a>'))
35
+
36
+ editor.set(doc1)
37
+ expect(editor.state.doc.toJSON()).toEqual(doc1.toJSON())
38
+ await pressKey('Backspace')
39
+ expect(editor.state.doc.toJSON()).toEqual(doc2.toJSON())
40
+ })
41
+
42
+ it('should unset heading by pressing Backspace around text', async () => {
43
+ const { editor, n } = setupTest()
44
+
45
+ const doc1 = n.doc(n.h1('Foo'), n.h1('<a>Bar'))
46
+ const doc2 = n.doc(n.h1('Foo'), n.p('<a>Bar'))
47
+
48
+ editor.set(doc1)
49
+ expect(editor.state.doc.toJSON()).toEqual(doc1.toJSON())
50
+ await pressKey('Backspace')
51
+ expect(editor.state.doc.toJSON()).toEqual(doc2.toJSON())
52
+ })
53
+ })
@@ -0,0 +1,40 @@
1
+ import {
2
+ defineKeymap,
3
+ isAtBlockStart,
4
+ toggleNode,
5
+ unsetBlockType,
6
+ withSkipCodeBlock,
7
+ type PlainExtension,
8
+ } from '@prosekit/core'
9
+ import type { Command } from '@prosekit/pm/state'
10
+
11
+ function toggleHeadingKeybinding(level: number): Command {
12
+ return withSkipCodeBlock(toggleNode({ type: 'heading', attrs: { level } }))
13
+ }
14
+
15
+ /**
16
+ * Set the block type to default (usually `paragraph`) when pressing Backspace at
17
+ * the start of a heading block.
18
+ */
19
+ const backspaceUnsetHeading: Command = (state, dispatch, view) => {
20
+ const $pos = isAtBlockStart(state, view)
21
+ if ($pos?.parent.type.name === 'heading') {
22
+ return unsetBlockType()(state, dispatch, view)
23
+ }
24
+ return false
25
+ }
26
+
27
+ /**
28
+ * @internal
29
+ */
30
+ export function defineHeadingKeymap(): PlainExtension {
31
+ return defineKeymap({
32
+ 'mod-alt-1': toggleHeadingKeybinding(1),
33
+ 'mod-alt-2': toggleHeadingKeybinding(2),
34
+ 'mod-alt-3': toggleHeadingKeybinding(3),
35
+ 'mod-alt-4': toggleHeadingKeybinding(4),
36
+ 'mod-alt-5': toggleHeadingKeybinding(5),
37
+ 'mod-alt-6': toggleHeadingKeybinding(6),
38
+ 'Backspace': backspaceUnsetHeading,
39
+ })
40
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ defineNodeSpec,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+
6
+ import type { HeadingAttrs } from './heading-types'
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export type HeadingSpecExtension = Extension<{
12
+ Nodes: {
13
+ heading: HeadingAttrs
14
+ }
15
+ }>
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export function defineHeadingSpec(): HeadingSpecExtension {
21
+ return defineNodeSpec({
22
+ name: 'heading',
23
+ attrs: { level: { default: 1, validate: 'number' } },
24
+ content: 'inline*',
25
+ group: 'block',
26
+ defining: true,
27
+ parseDOM: [
28
+ { tag: 'h1', attrs: { level: 1 } },
29
+ { tag: 'h2', attrs: { level: 2 } },
30
+ { tag: 'h3', attrs: { level: 3 } },
31
+ { tag: 'h4', attrs: { level: 4 } },
32
+ { tag: 'h5', attrs: { level: 5 } },
33
+ { tag: 'h6', attrs: { level: 6 } },
34
+ ],
35
+ toDOM(node) {
36
+ return [`h${node.attrs.level}`, 0]
37
+ },
38
+ })
39
+ }
@@ -0,0 +1,3 @@
1
+ export interface HeadingAttrs {
2
+ level: number
3
+ }
@@ -0,0 +1,34 @@
1
+ import {
2
+ union,
3
+ type Union,
4
+ } from '@prosekit/core'
5
+
6
+ import {
7
+ defineHeadingCommands,
8
+ type HeadingCommandsExtension,
9
+ } from './heading-commands'
10
+ import { defineHeadingInputRule } from './heading-input-rule'
11
+ import { defineHeadingKeymap } from './heading-keymap'
12
+ import {
13
+ defineHeadingSpec,
14
+ type HeadingSpecExtension,
15
+ } from './heading-spec'
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export type HeadingExtension = Union<
21
+ [HeadingSpecExtension, HeadingCommandsExtension]
22
+ >
23
+
24
+ /**
25
+ * @public
26
+ */
27
+ export function defineHeading(): HeadingExtension {
28
+ return union(
29
+ defineHeadingSpec(),
30
+ defineHeadingInputRule(),
31
+ defineHeadingKeymap(),
32
+ defineHeadingCommands(),
33
+ )
34
+ }
@@ -0,0 +1,15 @@
1
+ export {
2
+ defineHeading,
3
+ type HeadingExtension,
4
+ } from './heading'
5
+ export {
6
+ defineHeadingCommands,
7
+ type HeadingCommandsExtension,
8
+ } from './heading-commands'
9
+ export { defineHeadingInputRule } from './heading-input-rule'
10
+ export { defineHeadingKeymap } from './heading-keymap'
11
+ export {
12
+ defineHeadingSpec,
13
+ type HeadingSpecExtension,
14
+ } from './heading-spec'
15
+ export type { HeadingAttrs } from './heading-types'
@@ -0,0 +1,61 @@
1
+ import {
2
+ describe,
3
+ expect,
4
+ it,
5
+ } from 'vitest'
6
+
7
+ import { setupTest } from '../testing'
8
+
9
+ describe('insertHorizontalRule', () => {
10
+ const { editor, n } = setupTest()
11
+
12
+ it('should insert a horizontal rule in an empty paragraph', () => {
13
+ const doc = n.doc(n.p('<a>'))
14
+ editor.set(doc)
15
+
16
+ editor.commands.insertHorizontalRule()
17
+ expect(editor.view.state.doc.toJSON()).toEqual(
18
+ n.doc(n.horizontalRule()).toJSON(),
19
+ )
20
+ })
21
+
22
+ it('should insert a horizontal rule after some text', () => {
23
+ const doc = n.doc(n.p('123<a>'))
24
+ editor.set(doc)
25
+
26
+ editor.commands.insertHorizontalRule()
27
+ expect(editor.view.state.doc.toJSON()).toEqual(
28
+ n.doc(n.p('123'), n.horizontalRule()).toJSON(),
29
+ )
30
+ })
31
+
32
+ it('should insert a horizontal rule before some text', () => {
33
+ const doc = n.doc(n.p('<a>123'))
34
+ editor.set(doc)
35
+
36
+ editor.commands.insertHorizontalRule()
37
+ expect(editor.view.state.doc.toJSON()).toEqual(
38
+ n.doc(n.horizontalRule(), n.p('123')).toJSON(),
39
+ )
40
+ })
41
+
42
+ it('should insert a horizontal rule between some text', () => {
43
+ const doc = n.doc(n.p('123<a>456'))
44
+ editor.set(doc)
45
+
46
+ editor.commands.insertHorizontalRule()
47
+ expect(editor.view.state.doc.toJSON()).toEqual(
48
+ n.doc(n.p('123'), n.horizontalRule(), n.p('456')).toJSON(),
49
+ )
50
+ })
51
+
52
+ it('should keep the selected text', () => {
53
+ const doc = n.doc(n.p('123<a>4<b>56'))
54
+ editor.set(doc)
55
+
56
+ editor.commands.insertHorizontalRule()
57
+ expect(editor.view.state.doc.toJSON()).toEqual(
58
+ n.doc(n.p('123'), n.horizontalRule(), n.p('456')).toJSON(),
59
+ )
60
+ })
61
+ })
@@ -0,0 +1,37 @@
1
+ import {
2
+ defineCommands,
3
+ getNodeType,
4
+ type Extension,
5
+ } from '@prosekit/core'
6
+ import {
7
+ Fragment,
8
+ Slice,
9
+ } from '@prosekit/pm/model'
10
+ import type { Command } from '@prosekit/pm/state'
11
+
12
+ export type HorizontalRuleCommandsExtension = Extension<{
13
+ Commands: {
14
+ insertHorizontalRule: []
15
+ }
16
+ }>
17
+
18
+ /**
19
+ * Returns a command that inserts a horizontal rule at the current selection.
20
+ */
21
+ export function insertHorizontalRule(): Command {
22
+ return (state, dispatch) => {
23
+ if (!dispatch) return true
24
+
25
+ const { schema, tr } = state
26
+ const type = getNodeType(schema, 'horizontalRule')
27
+ const node = type.createChecked()
28
+ const pos = tr.selection.anchor
29
+ tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0))
30
+ dispatch(tr)
31
+ return true
32
+ }
33
+ }
34
+
35
+ export function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension {
36
+ return defineCommands({ insertHorizontalRule })
37
+ }
@@ -0,0 +1,61 @@
1
+ import {
2
+ describe,
3
+ expect,
4
+ it,
5
+ } from 'vitest'
6
+
7
+ import { setupTest } from '../testing'
8
+ import { inputText } from '../testing/keyboard'
9
+
10
+ describe('defineHorizontalRuleInputRule', () => {
11
+ const { editor, n } = setupTest()
12
+ it('should insert a horizontal rule when typing "---" in an empty paragraph', async () => {
13
+ const doc = n.doc(n.p('<a>'))
14
+ editor.set(doc)
15
+
16
+ await inputText('---')
17
+ expect(editor.view.state.doc.toJSON()).toEqual(
18
+ n.doc(n.horizontalRule(), n.p()).toJSON(),
19
+ )
20
+
21
+ await inputText('x')
22
+ expect(editor.view.state.doc.toJSON()).toEqual(
23
+ n.doc(n.horizontalRule(), n.p('x')).toJSON(),
24
+ )
25
+ })
26
+
27
+ it('should insert a horizontal rule when typing "---" before some text', async () => {
28
+ const doc = n.doc(n.p('<a>123'))
29
+ editor.set(doc)
30
+
31
+ await inputText('---')
32
+ expect(editor.view.state.doc.toJSON()).toEqual(
33
+ n.doc(n.horizontalRule(), n.p('123')).toJSON(),
34
+ )
35
+
36
+ await inputText('x')
37
+ expect(editor.view.state.doc.toJSON()).toEqual(
38
+ n.doc(n.horizontalRule(), n.p('x123')).toJSON(),
39
+ )
40
+ })
41
+
42
+ it('should not insert a horizontal rule when typing "---" after some text', async () => {
43
+ const doc = n.doc(n.p('123<a>'))
44
+ editor.set(doc)
45
+
46
+ await inputText('---')
47
+ expect(editor.view.state.doc.toJSON()).toEqual(
48
+ n.doc(n.p('123---')).toJSON(),
49
+ )
50
+ })
51
+
52
+ it('should not insert a horizontal rule inside a code block', async () => {
53
+ const doc = n.doc(n.codeBlock('<a>'))
54
+ editor.set(doc)
55
+
56
+ await inputText('---')
57
+ expect(editor.view.state.doc.toJSON()).toEqual(
58
+ n.doc(n.codeBlock('---')).toJSON(),
59
+ )
60
+ })
61
+ })
@@ -0,0 +1,26 @@
1
+ import {
2
+ getNodeType,
3
+ union,
4
+ type PlainExtension,
5
+ } from '@prosekit/core'
6
+ import { InputRule } from '@prosekit/pm/inputrules'
7
+
8
+ import { defineInputRule } from '../input-rule'
9
+
10
+ /**
11
+ * @public
12
+ */
13
+ export function defineHorizontalRuleInputRule(): PlainExtension {
14
+ return union(
15
+ defineInputRule(
16
+ new InputRule(/^---$/, (state, match, start, end) => {
17
+ const { schema } = state
18
+ const { tr } = state
19
+ const type = getNodeType(schema, 'horizontalRule')
20
+ const node = type.createChecked()
21
+ tr.delete(start, end).insert(start - 1, node)
22
+ return tr.scrollIntoView()
23
+ }),
24
+ ),
25
+ )
26
+ }
@@ -0,0 +1,21 @@
1
+ import {
2
+ defineNodeSpec,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+ import type { Attrs } from '@prosekit/pm/model'
6
+
7
+ export type HorizontalRuleSpecExtension = Extension<{
8
+ Nodes: {
9
+ horizontalRule: Attrs
10
+ }
11
+ }>
12
+
13
+ export function defineHorizontalRuleSpec(): HorizontalRuleSpecExtension {
14
+ return defineNodeSpec({
15
+ name: 'horizontalRule',
16
+ group: 'block',
17
+ parseDOM: [{ tag: 'hr' }],
18
+ // Wrap the `<hr>` in a `<div>` so that we can make it taller and easier to click.
19
+ toDOM: () => ['div', { class: 'prosekit-horizontal-rule' }, ['hr']],
20
+ })
21
+ }
@@ -0,0 +1,29 @@
1
+ import {
2
+ union,
3
+ type Union,
4
+ } from '@prosekit/core'
5
+
6
+ import {
7
+ defineHorizontalRuleCommands,
8
+ type HorizontalRuleCommandsExtension,
9
+ } from './horizontal-rule-commands'
10
+ import { defineHorizontalRuleInputRule } from './horizontal-rule-input-rule'
11
+ import {
12
+ defineHorizontalRuleSpec,
13
+ type HorizontalRuleSpecExtension,
14
+ } from './horizontal-rule-spec'
15
+
16
+ export type HorizontalRuleExtension = Union<
17
+ [HorizontalRuleSpecExtension, HorizontalRuleCommandsExtension]
18
+ >
19
+
20
+ /**
21
+ * @public
22
+ */
23
+ export function defineHorizontalRule(): HorizontalRuleExtension {
24
+ return union(
25
+ defineHorizontalRuleSpec(),
26
+ defineHorizontalRuleInputRule(),
27
+ defineHorizontalRuleCommands(),
28
+ )
29
+ }