@prosekit/extensions 0.13.0 → 0.14.1

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 (321) hide show
  1. package/dist/{drop-indicator-B1QHFb5m.js → drop-indicator-DJq8pF92.js} +11 -10
  2. package/dist/drop-indicator-DJq8pF92.js.map +1 -0
  3. package/dist/{file-DrfcSid-.js → file-upload-I9m1EJAM.js} +3 -3
  4. package/dist/file-upload-I9m1EJAM.js.map +1 -0
  5. package/dist/{index-oIc1a2f2.d.ts → file-upload-dr3IXUty.d.ts} +1 -1
  6. package/dist/file-upload-dr3IXUty.d.ts.map +1 -0
  7. package/dist/{paste-rule-pVb4sqvJ.js → mark-paste-rule-n_2Ehmb5.js} +7 -7
  8. package/dist/mark-paste-rule-n_2Ehmb5.js.map +1 -0
  9. package/dist/{mark-rule-BcLB4Uv2.js → mark-rule-CUnXwBuy.js} +6 -6
  10. package/dist/mark-rule-CUnXwBuy.js.map +1 -0
  11. package/dist/prosekit-extensions-autocomplete.d.ts.map +1 -1
  12. package/dist/prosekit-extensions-autocomplete.js.map +1 -1
  13. package/dist/prosekit-extensions-background-color.d.ts +62 -0
  14. package/dist/prosekit-extensions-background-color.d.ts.map +1 -0
  15. package/dist/prosekit-extensions-background-color.js +76 -0
  16. package/dist/prosekit-extensions-background-color.js.map +1 -0
  17. package/dist/prosekit-extensions-blockquote.d.ts.map +1 -1
  18. package/dist/prosekit-extensions-blockquote.js +1 -1
  19. package/dist/prosekit-extensions-blockquote.js.map +1 -1
  20. package/dist/prosekit-extensions-bold.d.ts.map +1 -1
  21. package/dist/prosekit-extensions-bold.js +1 -1
  22. package/dist/prosekit-extensions-bold.js.map +1 -1
  23. package/dist/prosekit-extensions-code-block.d.ts +1 -1
  24. package/dist/prosekit-extensions-code-block.d.ts.map +1 -1
  25. package/dist/prosekit-extensions-code-block.js +4 -4
  26. package/dist/prosekit-extensions-code-block.js.map +1 -1
  27. package/dist/prosekit-extensions-code.d.ts.map +1 -1
  28. package/dist/prosekit-extensions-code.js +1 -1
  29. package/dist/prosekit-extensions-code.js.map +1 -1
  30. package/dist/prosekit-extensions-commit.d.ts +0 -1
  31. package/dist/prosekit-extensions-commit.d.ts.map +1 -1
  32. package/dist/prosekit-extensions-commit.js.map +1 -1
  33. package/dist/prosekit-extensions-doc.d.ts +0 -1
  34. package/dist/prosekit-extensions-doc.d.ts.map +1 -1
  35. package/dist/prosekit-extensions-doc.js.map +1 -1
  36. package/dist/prosekit-extensions-drop-cursor.d.ts.map +1 -1
  37. package/dist/prosekit-extensions-drop-cursor.js.map +1 -1
  38. package/dist/prosekit-extensions-drop-indicator.d.ts +0 -1
  39. package/dist/prosekit-extensions-drop-indicator.d.ts.map +1 -1
  40. package/dist/prosekit-extensions-drop-indicator.js +1 -1
  41. package/dist/prosekit-extensions-enter-rule.d.ts +6 -79
  42. package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -1
  43. package/dist/prosekit-extensions-enter-rule.js +37 -2
  44. package/dist/prosekit-extensions-enter-rule.js.map +1 -0
  45. package/dist/prosekit-extensions-file.d.ts +2 -2
  46. package/dist/prosekit-extensions-file.js +1 -1
  47. package/dist/prosekit-extensions-gap-cursor.d.ts +0 -1
  48. package/dist/prosekit-extensions-gap-cursor.d.ts.map +1 -1
  49. package/dist/prosekit-extensions-gap-cursor.js.map +1 -1
  50. package/dist/prosekit-extensions-hard-break.d.ts.map +1 -1
  51. package/dist/prosekit-extensions-hard-break.js.map +1 -1
  52. package/dist/prosekit-extensions-heading.d.ts.map +1 -1
  53. package/dist/prosekit-extensions-heading.js +1 -1
  54. package/dist/prosekit-extensions-heading.js.map +1 -1
  55. package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -1
  56. package/dist/prosekit-extensions-horizontal-rule.js +1 -1
  57. package/dist/prosekit-extensions-horizontal-rule.js.map +1 -1
  58. package/dist/prosekit-extensions-image.d.ts +10 -2
  59. package/dist/prosekit-extensions-image.d.ts.map +1 -1
  60. package/dist/prosekit-extensions-image.js +17 -4
  61. package/dist/prosekit-extensions-image.js.map +1 -1
  62. package/dist/prosekit-extensions-input-rule.d.ts +0 -1
  63. package/dist/prosekit-extensions-input-rule.d.ts.map +1 -1
  64. package/dist/prosekit-extensions-input-rule.js +89 -2
  65. package/dist/prosekit-extensions-input-rule.js.map +1 -0
  66. package/dist/prosekit-extensions-italic.d.ts.map +1 -1
  67. package/dist/prosekit-extensions-italic.js +1 -1
  68. package/dist/prosekit-extensions-italic.js.map +1 -1
  69. package/dist/prosekit-extensions-link.d.ts +0 -1
  70. package/dist/prosekit-extensions-link.d.ts.map +1 -1
  71. package/dist/prosekit-extensions-link.js +4 -4
  72. package/dist/prosekit-extensions-link.js.map +1 -1
  73. package/dist/prosekit-extensions-list.d.ts +0 -1
  74. package/dist/prosekit-extensions-list.d.ts.map +1 -1
  75. package/dist/prosekit-extensions-list.js +3 -3
  76. package/dist/prosekit-extensions-list.js.map +1 -1
  77. package/dist/prosekit-extensions-loro.d.ts.map +1 -1
  78. package/dist/prosekit-extensions-loro.js +2 -2
  79. package/dist/prosekit-extensions-loro.js.map +1 -1
  80. package/dist/prosekit-extensions-mark-rule.d.ts +0 -1
  81. package/dist/prosekit-extensions-mark-rule.d.ts.map +1 -1
  82. package/dist/prosekit-extensions-mark-rule.js +1 -1
  83. package/dist/prosekit-extensions-math.d.ts +154 -0
  84. package/dist/prosekit-extensions-math.d.ts.map +1 -0
  85. package/dist/prosekit-extensions-math.js +104 -0
  86. package/dist/prosekit-extensions-math.js.map +1 -0
  87. package/dist/prosekit-extensions-mention.d.ts.map +1 -1
  88. package/dist/prosekit-extensions-mention.js.map +1 -1
  89. package/dist/prosekit-extensions-mod-click-prevention.d.ts +0 -1
  90. package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +1 -1
  91. package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -1
  92. package/dist/prosekit-extensions-paragraph.d.ts.map +1 -1
  93. package/dist/prosekit-extensions-paragraph.js.map +1 -1
  94. package/dist/prosekit-extensions-paste-rule.d.ts +0 -1
  95. package/dist/prosekit-extensions-paste-rule.d.ts.map +1 -1
  96. package/dist/prosekit-extensions-paste-rule.js +1 -1
  97. package/dist/prosekit-extensions-placeholder.d.ts.map +1 -1
  98. package/dist/prosekit-extensions-placeholder.js +1 -1
  99. package/dist/prosekit-extensions-placeholder.js.map +1 -1
  100. package/dist/prosekit-extensions-readonly.d.ts +0 -1
  101. package/dist/prosekit-extensions-readonly.d.ts.map +1 -1
  102. package/dist/prosekit-extensions-readonly.js.map +1 -1
  103. package/dist/prosekit-extensions-search.d.ts +0 -1
  104. package/dist/prosekit-extensions-search.d.ts.map +1 -1
  105. package/dist/prosekit-extensions-search.js.map +1 -1
  106. package/dist/prosekit-extensions-strike.d.ts +0 -1
  107. package/dist/prosekit-extensions-strike.d.ts.map +1 -1
  108. package/dist/prosekit-extensions-strike.js +1 -1
  109. package/dist/prosekit-extensions-table.d.ts.map +1 -1
  110. package/dist/prosekit-extensions-table.js +1 -1
  111. package/dist/prosekit-extensions-text-align.d.ts +0 -1
  112. package/dist/prosekit-extensions-text-align.d.ts.map +1 -1
  113. package/dist/prosekit-extensions-text-align.js +2 -2
  114. package/dist/prosekit-extensions-text-align.js.map +1 -1
  115. package/dist/prosekit-extensions-text-color.d.ts +62 -0
  116. package/dist/prosekit-extensions-text-color.d.ts.map +1 -0
  117. package/dist/prosekit-extensions-text-color.js +76 -0
  118. package/dist/prosekit-extensions-text-color.js.map +1 -0
  119. package/dist/prosekit-extensions-text.d.ts +0 -1
  120. package/dist/prosekit-extensions-text.d.ts.map +1 -1
  121. package/dist/prosekit-extensions-text.js.map +1 -1
  122. package/dist/prosekit-extensions-underline.d.ts +0 -1
  123. package/dist/prosekit-extensions-underline.d.ts.map +1 -1
  124. package/dist/prosekit-extensions-virtual-selection.d.ts +0 -1
  125. package/dist/prosekit-extensions-virtual-selection.d.ts.map +1 -1
  126. package/dist/prosekit-extensions-virtual-selection.js.map +1 -1
  127. package/dist/prosekit-extensions-yjs.d.ts +9 -2
  128. package/dist/prosekit-extensions-yjs.d.ts.map +1 -1
  129. package/dist/prosekit-extensions-yjs.js.map +1 -1
  130. package/dist/shiki-highlighter-chunk.d.ts +19 -2
  131. package/dist/shiki-highlighter-chunk.d.ts.map +1 -0
  132. package/dist/shiki-highlighter-chunk.js.map +1 -1
  133. package/dist/{table-BRDh_9mG.js → table-UJVYsrB7.js} +2 -2
  134. package/dist/table-UJVYsrB7.js.map +1 -0
  135. package/package.json +42 -17
  136. package/src/autocomplete/autocomplete-helpers.ts +1 -5
  137. package/src/autocomplete/autocomplete-plugin.ts +3 -13
  138. package/src/autocomplete/autocomplete.spec.ts +4 -19
  139. package/src/autocomplete/autocomplete.ts +1 -7
  140. package/src/background-color/background-color-commands.spec.ts +71 -0
  141. package/src/background-color/background-color-commands.ts +35 -0
  142. package/src/background-color/background-color-spec.spec.ts +286 -0
  143. package/src/background-color/background-color-spec.ts +58 -0
  144. package/src/background-color/background-color.ts +21 -0
  145. package/src/background-color/index.ts +8 -0
  146. package/src/blockquote/blockquote-commands.ts +1 -7
  147. package/src/blockquote/blockquote-keymap.spec.ts +1 -5
  148. package/src/blockquote/blockquote-keymap.ts +1 -6
  149. package/src/blockquote/blockquote-spec.ts +1 -4
  150. package/src/blockquote/blockquote.ts +3 -12
  151. package/src/blockquote/index.ts +3 -12
  152. package/src/bold/bold-commands.ts +1 -5
  153. package/src/bold/bold-input-rule.spec.ts +1 -5
  154. package/src/bold/bold-input-rule.ts +1 -4
  155. package/src/bold/bold-keymap.ts +1 -5
  156. package/src/bold/bold-spec.ts +1 -4
  157. package/src/bold/bold.ts +3 -12
  158. package/src/bold/index.ts +3 -12
  159. package/src/code/code-commands.ts +1 -5
  160. package/src/code/code-input-rule.ts +1 -4
  161. package/src/code/code-keymap.ts +1 -5
  162. package/src/code/code-spec.ts +1 -4
  163. package/src/code/code.ts +3 -12
  164. package/src/code/index.ts +3 -12
  165. package/src/code-block/code-block-commands.ts +1 -8
  166. package/src/code-block/code-block-highlight.ts +2 -8
  167. package/src/code-block/code-block-keymap.ts +2 -9
  168. package/src/code-block/code-block-shiki.ts +1 -4
  169. package/src/code-block/code-block-spec.spec.ts +4 -11
  170. package/src/code-block/code-block-spec.ts +1 -4
  171. package/src/code-block/code-block.ts +4 -16
  172. package/src/code-block/index.ts +5 -21
  173. package/src/code-block/shiki-highlighter-chunk.ts +1 -7
  174. package/src/code-block/shiki-highlighter.ts +1 -4
  175. package/src/code-block/shiki-parser.ts +1 -4
  176. package/src/commit/index.ts +6 -35
  177. package/src/doc/index.ts +1 -4
  178. package/src/drop-cursor/drop-cursor.ts +1 -4
  179. package/src/drop-cursor/index.ts +1 -5
  180. package/src/drop-indicator/drop-indicator-facet.ts +12 -21
  181. package/src/drop-indicator/index.ts +1 -5
  182. package/src/enter-rule/index.ts +18 -200
  183. package/src/file/file-paste-handler.spec.ts +3 -16
  184. package/src/file/index.ts +3 -16
  185. package/src/gap-cursor/gap-cursor.ts +1 -4
  186. package/src/gap-cursor/index.ts +1 -4
  187. package/src/hard-break/hard-break-commands.ts +1 -5
  188. package/src/hard-break/hard-break-keymap.spec.ts +1 -5
  189. package/src/hard-break/hard-break-keymap.ts +1 -4
  190. package/src/hard-break/hard-break-spec.ts +1 -4
  191. package/src/hard-break/hard-break.ts +3 -12
  192. package/src/hard-break/index.ts +3 -12
  193. package/src/heading/heading-commands.ts +1 -7
  194. package/src/heading/heading-keymap.spec.ts +1 -5
  195. package/src/heading/heading-keymap.ts +1 -8
  196. package/src/heading/heading-spec.ts +1 -4
  197. package/src/heading/heading.ts +3 -12
  198. package/src/heading/index.ts +3 -12
  199. package/src/horizontal-rule/horizontal-rule-commands.spec.ts +1 -5
  200. package/src/horizontal-rule/horizontal-rule-commands.ts +2 -9
  201. package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +5 -9
  202. package/src/horizontal-rule/horizontal-rule-input-rule.ts +1 -5
  203. package/src/horizontal-rule/horizontal-rule-spec.ts +1 -4
  204. package/src/horizontal-rule/horizontal-rule.ts +3 -12
  205. package/src/horizontal-rule/index.ts +3 -13
  206. package/src/image/image-commands/upload-image.spec.ts +245 -0
  207. package/src/image/image-commands/upload-image.ts +46 -11
  208. package/src/image/image-commands.ts +2 -8
  209. package/src/image/image-spec.ts +1 -4
  210. package/src/image/image-upload-handler.ts +2 -8
  211. package/src/image/image.ts +3 -12
  212. package/src/image/index.ts +3 -13
  213. package/src/input-rule/index.ts +2 -13
  214. package/src/italic/index.ts +3 -12
  215. package/src/italic/italic-commands.spec.ts +2 -10
  216. package/src/italic/italic-commands.ts +1 -5
  217. package/src/italic/italic-input-rule.spec.ts +1 -5
  218. package/src/italic/italic-input-rule.ts +1 -4
  219. package/src/italic/italic-keymap.ts +1 -5
  220. package/src/italic/italic-spec.ts +1 -4
  221. package/src/italic/italic.ts +3 -12
  222. package/src/link/index.spec.ts +1 -5
  223. package/src/link/index.ts +1 -5
  224. package/src/link/link-paste-rule.spec.ts +2 -9
  225. package/src/link/link-regex.spec.ts +1 -5
  226. package/src/list/index.ts +3 -12
  227. package/src/list/list-commands.ts +1 -5
  228. package/src/list/list-input-rules.ts +1 -4
  229. package/src/list/list-keymap.spec.ts +1 -5
  230. package/src/list/list-keymap.ts +2 -8
  231. package/src/list/list-plugins.ts +1 -4
  232. package/src/list/list-serializer.ts +2 -9
  233. package/src/list/list-spec.ts +3 -13
  234. package/src/list/list.spec.ts +10 -21
  235. package/src/list/list.ts +3 -12
  236. package/src/loro/index.ts +3 -13
  237. package/src/loro/loro-commands.ts +2 -8
  238. package/src/loro/loro-cursor-plugin.ts +3 -13
  239. package/src/loro/loro-keymap.ts +2 -10
  240. package/src/loro/loro-sync-plugin.ts +2 -8
  241. package/src/loro/loro-undo-plugin.ts +2 -8
  242. package/src/loro/loro.ts +2 -11
  243. package/src/mark-rule/apply.ts +3 -13
  244. package/src/mark-rule/mark-rule.spec.ts +2 -13
  245. package/src/mark-rule/mark-rule.ts +2 -13
  246. package/src/mark-rule/range.ts +2 -8
  247. package/src/mark-rule/types.ts +1 -4
  248. package/src/math/index.ts +22 -0
  249. package/src/math/math-block.ts +89 -0
  250. package/src/math/math-inline.ts +89 -0
  251. package/src/math/math-plugin.ts +8 -0
  252. package/src/math/math.ts +39 -0
  253. package/src/mention/index.ts +1 -8
  254. package/src/mod-click-prevention/index.ts +2 -9
  255. package/src/paragraph/paragraph-commands.ts +1 -5
  256. package/src/paragraph/paragraph-keymap.ts +1 -4
  257. package/src/paragraph/paragraph-spec.ts +1 -4
  258. package/src/paragraph/paragraph.ts +3 -14
  259. package/src/paste-rule/index.ts +2 -10
  260. package/src/paste-rule/mark-paste-rule.spec.ts +3 -13
  261. package/src/paste-rule/mark-paste-rule.ts +4 -14
  262. package/src/paste-rule/paste-rule-plugin.ts +2 -11
  263. package/src/paste-rule/paste-rule.spec.ts +4 -19
  264. package/src/paste-rule/split-text-by-regex.spec.ts +1 -5
  265. package/src/placeholder/index.ts +3 -16
  266. package/src/readonly/index.ts +2 -8
  267. package/src/search/index.ts +1 -6
  268. package/src/table/index.ts +10 -40
  269. package/src/table/table-commands/delete-cell-selection.spec.ts +1 -5
  270. package/src/table/table-commands/exit-table.spec.ts +1 -5
  271. package/src/table/table-commands/insert-table.spec.ts +1 -5
  272. package/src/table/table-commands/insert-table.ts +1 -4
  273. package/src/table/table-commands/move-table-column.spec.ts +1 -5
  274. package/src/table/table-commands/move-table-column.ts +1 -4
  275. package/src/table/table-commands/move-table-row.spec.ts +1 -5
  276. package/src/table/table-commands/move-table-row.ts +1 -4
  277. package/src/table/table-commands/select-table-cell.spec.ts +1 -5
  278. package/src/table/table-commands/select-table-column.spec.ts +1 -5
  279. package/src/table/table-commands/select-table-row.spec.ts +1 -5
  280. package/src/table/table-commands/select-table.spec.ts +1 -5
  281. package/src/table/table-commands/select-table.ts +1 -4
  282. package/src/table/table-commands.ts +8 -32
  283. package/src/table/table-plugins.ts +2 -8
  284. package/src/table/table-spec.spec.ts +2 -11
  285. package/src/table/table-spec.ts +2 -8
  286. package/src/table/table-utils.ts +2 -6
  287. package/src/table/table.ts +2 -8
  288. package/src/table/test-utils.ts +1 -4
  289. package/src/testing/clipboard.ts +1 -2
  290. package/src/testing/index.ts +10 -12
  291. package/src/testing/katex.ts +9 -0
  292. package/src/text/index.ts +1 -4
  293. package/src/text-align/index.ts +2 -2
  294. package/src/text-color/index.ts +3 -0
  295. package/src/text-color/text-color-commands.spec.ts +71 -0
  296. package/src/text-color/text-color-commands.ts +35 -0
  297. package/src/text-color/text-color-spec.spec.ts +297 -0
  298. package/src/text-color/text-color-spec.ts +58 -0
  299. package/src/text-color/text-color.ts +21 -0
  300. package/src/virtual-selection/index.ts +3 -14
  301. package/src/yjs/index.ts +5 -20
  302. package/src/yjs/yjs-commands.ts +2 -8
  303. package/src/yjs/yjs-cursor-plugin.ts +3 -5
  304. package/src/yjs/yjs-keymap.ts +2 -10
  305. package/src/yjs/yjs-sync-plugin.ts +1 -4
  306. package/src/yjs/yjs-types.ts +8 -0
  307. package/src/yjs/yjs-undo-plugin.ts +2 -8
  308. package/src/yjs/yjs.ts +6 -24
  309. package/dist/drop-indicator-B1QHFb5m.js.map +0 -1
  310. package/dist/enter-rule-CzWOZF_Z.js +0 -96
  311. package/dist/enter-rule-CzWOZF_Z.js.map +0 -1
  312. package/dist/file-DrfcSid-.js.map +0 -1
  313. package/dist/index-oIc1a2f2.d.ts.map +0 -1
  314. package/dist/input-rule-dmsb3j6w.js +0 -90
  315. package/dist/input-rule-dmsb3j6w.js.map +0 -1
  316. package/dist/mark-rule-BcLB4Uv2.js.map +0 -1
  317. package/dist/paste-rule-pVb4sqvJ.js.map +0 -1
  318. package/dist/shiki-highlighter-chunk-rkzofy4z.d.ts +0 -19
  319. package/dist/shiki-highlighter-chunk-rkzofy4z.d.ts.map +0 -1
  320. package/dist/table-BRDh_9mG.js.map +0 -1
  321. package/src/testing/format-html.ts +0 -5
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/extensions",
3
3
  "type": "module",
4
- "version": "0.13.0",
4
+ "version": "0.14.1",
5
5
  "private": false,
6
6
  "description": "A collection of common extensions for ProseKit",
7
7
  "author": {
@@ -34,6 +34,10 @@
34
34
  "types": "./dist/prosekit-extensions-autocomplete.d.ts",
35
35
  "default": "./dist/prosekit-extensions-autocomplete.js"
36
36
  },
37
+ "./background-color": {
38
+ "types": "./dist/prosekit-extensions-background-color.d.ts",
39
+ "default": "./dist/prosekit-extensions-background-color.js"
40
+ },
37
41
  "./blockquote": {
38
42
  "types": "./dist/prosekit-extensions-blockquote.d.ts",
39
43
  "default": "./dist/prosekit-extensions-blockquote.js"
@@ -130,6 +134,10 @@
130
134
  "types": "./dist/prosekit-extensions-mark-rule.d.ts",
131
135
  "default": "./dist/prosekit-extensions-mark-rule.js"
132
136
  },
137
+ "./math": {
138
+ "types": "./dist/prosekit-extensions-math.d.ts",
139
+ "default": "./dist/prosekit-extensions-math.js"
140
+ },
133
141
  "./mention": {
134
142
  "types": "./dist/prosekit-extensions-mention.d.ts",
135
143
  "default": "./dist/prosekit-extensions-mention.js"
@@ -183,6 +191,10 @@
183
191
  "types": "./dist/prosekit-extensions-text-align.d.ts",
184
192
  "default": "./dist/prosekit-extensions-text-align.js"
185
193
  },
194
+ "./text-color": {
195
+ "types": "./dist/prosekit-extensions-text-color.d.ts",
196
+ "default": "./dist/prosekit-extensions-text-color.js"
197
+ },
186
198
  "./underline": {
187
199
  "types": "./dist/prosekit-extensions-underline.d.ts",
188
200
  "default": "./dist/prosekit-extensions-underline.js"
@@ -207,18 +219,20 @@
207
219
  "src"
208
220
  ],
209
221
  "dependencies": {
210
- "@ocavue/utils": "^1.2.0",
211
- "prosemirror-changeset": "^2.3.1",
222
+ "@ocavue/utils": "^1.5.0",
223
+ "prosemirror-changeset": "^2.4.0",
212
224
  "prosemirror-drop-indicator": "^0.1.3",
213
225
  "prosemirror-dropcursor": "^1.8.2",
214
226
  "prosemirror-flat-list": "^0.5.8",
215
227
  "prosemirror-gapcursor": "^1.4.0",
216
- "prosemirror-highlight": "^0.13.0",
228
+ "prosemirror-highlight": "^0.15.0",
217
229
  "prosemirror-search": "^1.1.0",
218
- "prosemirror-tables": "^1.8.3",
219
- "shiki": "^3.19.0",
220
- "@prosekit/core": "^0.9.0",
221
- "@prosekit/pm": "^0.1.15"
230
+ "prosemirror-tables": "^1.8.5",
231
+ "shiki": "^3.22.0",
232
+ "@prosekit/core": "^0.10.0",
233
+ "@prosekit/pm": "^0.1.15",
234
+ "prosemirror-enter-rules": "^0.1.3",
235
+ "prosemirror-math": "^0.1.0"
222
236
  },
223
237
  "peerDependencies": {
224
238
  "loro-crdt": ">= 1.10.0",
@@ -241,26 +255,25 @@
241
255
  }
242
256
  },
243
257
  "devDependencies": {
244
- "@types/diffable-html": "^5.0.2",
245
- "diffable-html": "^6.0.1",
258
+ "diffable-html-snapshot": "^0.2.0",
246
259
  "just-pick": "^4.2.0",
247
- "loro-crdt": "^1.10.2",
248
- "loro-prosemirror": "^0.4.1",
260
+ "katex": "^0.16.28",
261
+ "loro-crdt": "^1.10.6",
262
+ "loro-prosemirror": "^0.4.2",
249
263
  "rehype-parse": "^9.0.1",
250
264
  "rehype-remark": "^10.0.1",
251
265
  "remark-gfm": "^4.0.1",
252
266
  "remark-html": "^16.0.1",
253
267
  "remark-parse": "^11.0.0",
254
268
  "remark-stringify": "^11.0.0",
255
- "tsdown": "^0.17.0",
256
- "type-fest": "^5.3.1",
269
+ "tsdown": "^0.20.3",
270
+ "type-fest": "^5.4.4",
257
271
  "typescript": "~5.9.3",
258
272
  "unified": "^11.0.5",
259
- "vitest": "^4.0.15",
273
+ "vitest": "^4.0.18",
260
274
  "vitest-browser-commands": "^0.2.0",
261
275
  "y-prosemirror": "^1.3.7",
262
- "y-protocols": "^1.0.6",
263
- "yjs": "^13.6.27",
276
+ "yjs": "^13.6.29",
264
277
  "@prosekit/config-tsdown": "0.0.0",
265
278
  "@prosekit/config-vitest": "0.0.0"
266
279
  },
@@ -271,6 +284,7 @@
271
284
  "entry": {
272
285
  "prosekit-extensions": "./src/index.ts",
273
286
  "prosekit-extensions-autocomplete": "./src/autocomplete/index.ts",
287
+ "prosekit-extensions-background-color": "./src/background-color/index.ts",
274
288
  "prosekit-extensions-blockquote": "./src/blockquote/index.ts",
275
289
  "prosekit-extensions-bold": "./src/bold/index.ts",
276
290
  "prosekit-extensions-code": "./src/code/index.ts",
@@ -296,6 +310,7 @@
296
310
  "prosekit-extensions-loro": "./src/loro/index.ts",
297
311
  "loro/style": "./src/loro/style.css",
298
312
  "prosekit-extensions-mark-rule": "./src/mark-rule/index.ts",
313
+ "prosekit-extensions-math": "./src/math/index.ts",
299
314
  "prosekit-extensions-mention": "./src/mention/index.ts",
300
315
  "prosekit-extensions-mod-click-prevention": "./src/mod-click-prevention/index.ts",
301
316
  "prosekit-extensions-paragraph": "./src/paragraph/index.ts",
@@ -310,6 +325,7 @@
310
325
  "table/style": "./src/table/style.css",
311
326
  "prosekit-extensions-text": "./src/text/index.ts",
312
327
  "prosekit-extensions-text-align": "./src/text-align/index.ts",
328
+ "prosekit-extensions-text-color": "./src/text-color/index.ts",
313
329
  "prosekit-extensions-underline": "./src/underline/index.ts",
314
330
  "prosekit-extensions-virtual-selection": "./src/virtual-selection/index.ts",
315
331
  "virtual-selection/style": "./src/virtual-selection/style.css",
@@ -330,6 +346,9 @@
330
346
  "autocomplete": [
331
347
  "./dist/prosekit-extensions-autocomplete.d.ts"
332
348
  ],
349
+ "background-color": [
350
+ "./dist/prosekit-extensions-background-color.d.ts"
351
+ ],
333
352
  "blockquote": [
334
353
  "./dist/prosekit-extensions-blockquote.d.ts"
335
354
  ],
@@ -393,6 +412,9 @@
393
412
  "mark-rule": [
394
413
  "./dist/prosekit-extensions-mark-rule.d.ts"
395
414
  ],
415
+ "math": [
416
+ "./dist/prosekit-extensions-math.d.ts"
417
+ ],
396
418
  "mention": [
397
419
  "./dist/prosekit-extensions-mention.d.ts"
398
420
  ],
@@ -426,6 +448,9 @@
426
448
  "text-align": [
427
449
  "./dist/prosekit-extensions-text-align.d.ts"
428
450
  ],
451
+ "text-color": [
452
+ "./dist/prosekit-extensions-text-color.d.ts"
453
+ ],
429
454
  "underline": [
430
455
  "./dist/prosekit-extensions-underline.d.ts"
431
456
  ],
@@ -1,9 +1,5 @@
1
1
  import type { ResolvedPos } from '@prosekit/pm/model'
2
- import {
3
- PluginKey,
4
- type EditorState,
5
- type Transaction,
6
- } from '@prosekit/pm/state'
2
+ import { PluginKey, type EditorState, type Transaction } from '@prosekit/pm/state'
7
3
 
8
4
  import type { AutocompleteRule } from './autocomplete-rule'
9
5
 
@@ -1,19 +1,9 @@
1
1
  import { OBJECT_REPLACEMENT_CHARACTER } from '@prosekit/core'
2
- import type {
3
- ProseMirrorNode,
4
- ResolvedPos,
5
- } from '@prosekit/pm/model'
6
- import {
7
- Plugin,
8
- type EditorState,
9
- type Transaction,
10
- } from '@prosekit/pm/state'
2
+ import type { ProseMirrorNode, ResolvedPos } from '@prosekit/pm/model'
3
+ import { Plugin, type EditorState, type Transaction } from '@prosekit/pm/state'
11
4
  import type { Mapping } from '@prosekit/pm/transform'
12
5
  import type { EditorView } from '@prosekit/pm/view'
13
- import {
14
- Decoration,
15
- DecorationSet,
16
- } from '@prosekit/pm/view'
6
+ import { Decoration, DecorationSet } from '@prosekit/pm/view'
17
7
 
18
8
  import {
19
9
  getPluginState,
@@ -1,27 +1,12 @@
1
- import {
2
- canUseRegexLookbehind,
3
- union,
4
- } from '@prosekit/core'
5
- import {
6
- describe,
7
- expect,
8
- it,
9
- vi,
10
- } from 'vitest'
1
+ import { canUseRegexLookbehind, union } from '@prosekit/core'
2
+ import { describe, expect, it, vi } from 'vitest'
11
3
  import { keyboard } from 'vitest-browser-commands/playwright'
12
4
 
13
- import {
14
- defineTestExtension,
15
- setupTestFromExtension,
16
- } from '../testing'
5
+ import { defineTestExtension, setupTestFromExtension } from '../testing'
17
6
  import { inputText } from '../testing/keyboard'
18
7
 
19
8
  import { defineAutocomplete } from './autocomplete'
20
- import {
21
- AutocompleteRule,
22
- type MatchHandler,
23
- type MatchHandlerOptions,
24
- } from './autocomplete-rule'
9
+ import { AutocompleteRule, type MatchHandler, type MatchHandlerOptions } from './autocomplete-rule'
25
10
 
26
11
  function setupSlashMenu() {
27
12
  const regex = canUseRegexLookbehind() ? /(?<!\S)\/(\S.*)?$/u : /\/(\S.*)?$/u
@@ -1,10 +1,4 @@
1
- import {
2
- defineFacet,
3
- defineFacetPayload,
4
- pluginFacet,
5
- type Extension,
6
- type PluginPayload,
7
- } from '@prosekit/core'
1
+ import { defineFacet, defineFacetPayload, pluginFacet, type Extension, type PluginPayload } from '@prosekit/core'
8
2
 
9
3
  import { createAutocompletePlugin } from './autocomplete-plugin'
10
4
  import type { AutocompleteRule } from './autocomplete-rule'
@@ -0,0 +1,71 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { setupTest } from '../testing'
4
+
5
+ describe('addBackgroundColor', () => {
6
+ it('can add background color to text', () => {
7
+ const { editor, n, m } = setupTest()
8
+
9
+ const doc1 = n.doc(
10
+ n.p('Hello <a>world<b>'),
11
+ )
12
+ const doc2 = n.doc(
13
+ n.p('Hello ', m.backgroundColor({ color: 'red' }, 'world')),
14
+ )
15
+
16
+ editor.set(doc1)
17
+ editor.commands.addBackgroundColor({ color: 'red' })
18
+ expect(editor.getDocJSON()).toEqual(doc2.toJSON())
19
+ })
20
+
21
+ it('can override existing background color', () => {
22
+ const { editor, n, m } = setupTest()
23
+
24
+ const doc1 = n.doc(
25
+ n.p(
26
+ 'A',
27
+ m.backgroundColor({ color: 'red' }, 'B<a>C'),
28
+ m.backgroundColor({ color: 'red' }, 'DE'),
29
+ 'F<b>G',
30
+ ),
31
+ )
32
+ const doc2 = n.doc(
33
+ n.p(
34
+ 'A',
35
+ m.backgroundColor({ color: 'red' }, 'B'),
36
+ m.backgroundColor({ color: 'blue' }, 'CDEF'),
37
+ 'G',
38
+ ),
39
+ )
40
+
41
+ editor.set(doc1)
42
+ editor.commands.addBackgroundColor({ color: 'blue' })
43
+ expect(editor.getDocJSON()).toEqual(doc2.toJSON())
44
+ })
45
+ })
46
+
47
+ describe('removeBackgroundColor', () => {
48
+ it('can remove background color from text', () => {
49
+ const { editor, n, m } = setupTest()
50
+
51
+ const doc1 = n.doc(
52
+ n.p(
53
+ 'A',
54
+ m.backgroundColor({ color: 'red' }, 'B<a>C'),
55
+ m.backgroundColor({ color: 'blue' }, 'DE'),
56
+ 'F<b>G',
57
+ ),
58
+ )
59
+ const doc2 = n.doc(
60
+ n.p(
61
+ 'A',
62
+ m.backgroundColor({ color: 'red' }, 'B'),
63
+ 'CDEFG',
64
+ ),
65
+ )
66
+
67
+ editor.set(doc1)
68
+ editor.commands.removeBackgroundColor()
69
+ expect(editor.getDocJSON()).toEqual(doc2.toJSON())
70
+ })
71
+ })
@@ -0,0 +1,35 @@
1
+ import { addMark, defineCommands, removeMark, type Extension } from '@prosekit/core'
2
+ import type { Command } from '@prosekit/pm/state'
3
+
4
+ import type { BackgroundColorAttrs } from './background-color-spec'
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export function addBackgroundColor(attrs: BackgroundColorAttrs): Command {
10
+ return addMark({ type: 'backgroundColor', attrs })
11
+ }
12
+
13
+ /**
14
+ * @internal
15
+ */
16
+ export function removeBackgroundColor(): Command {
17
+ return removeMark({ type: 'backgroundColor' })
18
+ }
19
+
20
+ /**
21
+ * @internal
22
+ */
23
+ export type BackgroundColorCommandsExtension = Extension<{
24
+ Commands: {
25
+ addBackgroundColor: [attrs: BackgroundColorAttrs]
26
+ removeBackgroundColor: []
27
+ }
28
+ }>
29
+
30
+ /**
31
+ * @internal
32
+ */
33
+ export function defineBackgroundColorCommands(): BackgroundColorCommandsExtension {
34
+ return defineCommands({ addBackgroundColor, removeBackgroundColor })
35
+ }
@@ -0,0 +1,286 @@
1
+ import { formatHTML } from 'diffable-html-snapshot'
2
+ import { describe, expect, it } from 'vitest'
3
+
4
+ import { setupTest } from '../testing'
5
+
6
+ describe('defineBackgroundColorSpec', () => {
7
+ it('should render background color as inline span with style attribute', () => {
8
+ const { editor, n, m } = setupTest()
9
+
10
+ const doc = n.doc(
11
+ n.p(
12
+ 'Default',
13
+ m.backgroundColor({ color: '#0000ff' }, 'hex'),
14
+ m.backgroundColor({ color: 'blue' }, 'named'),
15
+ m.backgroundColor({ color: 'rgb(0, 0, 255)' }, 'rgb'),
16
+ m.backgroundColor({ color: 'rgba(0 0 255 / 0.5)' }, 'rgba'),
17
+ m.backgroundColor({ color: 'hsl(240 100% 50% / 0.5)' }, 'hsl'),
18
+ m.backgroundColor({ color: 'var(--color-variable)' }, 'variable'),
19
+ ),
20
+ )
21
+ editor.set(doc)
22
+ expect(formatHTML(editor.view.dom.innerHTML)).toMatchInlineSnapshot(
23
+ `
24
+ "
25
+ <p>
26
+ Default
27
+ <span
28
+ data-background-color="#0000ff"
29
+ style="background-color: rgb(0, 0, 255);"
30
+ >
31
+ hex
32
+ </span>
33
+ <span
34
+ data-background-color="blue"
35
+ style="background-color: blue;"
36
+ >
37
+ named
38
+ </span>
39
+ <span
40
+ data-background-color="rgb(0, 0, 255)"
41
+ style="background-color: rgb(0, 0, 255);"
42
+ >
43
+ rgb
44
+ </span>
45
+ <span
46
+ data-background-color="rgba(0 0 255 / 0.5)"
47
+ style="background-color: rgba(0, 0, 255, 0.5);"
48
+ >
49
+ rgba
50
+ </span>
51
+ <span
52
+ data-background-color="hsl(240 100% 50% / 0.5)"
53
+ style="background-color: rgba(0, 0, 255, 0.5);"
54
+ >
55
+ hsl
56
+ </span>
57
+ <span
58
+ data-background-color="var(--color-variable)"
59
+ style="background-color: var(--color-variable);"
60
+ >
61
+ variable
62
+ </span>
63
+ </p>
64
+ "
65
+ `,
66
+ )
67
+ })
68
+
69
+ it('should parse background color from style attribute', () => {
70
+ const { editor } = setupTest()
71
+
72
+ const html = `<p><span style="background-color: #0000ff;">text</span></p>`
73
+ editor.setContent(html)
74
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
75
+ {
76
+ "marks": [
77
+ {
78
+ "attrs": {
79
+ "color": "rgb(0, 0, 255)",
80
+ },
81
+ "type": "backgroundColor",
82
+ },
83
+ ],
84
+ "text": "text",
85
+ "type": "text",
86
+ }
87
+ `)
88
+ })
89
+
90
+ it('should parse background color from data-background-color attribute', () => {
91
+ const { editor } = setupTest()
92
+
93
+ const html = `<p><span data-background-color="rgb(0 0 255 / 0.5)">text</span></p>`
94
+ editor.setContent(html)
95
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
96
+ {
97
+ "marks": [
98
+ {
99
+ "attrs": {
100
+ "color": "rgb(0 0 255 / 0.5)",
101
+ },
102
+ "type": "backgroundColor",
103
+ },
104
+ ],
105
+ "text": "text",
106
+ "type": "text",
107
+ }
108
+ `)
109
+ })
110
+
111
+ it('should prioritize data-background-color attribute over style attribute', () => {
112
+ const { editor } = setupTest()
113
+
114
+ const html = `<p><span style="background-color: blue;" data-background-color="red">This should be red</span></p>`
115
+ editor.setContent(html)
116
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
117
+ {
118
+ "marks": [
119
+ {
120
+ "attrs": {
121
+ "color": "red",
122
+ },
123
+ "type": "backgroundColor",
124
+ },
125
+ ],
126
+ "text": "This should be red",
127
+ "type": "text",
128
+ }
129
+ `)
130
+ })
131
+
132
+ it('should not parse span with background-color: inherit', () => {
133
+ const { editor } = setupTest()
134
+
135
+ const html = '<p><span style="background-color: inherit">text</span></p>'
136
+ editor.setContent(html)
137
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
138
+ {
139
+ "text": "text",
140
+ "type": "text",
141
+ }
142
+ `)
143
+
144
+ const html2 = '<p><span data-background-color="inherit">text</span></p>'
145
+ editor.setContent(html2)
146
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
147
+ {
148
+ "text": "text",
149
+ "type": "text",
150
+ }
151
+ `)
152
+ })
153
+
154
+ it('should preserve both background-color and text-color marks', () => {
155
+ const { editor, n, m } = setupTest()
156
+
157
+ const doc = n.doc(
158
+ n.p(
159
+ m.backgroundColor(
160
+ { color: 'yellow' },
161
+ m.textColor({ color: 'red' }, 'colored text'),
162
+ ),
163
+ ),
164
+ )
165
+ editor.set(doc)
166
+ expect(formatHTML(editor.view.dom.innerHTML)).toMatchInlineSnapshot(
167
+ `
168
+ "
169
+ <p>
170
+ <span
171
+ data-background-color="yellow"
172
+ style="background-color: yellow;"
173
+ >
174
+ <span
175
+ data-text-color="red"
176
+ style="color: red;"
177
+ >
178
+ colored text
179
+ </span>
180
+ </span>
181
+ </p>
182
+ "
183
+ `,
184
+ )
185
+ })
186
+
187
+ it('should preserve background-color mark when parsing HTML with both marks', () => {
188
+ const { editor } = setupTest()
189
+
190
+ const html = '<p>'
191
+ + '<span style="background-color: yellow;">'
192
+ + '<span style="color: red;">colored text</span>'
193
+ + '</span>'
194
+ + '</p>'
195
+
196
+ editor.setContent(html)
197
+ expect(editor.state.doc.firstChild?.firstChild?.toJSON()).toMatchInlineSnapshot(`
198
+ {
199
+ "marks": [
200
+ {
201
+ "attrs": {
202
+ "color": "yellow",
203
+ },
204
+ "type": "backgroundColor",
205
+ },
206
+ {
207
+ "attrs": {
208
+ "color": "red",
209
+ },
210
+ "type": "textColor",
211
+ },
212
+ ],
213
+ "text": "colored text",
214
+ "type": "text",
215
+ }
216
+ `)
217
+ })
218
+
219
+ it('should handle background color on partial text selection', () => {
220
+ const { editor, n, m } = setupTest()
221
+
222
+ const doc = n.doc(
223
+ n.p(
224
+ 'Start ',
225
+ m.backgroundColor({ color: 'yellow' }, 'highlighted'),
226
+ ' end',
227
+ ),
228
+ )
229
+ editor.set(doc)
230
+ expect(formatHTML(editor.view.dom.innerHTML)).toMatchInlineSnapshot(
231
+ `
232
+ "
233
+ <p>
234
+ Start
235
+ <span
236
+ data-background-color="yellow"
237
+ style="background-color: yellow;"
238
+ >
239
+ highlighted
240
+ </span>
241
+ end
242
+ </p>
243
+ "
244
+ `,
245
+ )
246
+ })
247
+
248
+ it('should handle multiple adjacent background colors', () => {
249
+ const { editor, n, m } = setupTest()
250
+
251
+ const doc = n.doc(
252
+ n.p(
253
+ m.backgroundColor({ color: 'yellow' }, 'yellow'),
254
+ m.backgroundColor({ color: 'green' }, 'green'),
255
+ m.backgroundColor({ color: 'blue' }, 'blue'),
256
+ ),
257
+ )
258
+ editor.set(doc)
259
+ expect(formatHTML(editor.view.dom.innerHTML)).toMatchInlineSnapshot(
260
+ `
261
+ "
262
+ <p>
263
+ <span
264
+ data-background-color="yellow"
265
+ style="background-color: yellow;"
266
+ >
267
+ yellow
268
+ </span>
269
+ <span
270
+ data-background-color="green"
271
+ style="background-color: green;"
272
+ >
273
+ green
274
+ </span>
275
+ <span
276
+ data-background-color="blue"
277
+ style="background-color: blue;"
278
+ >
279
+ blue
280
+ </span>
281
+ </p>
282
+ "
283
+ `,
284
+ )
285
+ })
286
+ })
@@ -0,0 +1,58 @@
1
+ import { defineMarkSpec, type Extension } from '@prosekit/core'
2
+
3
+ /**
4
+ * Attributes for the `backgroundColor` mark.
5
+ *
6
+ * @public
7
+ */
8
+ export interface BackgroundColorAttrs {
9
+ color: string
10
+ }
11
+
12
+ /**
13
+ * @internal
14
+ */
15
+ export type BackgroundColorSpecExtension = Extension<{
16
+ Marks: {
17
+ backgroundColor: BackgroundColorAttrs
18
+ }
19
+ }>
20
+
21
+ /**
22
+ * @internal
23
+ */
24
+ export function defineBackgroundColorSpec(): BackgroundColorSpecExtension {
25
+ return defineMarkSpec<'backgroundColor', BackgroundColorAttrs>({
26
+ name: 'backgroundColor',
27
+ attrs: {
28
+ color: {
29
+ validate: 'string',
30
+ },
31
+ },
32
+ parseDOM: [
33
+ {
34
+ tag: ':where([style*="background-color:"], [data-background-color])',
35
+ getAttrs: (node): BackgroundColorAttrs | false => {
36
+ // When both `data-background-color` and `style="background-color"` are present, we
37
+ // prioritize the `data-background-color` attribute. This avoids the
38
+ // browser's default behavior of changing hex colors to rgba in style
39
+ // attribute.
40
+ const value = node.getAttribute('data-background-color')
41
+ if (value && value !== 'inherit') {
42
+ return { color: value }
43
+ }
44
+ const color = node.style.backgroundColor
45
+ if (color && color !== 'inherit') {
46
+ return { color }
47
+ }
48
+ return false
49
+ },
50
+ consuming: false,
51
+ },
52
+ ],
53
+ toDOM(mark) {
54
+ const color = (mark.attrs as BackgroundColorAttrs).color
55
+ return ['span', { 'style': `background-color: ${color};`, 'data-background-color': color }, 0]
56
+ },
57
+ })
58
+ }