@prosekit/extensions 0.11.3 → 0.11.5

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 (383) 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-B8P652g2.js → drop-indicator-D1eHOhSi.js} +6 -5
  5. package/dist/drop-indicator-D1eHOhSi.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/gap-cursor/style.css +2 -0
  9. package/dist/gap-cursor/style.css.map +1 -0
  10. package/dist/gap-cursor/style.js +1 -0
  11. package/dist/{input-rule-Gji4N7Oe.js → input-rule-B17tpW4m.js} +3 -3
  12. package/dist/input-rule-B17tpW4m.js.map +1 -0
  13. package/dist/list/style.css +2 -0
  14. package/dist/list/style.css.map +1 -0
  15. package/dist/list/style.js +1 -0
  16. package/dist/loro/style.css +2 -0
  17. package/dist/loro/style.css.map +1 -0
  18. package/dist/loro/style.js +1 -0
  19. package/dist/{mark-rule-D7zaa32n.js → mark-rule-BCqIZMDu.js} +3 -3
  20. package/dist/mark-rule-BCqIZMDu.js.map +1 -0
  21. package/dist/{paste-rule-Cca3n5TA.js → paste-rule-DIEJKIje.js} +5 -15
  22. package/dist/paste-rule-DIEJKIje.js.map +1 -0
  23. package/dist/placeholder/style.css +2 -0
  24. package/dist/placeholder/style.css.map +1 -0
  25. package/dist/placeholder/style.js +1 -0
  26. package/dist/prosekit-extensions-autocomplete.d.ts +2 -1
  27. package/dist/prosekit-extensions-autocomplete.d.ts.map +1 -0
  28. package/dist/prosekit-extensions-autocomplete.js +2 -9
  29. package/dist/prosekit-extensions-autocomplete.js.map +1 -0
  30. package/dist/prosekit-extensions-blockquote.d.ts +2 -1
  31. package/dist/prosekit-extensions-blockquote.d.ts.map +1 -0
  32. package/dist/prosekit-extensions-blockquote.js +4 -4
  33. package/dist/prosekit-extensions-blockquote.js.map +1 -0
  34. package/dist/prosekit-extensions-bold.d.ts +2 -1
  35. package/dist/prosekit-extensions-bold.d.ts.map +1 -0
  36. package/dist/prosekit-extensions-bold.js +3 -2
  37. package/dist/prosekit-extensions-bold.js.map +1 -0
  38. package/dist/prosekit-extensions-code-block.d.ts +2 -1
  39. package/dist/prosekit-extensions-code-block.d.ts.map +1 -0
  40. package/dist/prosekit-extensions-code-block.js +5 -6
  41. package/dist/prosekit-extensions-code-block.js.map +1 -0
  42. package/dist/prosekit-extensions-code.d.ts +2 -1
  43. package/dist/prosekit-extensions-code.d.ts.map +1 -0
  44. package/dist/prosekit-extensions-code.js +3 -2
  45. package/dist/prosekit-extensions-code.js.map +1 -0
  46. package/dist/prosekit-extensions-commit.d.ts +2 -1
  47. package/dist/prosekit-extensions-commit.d.ts.map +1 -0
  48. package/dist/prosekit-extensions-commit.js +11 -13
  49. package/dist/prosekit-extensions-commit.js.map +1 -0
  50. package/dist/prosekit-extensions-doc.d.ts +2 -1
  51. package/dist/prosekit-extensions-doc.d.ts.map +1 -0
  52. package/dist/prosekit-extensions-doc.js +2 -1
  53. package/dist/prosekit-extensions-doc.js.map +1 -0
  54. package/dist/prosekit-extensions-drop-cursor.d.ts +2 -1
  55. package/dist/prosekit-extensions-drop-cursor.d.ts.map +1 -0
  56. package/dist/prosekit-extensions-drop-cursor.js +2 -1
  57. package/dist/prosekit-extensions-drop-cursor.js.map +1 -0
  58. package/dist/prosekit-extensions-drop-indicator.d.ts +2 -1
  59. package/dist/prosekit-extensions-drop-indicator.d.ts.map +1 -0
  60. package/dist/prosekit-extensions-drop-indicator.js +1 -1
  61. package/dist/prosekit-extensions-enter-rule.d.ts +2 -1
  62. package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -0
  63. package/dist/prosekit-extensions-file.d.ts +2 -1
  64. package/dist/prosekit-extensions-file.d.ts.map +1 -0
  65. package/dist/prosekit-extensions-file.js +4 -16
  66. package/dist/prosekit-extensions-file.js.map +1 -0
  67. package/dist/prosekit-extensions-gap-cursor.d.ts +2 -2
  68. package/dist/prosekit-extensions-gap-cursor.d.ts.map +1 -0
  69. package/dist/prosekit-extensions-gap-cursor.js +2 -1
  70. package/dist/prosekit-extensions-gap-cursor.js.map +1 -0
  71. package/dist/prosekit-extensions-hard-break.d.ts +2 -1
  72. package/dist/prosekit-extensions-hard-break.d.ts.map +1 -0
  73. package/dist/prosekit-extensions-hard-break.js +2 -1
  74. package/dist/prosekit-extensions-hard-break.js.map +1 -0
  75. package/dist/prosekit-extensions-heading.d.ts +2 -1
  76. package/dist/prosekit-extensions-heading.d.ts.map +1 -0
  77. package/dist/prosekit-extensions-heading.js +5 -6
  78. package/dist/prosekit-extensions-heading.js.map +1 -0
  79. package/dist/prosekit-extensions-horizontal-rule.d.ts +2 -1
  80. package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -0
  81. package/dist/prosekit-extensions-horizontal-rule.js +5 -6
  82. package/dist/prosekit-extensions-horizontal-rule.js.map +1 -0
  83. package/dist/prosekit-extensions-image.d.ts +2 -1
  84. package/dist/prosekit-extensions-image.d.ts.map +1 -0
  85. package/dist/prosekit-extensions-image.js +3 -3
  86. package/dist/prosekit-extensions-image.js.map +1 -0
  87. package/dist/prosekit-extensions-input-rule.d.ts +2 -1
  88. package/dist/prosekit-extensions-input-rule.d.ts.map +1 -0
  89. package/dist/prosekit-extensions-input-rule.js +1 -1
  90. package/dist/prosekit-extensions-italic.d.ts +2 -1
  91. package/dist/prosekit-extensions-italic.d.ts.map +1 -0
  92. package/dist/prosekit-extensions-italic.js +3 -2
  93. package/dist/prosekit-extensions-italic.js.map +1 -0
  94. package/dist/prosekit-extensions-link.d.ts +2 -1
  95. package/dist/prosekit-extensions-link.d.ts.map +1 -0
  96. package/dist/prosekit-extensions-link.js +6 -5
  97. package/dist/prosekit-extensions-link.js.map +1 -0
  98. package/dist/prosekit-extensions-list.d.ts +22 -21
  99. package/dist/prosekit-extensions-list.d.ts.map +1 -0
  100. package/dist/prosekit-extensions-list.js +6 -7
  101. package/dist/prosekit-extensions-list.js.map +1 -0
  102. package/dist/prosekit-extensions-loro.d.ts +14 -13
  103. package/dist/prosekit-extensions-loro.d.ts.map +1 -0
  104. package/dist/prosekit-extensions-loro.js +2 -1
  105. package/dist/prosekit-extensions-loro.js.map +1 -0
  106. package/dist/prosekit-extensions-mark-rule.d.ts +2 -1
  107. package/dist/prosekit-extensions-mark-rule.d.ts.map +1 -0
  108. package/dist/prosekit-extensions-mark-rule.js +1 -1
  109. package/dist/prosekit-extensions-mention.d.ts +2 -1
  110. package/dist/prosekit-extensions-mention.d.ts.map +1 -0
  111. package/dist/prosekit-extensions-mention.js +2 -1
  112. package/dist/prosekit-extensions-mention.js.map +1 -0
  113. package/dist/prosekit-extensions-mod-click-prevention.d.ts +2 -1
  114. package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +1 -0
  115. package/dist/prosekit-extensions-mod-click-prevention.js +2 -1
  116. package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -0
  117. package/dist/prosekit-extensions-paragraph.d.ts +2 -1
  118. package/dist/prosekit-extensions-paragraph.d.ts.map +1 -0
  119. package/dist/prosekit-extensions-paragraph.js +2 -1
  120. package/dist/prosekit-extensions-paragraph.js.map +1 -0
  121. package/dist/prosekit-extensions-paste-rule.d.ts +2 -1
  122. package/dist/prosekit-extensions-paste-rule.d.ts.map +1 -0
  123. package/dist/prosekit-extensions-paste-rule.js +1 -1
  124. package/dist/prosekit-extensions-placeholder.d.ts +2 -1
  125. package/dist/prosekit-extensions-placeholder.d.ts.map +1 -0
  126. package/dist/prosekit-extensions-placeholder.js +5 -4
  127. package/dist/prosekit-extensions-placeholder.js.map +1 -0
  128. package/dist/prosekit-extensions-readonly.d.ts +2 -1
  129. package/dist/prosekit-extensions-readonly.d.ts.map +1 -0
  130. package/dist/prosekit-extensions-readonly.js +2 -1
  131. package/dist/prosekit-extensions-readonly.js.map +1 -0
  132. package/dist/prosekit-extensions-search.d.ts +2 -1
  133. package/dist/prosekit-extensions-search.d.ts.map +1 -0
  134. package/dist/prosekit-extensions-search.js +3 -3
  135. package/dist/prosekit-extensions-search.js.map +1 -0
  136. package/dist/prosekit-extensions-strike.d.ts +2 -1
  137. package/dist/prosekit-extensions-strike.d.ts.map +1 -0
  138. package/dist/prosekit-extensions-strike.js +3 -2
  139. package/dist/prosekit-extensions-strike.js.map +1 -0
  140. package/dist/prosekit-extensions-table.d.ts +56 -114
  141. package/dist/prosekit-extensions-table.d.ts.map +1 -0
  142. package/dist/prosekit-extensions-table.js +3 -2
  143. package/dist/prosekit-extensions-text-align.d.ts +2 -1
  144. package/dist/prosekit-extensions-text-align.d.ts.map +1 -0
  145. package/dist/prosekit-extensions-text-align.js +2 -1
  146. package/dist/prosekit-extensions-text-align.js.map +1 -0
  147. package/dist/prosekit-extensions-text.d.ts +2 -1
  148. package/dist/prosekit-extensions-text.d.ts.map +1 -0
  149. package/dist/prosekit-extensions-text.js +2 -1
  150. package/dist/prosekit-extensions-text.js.map +1 -0
  151. package/dist/prosekit-extensions-underline.d.ts +2 -1
  152. package/dist/prosekit-extensions-underline.d.ts.map +1 -0
  153. package/dist/prosekit-extensions-underline.js +2 -1
  154. package/dist/prosekit-extensions-underline.js.map +1 -0
  155. package/dist/prosekit-extensions-virtual-selection.d.ts +2 -1
  156. package/dist/prosekit-extensions-virtual-selection.d.ts.map +1 -0
  157. package/dist/prosekit-extensions-virtual-selection.js +3 -3
  158. package/dist/prosekit-extensions-virtual-selection.js.map +1 -0
  159. package/dist/prosekit-extensions-yjs.d.ts +2 -1
  160. package/dist/prosekit-extensions-yjs.d.ts.map +1 -0
  161. package/dist/prosekit-extensions-yjs.js +2 -1
  162. package/dist/prosekit-extensions-yjs.js.map +1 -0
  163. package/dist/prosekit-extensions.d.ts +1 -1
  164. package/dist/prosekit-extensions.js +1 -0
  165. package/dist/search/style.css +2 -0
  166. package/dist/search/style.css.map +1 -0
  167. package/dist/search/style.js +1 -0
  168. package/dist/shiki-highlighter-chunk-DSPM0T27.d.ts +2 -1
  169. package/dist/shiki-highlighter-chunk-DSPM0T27.d.ts.map +1 -0
  170. package/dist/shiki-highlighter-chunk.js +3 -5
  171. package/dist/shiki-highlighter-chunk.js.map +1 -0
  172. package/dist/table/style.css +2 -0
  173. package/dist/table/style.css.map +1 -0
  174. package/dist/table/style.js +1 -0
  175. package/dist/table-Bi7WsMI3.js +297 -0
  176. package/dist/table-Bi7WsMI3.js.map +1 -0
  177. package/dist/virtual-selection/style.css +2 -0
  178. package/dist/virtual-selection/style.css.map +1 -0
  179. package/dist/virtual-selection/style.js +1 -0
  180. package/dist/yjs/style.css +2 -0
  181. package/dist/yjs/style.css.map +1 -0
  182. package/dist/yjs/style.js +1 -0
  183. package/package.json +10 -9
  184. package/src/autocomplete/autocomplete-helpers.ts +74 -0
  185. package/src/autocomplete/autocomplete-plugin.ts +186 -0
  186. package/src/autocomplete/autocomplete-rule.ts +117 -0
  187. package/src/autocomplete/autocomplete.spec.ts +132 -0
  188. package/src/autocomplete/autocomplete.ts +29 -0
  189. package/src/autocomplete/index.ts +9 -0
  190. package/src/blockquote/blockquote-commands.ts +32 -0
  191. package/src/blockquote/blockquote-input-rule.ts +14 -0
  192. package/src/blockquote/blockquote-keymap.spec.ts +45 -0
  193. package/src/blockquote/blockquote-keymap.ts +31 -0
  194. package/src/blockquote/blockquote-spec.ts +24 -0
  195. package/src/blockquote/blockquote.ts +34 -0
  196. package/src/blockquote/index.ts +14 -0
  197. package/src/bold/bold-commands.ts +23 -0
  198. package/src/bold/bold-input-rule.spec.ts +51 -0
  199. package/src/bold/bold-input-rule.ts +18 -0
  200. package/src/bold/bold-keymap.ts +14 -0
  201. package/src/bold/bold-spec.ts +53 -0
  202. package/src/bold/bold.ts +32 -0
  203. package/src/bold/index.ts +14 -0
  204. package/src/code/code-commands.ts +23 -0
  205. package/src/code/code-input-rule.ts +18 -0
  206. package/src/code/code-keymap.ts +14 -0
  207. package/src/code/code-spec.ts +28 -0
  208. package/src/code/code.ts +32 -0
  209. package/src/code/index.ts +14 -0
  210. package/src/code-block/code-block-commands.ts +44 -0
  211. package/src/code-block/code-block-highlight.ts +40 -0
  212. package/src/code-block/code-block-input-rule.ts +36 -0
  213. package/src/code-block/code-block-keymap.ts +61 -0
  214. package/src/code-block/code-block-shiki.ts +58 -0
  215. package/src/code-block/code-block-spec.spec.ts +164 -0
  216. package/src/code-block/code-block-spec.ts +71 -0
  217. package/src/code-block/code-block-types.ts +8 -0
  218. package/src/code-block/code-block.ts +46 -0
  219. package/src/code-block/index.ts +32 -0
  220. package/src/code-block/shiki-bundle.ts +8 -0
  221. package/src/code-block/shiki-highlighter-chunk.ts +84 -0
  222. package/src/code-block/shiki-highlighter.ts +22 -0
  223. package/src/code-block/shiki-parser.ts +36 -0
  224. package/src/commit/index.ts +330 -0
  225. package/src/commit/style.css +7 -0
  226. package/src/doc/index.ts +21 -0
  227. package/src/drop-cursor/drop-cursor.ts +46 -0
  228. package/src/drop-cursor/index.ts +5 -0
  229. package/src/drop-indicator/drop-indicator-facet.ts +84 -0
  230. package/src/drop-indicator/drop-indicator-plugin.ts +147 -0
  231. package/src/drop-indicator/drop-indicator.ts +37 -0
  232. package/src/drop-indicator/drop-target.ts +168 -0
  233. package/src/drop-indicator/index.ts +14 -0
  234. package/src/drop-indicator/types.ts +90 -0
  235. package/src/enter-rule/index.ts +241 -0
  236. package/src/file/file-drop-handler.ts +75 -0
  237. package/src/file/file-paste-handler.spec.ts +95 -0
  238. package/src/file/file-paste-handler.ts +59 -0
  239. package/src/file/file-upload.ts +119 -0
  240. package/src/file/helpers.ts +39 -0
  241. package/src/file/index.ts +16 -0
  242. package/src/gap-cursor/gap-cursor.ts +28 -0
  243. package/src/gap-cursor/index.ts +4 -0
  244. package/src/gap-cursor/style.css +25 -0
  245. package/src/hard-break/hard-break-commands.ts +31 -0
  246. package/src/hard-break/hard-break-keymap.spec.ts +45 -0
  247. package/src/hard-break/hard-break-keymap.ts +16 -0
  248. package/src/hard-break/hard-break-spec.ts +31 -0
  249. package/src/hard-break/hard-break.ts +32 -0
  250. package/src/hard-break/index.ts +13 -0
  251. package/src/heading/heading-commands.ts +37 -0
  252. package/src/heading/heading-input-rule.ts +22 -0
  253. package/src/heading/heading-keymap.spec.ts +53 -0
  254. package/src/heading/heading-keymap.ts +40 -0
  255. package/src/heading/heading-spec.ts +39 -0
  256. package/src/heading/heading-types.ts +3 -0
  257. package/src/heading/heading.ts +34 -0
  258. package/src/heading/index.ts +15 -0
  259. package/src/horizontal-rule/horizontal-rule-commands.spec.ts +61 -0
  260. package/src/horizontal-rule/horizontal-rule-commands.ts +37 -0
  261. package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +61 -0
  262. package/src/horizontal-rule/horizontal-rule-input-rule.ts +26 -0
  263. package/src/horizontal-rule/horizontal-rule-spec.ts +21 -0
  264. package/src/horizontal-rule/horizontal-rule.ts +29 -0
  265. package/src/horizontal-rule/index.ts +14 -0
  266. package/src/image/image-commands.ts +27 -0
  267. package/src/image/image-spec.ts +72 -0
  268. package/src/image/image.ts +25 -0
  269. package/src/image/index.ts +13 -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/table-C_qAMj5-.js +0 -734
@@ -0,0 +1,237 @@
1
+ import {
2
+ defineFacet,
3
+ defineFacetPayload,
4
+ getMarkType,
5
+ getNodeType,
6
+ isMarkAbsent,
7
+ maybeRun,
8
+ pluginFacet,
9
+ type PlainExtension,
10
+ type PluginPayload,
11
+ } from '@prosekit/core'
12
+ import {
13
+ InputRule,
14
+ inputRules,
15
+ textblockTypeInputRule,
16
+ wrappingInputRule,
17
+ } from '@prosekit/pm/inputrules'
18
+ import type {
19
+ Attrs,
20
+ MarkType,
21
+ NodeType,
22
+ ProseMirrorNode,
23
+ Schema,
24
+ } from '@prosekit/pm/model'
25
+ import type { Plugin } from '@prosekit/pm/state'
26
+
27
+ /**
28
+ * Defines an input rule extension.
29
+ *
30
+ * @param rule - The ProseMirror input rule to add.
31
+ *
32
+ * @public
33
+ */
34
+ export function defineInputRule(rule: InputRule): PlainExtension {
35
+ return defineInputRuleFacetPayload(() => rule)
36
+ }
37
+
38
+ /**
39
+ * Options for {@link defineMarkInputRule}.
40
+ *
41
+ * @public
42
+ */
43
+ export interface MarkInputRuleOptions {
44
+ /**
45
+ * The regular expression to match against, which should end with `$` and has
46
+ * exactly one capture group. All other matched text outside the capture group
47
+ * will be deleted.
48
+ */
49
+ regex: RegExp
50
+
51
+ /**
52
+ * The type of mark to set.
53
+ */
54
+ type: string | MarkType
55
+
56
+ /**
57
+ * Attributes to set on the mark.
58
+ */
59
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)
60
+
61
+ /**
62
+ * Whether this rule should fire inside marks marked as [code](https://prosemirror.net/docs/ref/#model.MarkSpec.code).
63
+ *
64
+ * @default `false`
65
+ */
66
+ inCodeMark?: boolean
67
+ }
68
+
69
+ /**
70
+ * @internal
71
+ */
72
+ export function createMarkInputRule({
73
+ regex,
74
+ type,
75
+ attrs = null,
76
+ inCodeMark = false,
77
+ }: MarkInputRuleOptions): InputRule {
78
+ const rule = new InputRule(regex, (state, match, start, end) => {
79
+ const { tr, schema } = state
80
+ const [fullText, markText] = match
81
+
82
+ if (!markText) {
83
+ return null
84
+ }
85
+
86
+ const markStart = start + fullText.indexOf(markText)
87
+ const markEnd = markStart + markText.length
88
+
89
+ if (!(start <= markStart && markStart < markEnd && markEnd <= end)) {
90
+ // Incorrect regex.
91
+ return null
92
+ }
93
+
94
+ const markType = getMarkType(schema, type)
95
+ const mark = markType.create(maybeRun(attrs, match))
96
+
97
+ if (!isMarkAbsent(tr.doc, markStart, markEnd, markType, attrs)) {
98
+ // The mark is already active.
99
+ return null
100
+ }
101
+
102
+ const initialStoredMarks = tr.storedMarks ?? []
103
+
104
+ tr.addMark(markStart, markEnd, mark)
105
+
106
+ if (markEnd < end) {
107
+ tr.delete(markEnd, end)
108
+ }
109
+ if (start < markStart) {
110
+ tr.delete(start, markStart)
111
+ }
112
+
113
+ // Make sure not to reactivate any marks which had previously been
114
+ // deactivated. By keeping track of the initial stored marks we are able to
115
+ // discard any unintended consequences of deleting text and adding it again.
116
+ tr.setStoredMarks(initialStoredMarks)
117
+
118
+ return tr
119
+ }, { inCodeMark })
120
+
121
+ return rule
122
+ }
123
+
124
+ /**
125
+ * Defines an input rule for automatically adding inline marks when a given
126
+ * pattern is typed.
127
+ *
128
+ * @public
129
+ */
130
+ export function defineMarkInputRule(
131
+ options: MarkInputRuleOptions,
132
+ ): PlainExtension {
133
+ return defineInputRule(createMarkInputRule(options))
134
+ }
135
+
136
+ /**
137
+ * Defines an input rule that changes the type of a textblock when the matched
138
+ * text is typed into it.
139
+ *
140
+ * See also [textblockTypeInputRule](https://prosemirror.net/docs/ref/#inputrules.textblockTypeInputRule)
141
+ *
142
+ * @param options
143
+ *
144
+ * @public
145
+ */
146
+ export function defineTextBlockInputRule({
147
+ regex,
148
+ type,
149
+ attrs,
150
+ }: {
151
+ /**
152
+ * The regular expression to match against, which should end with `$`. It
153
+ * usually also starts with `^` to that it is only matched at the start of a
154
+ * textblock.
155
+ */
156
+ regex: RegExp
157
+
158
+ /**
159
+ * The node type to replace the matched text with.
160
+ */
161
+ type: string | NodeType
162
+
163
+ /**
164
+ * Attributes to set on the node.
165
+ */
166
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)
167
+ }): PlainExtension {
168
+ return defineInputRuleFacetPayload(({ schema }): InputRule => {
169
+ const nodeType = getNodeType(schema, type)
170
+ return textblockTypeInputRule(regex, nodeType, attrs)
171
+ })
172
+ }
173
+
174
+ /**
175
+ * Defines an input rule for automatically wrapping a textblock when a given
176
+ * string is typed.
177
+ *
178
+ * See also [wrappingInputRule](https://prosemirror.net/docs/ref/#inputrules.wrappingInputRule)
179
+ *
180
+ * @param options
181
+ *
182
+ * @public
183
+ */
184
+ export function defineWrappingInputRule({
185
+ regex,
186
+ type,
187
+ attrs,
188
+ join,
189
+ }: {
190
+ /**
191
+ * The regular expression to match against, which should end with `$`. It
192
+ * usually also starts with `^` to that it is only matched at the start of a
193
+ * textblock.
194
+ */
195
+ regex: RegExp
196
+
197
+ /**
198
+ * The type of node to wrap in.
199
+ */
200
+ type: string | NodeType
201
+
202
+ /**
203
+ * Attributes to set on the node.
204
+ */
205
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)
206
+
207
+ /**
208
+ * By default, if there's a node with the same type above the newly wrapped
209
+ * node, the rule will try to
210
+ * [join](https://prosemirror.net/docs/ref/#transform.Transform.join) those
211
+ * two nodes. You can pass a join predicate, which takes a regular expression
212
+ * match and the node before the wrapped node, and can return a boolean to
213
+ * indicate whether a join should happen.
214
+ */
215
+ join?: (match: RegExpMatchArray, node: ProseMirrorNode) => boolean
216
+ }): PlainExtension {
217
+ return defineInputRuleFacetPayload(({ schema }): InputRule => {
218
+ const nodeType = getNodeType(schema, type)
219
+ return wrappingInputRule(regex, nodeType, attrs, join)
220
+ })
221
+ }
222
+
223
+ function defineInputRuleFacetPayload(input: InputRulePayload): PlainExtension {
224
+ return defineFacetPayload(inputRuleFacet, [input]) as PlainExtension
225
+ }
226
+
227
+ type InputRulePayload = (context: { schema: Schema }) => InputRule
228
+
229
+ const inputRuleFacet = defineFacet<InputRulePayload, PluginPayload>({
230
+ reducer: (inputs: InputRulePayload[]): PluginPayload => {
231
+ return (context): Plugin[] => {
232
+ const rules: InputRule[] = inputs.flatMap((callback) => callback(context))
233
+ return [inputRules({ rules })]
234
+ }
235
+ },
236
+ parent: pluginFacet,
237
+ })
@@ -0,0 +1,14 @@
1
+ export {
2
+ defineItalic,
3
+ type ItalicExtension,
4
+ } from './italic'
5
+ export {
6
+ defineItalicCommands,
7
+ type ItalicCommandsExtension,
8
+ } from './italic-commands'
9
+ export { defineItalicInputRule } from './italic-input-rule'
10
+ export { defineItalicKeymap } from './italic-keymap'
11
+ export {
12
+ defineItalicSpec,
13
+ type ItalicSpecExtension,
14
+ } from './italic-spec'
@@ -0,0 +1,75 @@
1
+ import {
2
+ createEditor,
3
+ defineBaseCommands,
4
+ union,
5
+ } from '@prosekit/core'
6
+ import {
7
+ describe,
8
+ expect,
9
+ it,
10
+ } from 'vitest'
11
+
12
+ import { defineDoc } from '../doc'
13
+ import { defineParagraph } from '../paragraph'
14
+ import { defineText } from '../text'
15
+
16
+ import { defineItalic } from './index'
17
+
18
+ describe('command', () => {
19
+ const extension = union(
20
+ defineDoc(),
21
+ defineParagraph(),
22
+ defineText(),
23
+ defineItalic(),
24
+ defineBaseCommands(),
25
+ )
26
+ const editor = createEditor({ extension })
27
+ const div = document.body.appendChild(document.createElement('div'))
28
+ editor.mount(div)
29
+
30
+ describe('toggleItalic', () => {
31
+ it('can add and remove italic', () => {
32
+ editor.commands.insertText({ text: 'Hello world' })
33
+ editor.commands.selectAll()
34
+ editor.commands.toggleItalic()
35
+ expect(editor.view.state.doc.toJSON()).toMatchInlineSnapshot(`
36
+ {
37
+ "content": [
38
+ {
39
+ "content": [
40
+ {
41
+ "marks": [
42
+ {
43
+ "type": "italic",
44
+ },
45
+ ],
46
+ "text": "Hello world",
47
+ "type": "text",
48
+ },
49
+ ],
50
+ "type": "paragraph",
51
+ },
52
+ ],
53
+ "type": "doc",
54
+ }
55
+ `)
56
+ editor.commands.toggleItalic()
57
+ expect(editor.view.state.doc.toJSON()).toMatchInlineSnapshot(`
58
+ {
59
+ "content": [
60
+ {
61
+ "content": [
62
+ {
63
+ "text": "Hello world",
64
+ "type": "text",
65
+ },
66
+ ],
67
+ "type": "paragraph",
68
+ },
69
+ ],
70
+ "type": "doc",
71
+ }
72
+ `)
73
+ })
74
+ })
75
+ })
@@ -0,0 +1,23 @@
1
+ import {
2
+ defineCommands,
3
+ toggleMark,
4
+ type Extension,
5
+ } from '@prosekit/core'
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export type ItalicCommandsExtension = Extension<{
11
+ Commands: {
12
+ toggleItalic: []
13
+ }
14
+ }>
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ export function defineItalicCommands(): ItalicCommandsExtension {
20
+ return defineCommands({
21
+ toggleItalic: () => toggleMark({ type: 'italic' }),
22
+ })
23
+ }
@@ -0,0 +1,25 @@
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('defineItalicInputRule', () => {
11
+ const { editor, n, m } = setupTest()
12
+ it('should add italic marks when typing "*"', async () => {
13
+ const doc = n.doc(n.p('<a>'))
14
+ editor.set(doc)
15
+
16
+ await inputText('*word')
17
+ expect(editor.view.state.doc.toJSON()).toEqual(
18
+ n.doc(n.p('*word')).toJSON(),
19
+ )
20
+ await inputText('*')
21
+ expect(editor.view.state.doc.toJSON()).toEqual(
22
+ n.doc(n.p(m.italic('word'))).toJSON(),
23
+ )
24
+ })
25
+ })
@@ -0,0 +1,18 @@
1
+ import {
2
+ canUseRegexLookbehind,
3
+ type PlainExtension,
4
+ } from '@prosekit/core'
5
+
6
+ import { defineMarkInputRule } from '../input-rule'
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export function defineItalicInputRule(): PlainExtension {
12
+ return defineMarkInputRule({
13
+ regex: canUseRegexLookbehind()
14
+ ? /(?<=\s|^)\*([^\s*]|[^\s*][^*]*[^\s*])\*$/
15
+ : /\*([^\s*]|[^\s*][^*]*[^\s*])\*$/,
16
+ type: 'italic',
17
+ })
18
+ }
@@ -0,0 +1,14 @@
1
+ import {
2
+ defineKeymap,
3
+ toggleMark,
4
+ type PlainExtension,
5
+ } from '@prosekit/core'
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export function defineItalicKeymap(): PlainExtension {
11
+ return defineKeymap({
12
+ 'Mod-i': toggleMark({ type: 'italic' }),
13
+ })
14
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ defineMarkSpec,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+ import type { Attrs } from '@prosekit/pm/model'
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export type ItalicSpecExtension = Extension<{
11
+ Marks: {
12
+ italic: Attrs
13
+ }
14
+ }>
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ export function defineItalicSpec(): ItalicSpecExtension {
20
+ return defineMarkSpec({
21
+ name: 'italic',
22
+ parseDOM: [
23
+ { tag: 'i' },
24
+ { tag: 'em' },
25
+ { style: 'font-style=italic' },
26
+ {
27
+ style: 'font-style=normal',
28
+ clearMark: (m) => m.type.name === 'italic',
29
+ },
30
+ ],
31
+ toDOM() {
32
+ return ['em', 0]
33
+ },
34
+ })
35
+ }
@@ -0,0 +1,34 @@
1
+ import {
2
+ union,
3
+ type Union,
4
+ } from '@prosekit/core'
5
+
6
+ import {
7
+ defineItalicCommands,
8
+ type ItalicCommandsExtension,
9
+ } from './italic-commands'
10
+ import { defineItalicInputRule } from './italic-input-rule'
11
+ import { defineItalicKeymap } from './italic-keymap'
12
+ import {
13
+ defineItalicSpec,
14
+ type ItalicSpecExtension,
15
+ } from './italic-spec'
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export type ItalicExtension = Union<
21
+ [ItalicSpecExtension, ItalicCommandsExtension]
22
+ >
23
+
24
+ /**
25
+ * @public
26
+ */
27
+ export function defineItalic(): ItalicExtension {
28
+ return union(
29
+ defineItalicSpec(),
30
+ defineItalicCommands(),
31
+ defineItalicKeymap(),
32
+ defineItalicInputRule(),
33
+ )
34
+ }
@@ -0,0 +1,88 @@
1
+ import { userEvent } from '@vitest/browser/context'
2
+ import {
3
+ describe,
4
+ expect,
5
+ it,
6
+ } from 'vitest'
7
+
8
+ import { setupTest } from '../testing'
9
+
10
+ describe('defineLinkCommands', () => {
11
+ const { editor, n, m } = setupTest()
12
+ const href = 'https://example.com'
13
+ const doc1 = n.doc(n.p('<a>foo<b> bar'))
14
+ const doc2 = n.doc(n.p(m.link({ href }, '<a>foo<b>'), ' bar'))
15
+ const doc3 = n.doc(n.p(m.link({ href }, 'f<a>oo'), ' bar'))
16
+
17
+ it('should add a link', () => {
18
+ editor.set(doc1)
19
+ editor.commands.addLink({ href })
20
+ expect(editor.view.state.doc.toJSON()).toEqual(doc2.toJSON())
21
+ })
22
+
23
+ it('should remove a link', () => {
24
+ editor.set(doc1)
25
+ editor.commands.removeLink()
26
+ expect(editor.view.state.doc.toJSON()).toEqual(doc1.toJSON())
27
+ })
28
+
29
+ it('should toggle a link', () => {
30
+ editor.set(doc1)
31
+ editor.commands.toggleLink({ href })
32
+ expect(editor.view.state.doc.toJSON()).toEqual(doc2.toJSON())
33
+ editor.commands.toggleLink({ href })
34
+ expect(editor.view.state.doc.toJSON()).toEqual(doc1.toJSON())
35
+ })
36
+
37
+ it('should expand the selection to cover the link', () => {
38
+ editor.set(doc3)
39
+ expect(editor.view.state.selection.empty).toBe(true)
40
+ editor.commands.expandLink()
41
+ expect(editor.view.state.selection.empty).toBe(false)
42
+ expect(editor.view.state.doc.toJSON()).toEqual(doc2.toJSON())
43
+ })
44
+ })
45
+
46
+ describe('defineLinkInputRule', () => {
47
+ it('should insert a link after pressing Space', async () => {
48
+ const { editor } = setupTest()
49
+ await userEvent.keyboard('https://example.com')
50
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
51
+ `"doc(paragraph("https://example.com"))"`,
52
+ )
53
+ await userEvent.keyboard(' ')
54
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
55
+ `"doc(paragraph(link("https://example.com"), " "))"`,
56
+ )
57
+ })
58
+
59
+ it('should handle a link before a period', async () => {
60
+ const { editor } = setupTest()
61
+ await userEvent.keyboard('https://example.com')
62
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
63
+ `"doc(paragraph("https://example.com"))"`,
64
+ )
65
+ await userEvent.keyboard('.')
66
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
67
+ `"doc(paragraph("https://example.com."))"`,
68
+ )
69
+ await userEvent.keyboard(' ')
70
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
71
+ `"doc(paragraph(link("https://example.com"), ". "))"`,
72
+ )
73
+ })
74
+ })
75
+
76
+ describe('defineLinkEnterRule', () => {
77
+ it('should insert a link after pressing Enter', async () => {
78
+ const { editor } = setupTest()
79
+ await userEvent.keyboard('https://example.com')
80
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
81
+ `"doc(paragraph("https://example.com"))"`,
82
+ )
83
+ await userEvent.keyboard('{Enter}')
84
+ expect(editor.view.state.doc.toString()).toMatchInlineSnapshot(
85
+ `"doc(paragraph(link("https://example.com")), paragraph)"`,
86
+ )
87
+ })
88
+ })