@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,110 @@
1
+ import {
2
+ defineCommands,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+ import {
6
+ addColumnAfter,
7
+ addColumnBefore,
8
+ addRowAfter,
9
+ addRowBefore,
10
+ deleteColumn,
11
+ deleteRow,
12
+ deleteTable,
13
+ mergeCells,
14
+ splitCell,
15
+ } from 'prosemirror-tables'
16
+
17
+ import { deleteCellSelection } from './table-commands/delete-cell-selection'
18
+ import { exitTable } from './table-commands/exit-table'
19
+ import {
20
+ insertTable,
21
+ type InsertTableOptions,
22
+ } from './table-commands/insert-table'
23
+ import {
24
+ moveTableColumn,
25
+ type MoveTableColumnOptions,
26
+ } from './table-commands/move-table-column'
27
+ import {
28
+ moveTableRow,
29
+ type MoveTableRowOptions,
30
+ } from './table-commands/move-table-row'
31
+ import {
32
+ selectTable,
33
+ type SelectTableOptions,
34
+ } from './table-commands/select-table'
35
+ import {
36
+ selectTableCell,
37
+ type SelectTableCellOptions,
38
+ } from './table-commands/select-table-cell'
39
+ import {
40
+ selectTableColumn,
41
+ type SelectTableColumnOptions,
42
+ } from './table-commands/select-table-column'
43
+ import {
44
+ selectTableRow,
45
+ type SelectTableRowOptions,
46
+ } from './table-commands/select-table-row'
47
+
48
+ /**
49
+ * @internal
50
+ */
51
+ export type TableCommandsExtension = Extension<{
52
+ Commands: {
53
+ insertTable: [options: InsertTableOptions]
54
+ exitTable: []
55
+
56
+ selectTable: [options?: SelectTableOptions]
57
+ selectTableCell: [options?: SelectTableCellOptions]
58
+ selectTableColumn: [options?: SelectTableColumnOptions]
59
+ selectTableRow: [options?: SelectTableRowOptions]
60
+
61
+ addTableColumnBefore: []
62
+ addTableColumnAfter: []
63
+ addTableRowAbove: []
64
+ addTableRowBelow: []
65
+
66
+ deleteTable: []
67
+ deleteTableColumn: []
68
+ deleteTableRow: []
69
+ deleteCellSelection: []
70
+
71
+ mergeTableCells: []
72
+ splitTableCell: []
73
+
74
+ moveTableRow: [options: MoveTableRowOptions]
75
+ moveTableColumn: [options: MoveTableColumnOptions]
76
+ }
77
+ }>
78
+
79
+ /**
80
+ * Adds commands for working with `table` nodes.
81
+ *
82
+ * @public
83
+ */
84
+ export function defineTableCommands(): TableCommandsExtension {
85
+ return defineCommands({
86
+ insertTable,
87
+ exitTable: () => exitTable,
88
+
89
+ selectTable,
90
+ selectTableCell,
91
+ selectTableColumn,
92
+ selectTableRow,
93
+
94
+ addTableColumnBefore: () => addColumnBefore,
95
+ addTableColumnAfter: () => addColumnAfter,
96
+ addTableRowAbove: () => addRowBefore,
97
+ addTableRowBelow: () => addRowAfter,
98
+
99
+ deleteTable: () => deleteTable,
100
+ deleteTableColumn: () => deleteColumn,
101
+ deleteTableRow: () => deleteRow,
102
+ deleteCellSelection: () => deleteCellSelection,
103
+
104
+ mergeTableCells: () => mergeCells,
105
+ splitTableCell: () => splitCell,
106
+
107
+ moveTableRow,
108
+ moveTableColumn,
109
+ })
110
+ }
@@ -0,0 +1,40 @@
1
+ import type { PlainExtension } from '@prosekit/core'
2
+
3
+ import type { DragEventHandler } from '../drop-indicator'
4
+ import { defineDropIndicator } from '../drop-indicator'
5
+
6
+ /**
7
+ * Hides the drop indicator when dragging a table column or row by using the
8
+ * table handle.
9
+ *
10
+ * @internal
11
+ */
12
+ export function defineTableDropIndicator(): PlainExtension {
13
+ return defineDropIndicator({
14
+ onDrag,
15
+ })
16
+ }
17
+
18
+ const matchMap = new WeakMap<DataTransfer, boolean>()
19
+
20
+ const onDrag: DragEventHandler = ({ event }): boolean => {
21
+ const dataTransfer = event.dataTransfer
22
+ if (!dataTransfer) return true
23
+
24
+ let match: boolean
25
+
26
+ if (matchMap.has(dataTransfer)) {
27
+ match = matchMap.get(dataTransfer)!
28
+ } else {
29
+ // On Safari, accessing `dataTransfer.types` is more than 10x slower than in
30
+ // Chrome. This becomes a bottleneck when `onDrag` is called frequently, so
31
+ // we cache the result in a WeakMap.
32
+ const types = dataTransfer.types
33
+ match = types.includes('application/x-prosekit-table-handle-drag')
34
+ matchMap.set(dataTransfer, match)
35
+ }
36
+
37
+ // Don't show the drop indicator when the drag event has
38
+ // "application/x-prosekit-table-handle-drag" type.
39
+ return !match
40
+ }
@@ -0,0 +1,15 @@
1
+ import {
2
+ definePlugin,
3
+ type PlainExtension,
4
+ } from '@prosekit/core'
5
+ import {
6
+ columnResizing,
7
+ tableEditing,
8
+ } from 'prosemirror-tables'
9
+
10
+ /**
11
+ * @public
12
+ */
13
+ export function defineTablePlugins(): PlainExtension {
14
+ return definePlugin([tableEditing(), columnResizing()])
15
+ }
@@ -0,0 +1,113 @@
1
+ import { union } from '@prosekit/core'
2
+ import pick from 'just-pick'
3
+ import {
4
+ describe,
5
+ expect,
6
+ it,
7
+ } from 'vitest'
8
+
9
+ import { defineDoc } from '../doc'
10
+ import { defineParagraph } from '../paragraph'
11
+ import { defineText } from '../text'
12
+
13
+ import {
14
+ defineTableCellSpec,
15
+ defineTableHeaderCellSpec,
16
+ defineTableRowSpec,
17
+ defineTableSpec,
18
+ } from './table-spec'
19
+
20
+ describe('table spec', () => {
21
+ it('should be defined', () => {
22
+ const extension = union(
23
+ defineDoc(),
24
+ defineParagraph(),
25
+ defineText(),
26
+ defineTableSpec(),
27
+ defineTableRowSpec(),
28
+ defineTableCellSpec(),
29
+ defineTableHeaderCellSpec(),
30
+ )
31
+
32
+ const nodes = extension.schema?.spec.nodes.toObject() || {}
33
+ const pickedNodes = pick(nodes, [
34
+ 'table',
35
+ 'tableCell',
36
+ 'tableHeaderCell',
37
+ 'tableRow',
38
+ ])
39
+
40
+ expect(pickedNodes).toMatchInlineSnapshot(`
41
+ {
42
+ "table": {
43
+ "content": "tableRow+",
44
+ "group": "block",
45
+ "isolating": true,
46
+ "parseDOM": [
47
+ {
48
+ "tag": "table",
49
+ },
50
+ ],
51
+ "tableRole": "table",
52
+ "toDOM": [Function],
53
+ },
54
+ "tableCell": {
55
+ "attrs": {
56
+ "colspan": {
57
+ "default": 1,
58
+ },
59
+ "colwidth": {
60
+ "default": null,
61
+ },
62
+ "rowspan": {
63
+ "default": 1,
64
+ },
65
+ },
66
+ "content": "block+",
67
+ "isolating": true,
68
+ "parseDOM": [
69
+ {
70
+ "getAttrs": [Function],
71
+ "tag": "td",
72
+ },
73
+ ],
74
+ "tableRole": "cell",
75
+ "toDOM": [Function],
76
+ },
77
+ "tableHeaderCell": {
78
+ "attrs": {
79
+ "colspan": {
80
+ "default": 1,
81
+ },
82
+ "colwidth": {
83
+ "default": null,
84
+ },
85
+ "rowspan": {
86
+ "default": 1,
87
+ },
88
+ },
89
+ "content": "block+",
90
+ "isolating": true,
91
+ "parseDOM": [
92
+ {
93
+ "getAttrs": [Function],
94
+ "tag": "th",
95
+ },
96
+ ],
97
+ "tableRole": "header_cell",
98
+ "toDOM": [Function],
99
+ },
100
+ "tableRow": {
101
+ "content": "(tableCell | tableHeaderCell)*",
102
+ "parseDOM": [
103
+ {
104
+ "tag": "tr",
105
+ },
106
+ ],
107
+ "tableRole": "row",
108
+ "toDOM": [Function],
109
+ },
110
+ }
111
+ `)
112
+ })
113
+ })
@@ -0,0 +1,109 @@
1
+ import {
2
+ defineNodeSpec,
3
+ type Extension,
4
+ } from '@prosekit/core'
5
+ import type {
6
+ AttributeSpec,
7
+ Attrs,
8
+ } from '@prosekit/pm/model'
9
+ import { tableNodes } from 'prosemirror-tables'
10
+
11
+ const cellContent = 'block+'
12
+
13
+ /**
14
+ * @public
15
+ */
16
+ export interface CellAttrs {
17
+ colspan?: number
18
+ rowspan?: number
19
+ colwidth?: number[] | null
20
+ }
21
+
22
+ const cellAttrs = {
23
+ colspan: { default: 1 },
24
+ rowspan: { default: 1 },
25
+ colwidth: { default: null },
26
+ } satisfies Record<string, AttributeSpec>
27
+
28
+ /**
29
+ * @internal
30
+ */
31
+ export type TableSpecExtension = Extension<{
32
+ Nodes: {
33
+ table: Attrs
34
+ }
35
+ }>
36
+
37
+ const specs = tableNodes({
38
+ tableGroup: 'block',
39
+ cellContent,
40
+ cellAttributes: {},
41
+ })
42
+
43
+ /**
44
+ * @internal
45
+ */
46
+ export function defineTableSpec(): TableSpecExtension {
47
+ return defineNodeSpec({
48
+ ...specs['table'],
49
+ content: 'tableRow+',
50
+ name: 'table',
51
+ })
52
+ }
53
+
54
+ /**
55
+ * @internal
56
+ */
57
+ export type TableRowSpecExtension = Extension<{
58
+ Nodes: {
59
+ tableRow: Attrs
60
+ }
61
+ }>
62
+
63
+ /**
64
+ * @internal
65
+ */
66
+ export function defineTableRowSpec(): TableRowSpecExtension {
67
+ return defineNodeSpec({
68
+ ...specs['table_row'],
69
+ content: '(tableCell | tableHeaderCell)*',
70
+ name: 'tableRow',
71
+ })
72
+ }
73
+
74
+ /**
75
+ * @internal
76
+ */
77
+ export type TableCellSpecExtension = Extension<{
78
+ Nodes: {
79
+ tableCell: CellAttrs
80
+ }
81
+ }>
82
+
83
+ /**
84
+ * @internal
85
+ */
86
+ export function defineTableCellSpec(): TableCellSpecExtension {
87
+ return defineNodeSpec({
88
+ ...specs['table_cell'],
89
+ name: 'tableCell',
90
+ attrs: cellAttrs,
91
+ })
92
+ }
93
+
94
+ /**
95
+ * @internal
96
+ */
97
+ export type TableHeaderCellSpecExtension = Extension<{
98
+ Nodes: {
99
+ tableHeaderCell: CellAttrs
100
+ }
101
+ }>
102
+
103
+ export function defineTableHeaderCellSpec(): TableHeaderCellSpecExtension {
104
+ return defineNodeSpec({
105
+ ...specs['table_header'],
106
+ name: 'tableHeaderCell',
107
+ attrs: cellAttrs,
108
+ })
109
+ }
@@ -0,0 +1,16 @@
1
+ import { CellSelection } from 'prosemirror-tables'
2
+
3
+ export {
4
+ findCellPos,
5
+ findCellRange,
6
+ findTable,
7
+ } from 'prosemirror-tables'
8
+
9
+ /**
10
+ * Checks if the given object is a `CellSelection` instance.
11
+ *
12
+ * @public
13
+ */
14
+ export function isCellSelection(value: unknown): value is CellSelection {
15
+ return value instanceof CellSelection
16
+ }
@@ -0,0 +1,49 @@
1
+ import {
2
+ union,
3
+ type Union,
4
+ } from '@prosekit/core'
5
+
6
+ import {
7
+ defineTableCommands,
8
+ type TableCommandsExtension,
9
+ } from './table-commands'
10
+ import { defineTableDropIndicator } from './table-drop-indicator'
11
+ import { defineTablePlugins } from './table-plugins'
12
+ import {
13
+ defineTableCellSpec,
14
+ defineTableHeaderCellSpec,
15
+ defineTableRowSpec,
16
+ defineTableSpec,
17
+ type TableCellSpecExtension,
18
+ type TableHeaderCellSpecExtension,
19
+ type TableRowSpecExtension,
20
+ type TableSpecExtension,
21
+ } from './table-spec'
22
+
23
+ /**
24
+ * @internal
25
+ */
26
+ export type TableExtension = Union<
27
+ [
28
+ TableSpecExtension,
29
+ TableRowSpecExtension,
30
+ TableCellSpecExtension,
31
+ TableHeaderCellSpecExtension,
32
+ TableCommandsExtension,
33
+ ]
34
+ >
35
+
36
+ /**
37
+ * @public
38
+ */
39
+ export function defineTable(): TableExtension {
40
+ return union(
41
+ defineTableSpec(),
42
+ defineTableRowSpec(),
43
+ defineTableCellSpec(),
44
+ defineTableHeaderCellSpec(),
45
+ defineTablePlugins(),
46
+ defineTableCommands(),
47
+ defineTableDropIndicator(),
48
+ )
49
+ }
@@ -0,0 +1,28 @@
1
+ import type {
2
+ Command,
3
+ Selection,
4
+ } from '@prosekit/pm/state'
5
+ import { CellSelection } from 'prosemirror-tables'
6
+
7
+ import { isCellSelection } from './table-utils'
8
+
9
+ // Helper to create a cell selection between two positions
10
+ export function setCellSelection(from: number, to: number): Command {
11
+ const command: Command = (state, dispatch) => {
12
+ const selection = CellSelection.create(state.doc, from, to)
13
+ dispatch?.(state.tr.setSelection(selection))
14
+ return true
15
+ }
16
+ return command
17
+ }
18
+
19
+ export function inspectSelectedCells(selection: Selection): string[] {
20
+ if (isCellSelection(selection)) {
21
+ const cells: string[] = []
22
+ selection.forEachCell((node) => {
23
+ cells.push(node.textContent)
24
+ })
25
+ return cells
26
+ }
27
+ return []
28
+ }
@@ -0,0 +1,58 @@
1
+ import type { EditorView } from '@prosekit/pm/view'
2
+
3
+ import { formatHTML } from './format-html'
4
+
5
+ async function readBlobFromClipboard(mimeType: string): Promise<Blob | undefined> {
6
+ const clipboardItems = await navigator.clipboard.read()
7
+ const clipboardItem = clipboardItems[0]
8
+ if (!clipboardItem) {
9
+ return undefined
10
+ }
11
+ if (!clipboardItem.types.includes(mimeType)) {
12
+ return undefined
13
+ }
14
+ return await clipboardItem.getType(mimeType)
15
+ }
16
+
17
+ async function readTextFromClipboard(mimeType: string): Promise<string | undefined> {
18
+ const blob = await readBlobFromClipboard(mimeType)
19
+ if (!blob) {
20
+ return undefined
21
+ }
22
+ return await blob.text()
23
+ }
24
+
25
+ export async function readPlainTextFromClipboard(): Promise<string> {
26
+ return await readTextFromClipboard('text/plain') || ''
27
+ }
28
+
29
+ export async function readHtmlTextFromClipboard(format = true): Promise<string> {
30
+ let html = await readTextFromClipboard('text/html') || ''
31
+ if (format) {
32
+ html = formatHTML(html)
33
+ }
34
+ return html
35
+ }
36
+
37
+ export function pasteFiles(view: EditorView, files: File[]) {
38
+ const clipboardData = new DataTransfer()
39
+ for (const file of files) {
40
+ clipboardData.items.add(file)
41
+ }
42
+ const event = new ClipboardEvent('paste', { clipboardData })
43
+ view.pasteHTML('<div></div>', event)
44
+ }
45
+
46
+ export function pasteText(view: EditorView, text: string) {
47
+ const clipboardData = new DataTransfer()
48
+ clipboardData.setData('text/plain', text)
49
+ const event = new ClipboardEvent('paste', { clipboardData })
50
+ view.pasteText(text, event)
51
+ }
52
+
53
+ export function pasteHTML(view: EditorView, html: string) {
54
+ const clipboardData = new DataTransfer()
55
+ clipboardData.setData('text/html', html)
56
+ const event = new ClipboardEvent('paste', { clipboardData })
57
+ view.pasteHTML(html, event)
58
+ }
@@ -0,0 +1,5 @@
1
+ import diffableHtml from 'diffable-html'
2
+
3
+ export function formatHTML(html: string): string {
4
+ return diffableHtml(html)
5
+ }
@@ -0,0 +1,161 @@
1
+ import '@prosekit/pm/view/style/prosemirror.css'
2
+
3
+ import {
4
+ defineBaseCommands,
5
+ defineBaseKeymap,
6
+ defineHistory,
7
+ union,
8
+ type Extension,
9
+ type ExtractMarkActions,
10
+ type ExtractNodeActions,
11
+ type NodeChild,
12
+ } from '@prosekit/core'
13
+ import {
14
+ createTestEditor,
15
+ type TestEditor,
16
+ } from '@prosekit/core/test'
17
+
18
+ import { defineBlockquote } from '../blockquote'
19
+ import { defineBold } from '../bold'
20
+ import { defineCode } from '../code'
21
+ import { defineCodeBlock } from '../code-block'
22
+ import { defineDoc } from '../doc'
23
+ import { defineHardBreak } from '../hard-break'
24
+ import { defineHeading } from '../heading'
25
+ import { defineHorizontalRule } from '../horizontal-rule'
26
+ import { defineImage } from '../image'
27
+ import { defineItalic } from '../italic'
28
+ import { defineLink } from '../link'
29
+ import {
30
+ defineList,
31
+ type ListAttrs,
32
+ } from '../list'
33
+ import { defineParagraph } from '../paragraph'
34
+ import { defineStrike } from '../strike'
35
+ import { defineTable } from '../table'
36
+ import type { CellAttrs } from '../table/table-spec'
37
+ import { defineText } from '../text'
38
+ import { defineUnderline } from '../underline'
39
+
40
+ import {
41
+ readHtmlTextFromClipboard,
42
+ readPlainTextFromClipboard,
43
+ } from './clipboard'
44
+ import { pressKey } from './keyboard'
45
+
46
+ /**
47
+ * @internal
48
+ */
49
+ export function defineTestExtension() {
50
+ return union(
51
+ defineDoc(),
52
+ defineText(),
53
+ defineHeading(),
54
+ defineHistory(),
55
+ defineList(),
56
+ defineBlockquote(),
57
+ defineBaseKeymap(),
58
+ defineBaseCommands(),
59
+ defineItalic(),
60
+ defineBold(),
61
+ defineUnderline(),
62
+ defineStrike(),
63
+ defineCode(),
64
+ defineLink(),
65
+ defineImage(),
66
+ defineParagraph(),
67
+ defineTable(),
68
+ defineHorizontalRule(),
69
+ defineHardBreak(),
70
+ defineCodeBlock(),
71
+ )
72
+ }
73
+
74
+ /**
75
+ * @internal
76
+ */
77
+ export function setupTestFromExtension<E extends Extension>(
78
+ extension: E,
79
+ ): {
80
+ editor: TestEditor<E>
81
+ n: ExtractNodeActions<E>
82
+ m: ExtractMarkActions<E>
83
+ } {
84
+ const editor = createTestEditor({ extension })
85
+
86
+ const div = document.body.appendChild(document.createElement('div'))
87
+ div.style.minWidth = '200px'
88
+ div.style.minHeight = '200px'
89
+ editor.mount(div)
90
+ editor.view.dom.focus()
91
+
92
+ const n = editor.nodes
93
+ const m = editor.marks
94
+ return { editor, n, m }
95
+ }
96
+
97
+ /**
98
+ * @internal
99
+ */
100
+ export function setupTest() {
101
+ const { editor, m, n } = setupTestFromExtension(defineTestExtension())
102
+
103
+ const listWithAttrs = (attrs: ListAttrs) => {
104
+ return (...children: NodeChild[]) => {
105
+ return n.list(attrs, ...children)
106
+ }
107
+ }
108
+
109
+ const headingWithAttrs = (attrs: { level: number }) => {
110
+ return (...children: NodeChild[]) => {
111
+ return n.heading(attrs, ...children)
112
+ }
113
+ }
114
+
115
+ const p = n.paragraph
116
+
117
+ const td = (text?: string, attrs?: CellAttrs) => {
118
+ return n.tableCell({ ...attrs }, text ? p(text) : p())
119
+ }
120
+
121
+ const th = (text?: string, attrs?: CellAttrs) => {
122
+ return n.tableHeaderCell({ ...attrs }, text ? p(text) : p())
123
+ }
124
+
125
+ const copy = async () => {
126
+ editor.view.dom.focus()
127
+ await pressKey('mod-C')
128
+ const html = await readHtmlTextFromClipboard()
129
+ const plain = await readPlainTextFromClipboard()
130
+ return { html, plain }
131
+ }
132
+
133
+ return {
134
+ editor,
135
+ m,
136
+ n: {
137
+ ...n,
138
+
139
+ p,
140
+
141
+ td,
142
+ th,
143
+ tr: n.tableRow,
144
+
145
+ h1: headingWithAttrs({ level: 1 }),
146
+ h2: headingWithAttrs({ level: 2 }),
147
+ h3: headingWithAttrs({ level: 3 }),
148
+ h4: headingWithAttrs({ level: 4 }),
149
+ h5: headingWithAttrs({ level: 5 }),
150
+ h6: headingWithAttrs({ level: 6 }),
151
+
152
+ bullet: listWithAttrs({ kind: 'bullet' }),
153
+ ordered: listWithAttrs({ kind: 'ordered' }),
154
+ checked: listWithAttrs({ kind: 'task', checked: true }),
155
+ unchecked: listWithAttrs({ kind: 'task', checked: false }),
156
+ collapsed: listWithAttrs({ kind: 'toggle', collapsed: true }),
157
+ expanded: listWithAttrs({ kind: 'toggle', collapsed: false }),
158
+ },
159
+ copy,
160
+ }
161
+ }