@prosekit/extensions 0.14.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/dist/commit/style.css +1 -3
  2. package/dist/{drop-indicator-DJq8pF92.js → drop-indicator.js} +2 -4
  3. package/dist/drop-indicator.js.map +1 -0
  4. package/dist/{file-upload-I9m1EJAM.js → file.js} +2 -6
  5. package/dist/file.js.map +1 -0
  6. package/dist/gap-cursor/style.css +5 -8
  7. package/dist/{file-upload-dr3IXUty.d.ts → index.d.ts} +1 -1
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/list/style.css +79 -110
  10. package/dist/loro/style.css +18 -21
  11. package/dist/{mark-rule-CUnXwBuy.js → mark-rule.js} +3 -6
  12. package/dist/mark-rule.js.map +1 -0
  13. package/dist/page/style.css +43 -0
  14. package/dist/{mark-paste-rule-n_2Ehmb5.js → paste-rule.js} +3 -7
  15. package/dist/paste-rule.js.map +1 -0
  16. package/dist/placeholder/style.css +4 -7
  17. package/dist/prosekit-extensions-autocomplete.d.ts +1 -1
  18. package/dist/prosekit-extensions-autocomplete.js +17 -21
  19. package/dist/prosekit-extensions-autocomplete.js.map +1 -1
  20. package/dist/prosekit-extensions-background-color.d.ts +1 -1
  21. package/dist/prosekit-extensions-background-color.js +1 -4
  22. package/dist/prosekit-extensions-background-color.js.map +1 -1
  23. package/dist/prosekit-extensions-blockquote.d.ts +13 -13
  24. package/dist/prosekit-extensions-blockquote.d.ts.map +1 -1
  25. package/dist/prosekit-extensions-blockquote.js +6 -10
  26. package/dist/prosekit-extensions-blockquote.js.map +1 -1
  27. package/dist/prosekit-extensions-bold.d.ts +12 -12
  28. package/dist/prosekit-extensions-bold.d.ts.map +1 -1
  29. package/dist/prosekit-extensions-bold.js +1 -6
  30. package/dist/prosekit-extensions-bold.js.map +1 -1
  31. package/dist/prosekit-extensions-code-block.d.ts +56 -37
  32. package/dist/prosekit-extensions-code-block.d.ts.map +1 -1
  33. package/dist/prosekit-extensions-code-block.js +73 -76
  34. package/dist/prosekit-extensions-code-block.js.map +1 -1
  35. package/dist/prosekit-extensions-code.d.ts +12 -12
  36. package/dist/prosekit-extensions-code.d.ts.map +1 -1
  37. package/dist/prosekit-extensions-code.js +1 -6
  38. package/dist/prosekit-extensions-code.js.map +1 -1
  39. package/dist/prosekit-extensions-commit.d.ts +1 -1
  40. package/dist/prosekit-extensions-commit.js +2 -3
  41. package/dist/prosekit-extensions-commit.js.map +1 -1
  42. package/dist/prosekit-extensions-doc.js +1 -2
  43. package/dist/prosekit-extensions-doc.js.map +1 -1
  44. package/dist/prosekit-extensions-drop-cursor.js +1 -2
  45. package/dist/prosekit-extensions-drop-cursor.js.map +1 -1
  46. package/dist/prosekit-extensions-drop-indicator.js +2 -3
  47. package/dist/prosekit-extensions-enter-rule.d.ts +2 -2
  48. package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -1
  49. package/dist/prosekit-extensions-enter-rule.js +1 -2
  50. package/dist/prosekit-extensions-enter-rule.js.map +1 -1
  51. package/dist/prosekit-extensions-file.d.ts +2 -2
  52. package/dist/prosekit-extensions-file.js +2 -3
  53. package/dist/prosekit-extensions-gap-cursor.js +1 -2
  54. package/dist/prosekit-extensions-gap-cursor.js.map +1 -1
  55. package/dist/prosekit-extensions-hard-break.d.ts +7 -7
  56. package/dist/prosekit-extensions-hard-break.d.ts.map +1 -1
  57. package/dist/prosekit-extensions-hard-break.js +1 -5
  58. package/dist/prosekit-extensions-hard-break.js.map +1 -1
  59. package/dist/prosekit-extensions-heading.d.ts +15 -15
  60. package/dist/prosekit-extensions-heading.d.ts.map +1 -1
  61. package/dist/prosekit-extensions-heading.js +1 -6
  62. package/dist/prosekit-extensions-heading.js.map +1 -1
  63. package/dist/prosekit-extensions-horizontal-rule.d.ts +7 -7
  64. package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -1
  65. package/dist/prosekit-extensions-horizontal-rule.js +12 -14
  66. package/dist/prosekit-extensions-horizontal-rule.js.map +1 -1
  67. package/dist/prosekit-extensions-image.d.ts +12 -13
  68. package/dist/prosekit-extensions-image.d.ts.map +1 -1
  69. package/dist/prosekit-extensions-image.js +10 -16
  70. package/dist/prosekit-extensions-image.js.map +1 -1
  71. package/dist/prosekit-extensions-input-rule.js +1 -2
  72. package/dist/prosekit-extensions-input-rule.js.map +1 -1
  73. package/dist/prosekit-extensions-italic.d.ts +12 -12
  74. package/dist/prosekit-extensions-italic.d.ts.map +1 -1
  75. package/dist/prosekit-extensions-italic.js +1 -6
  76. package/dist/prosekit-extensions-italic.js.map +1 -1
  77. package/dist/prosekit-extensions-link.js +3 -6
  78. package/dist/prosekit-extensions-link.js.map +1 -1
  79. package/dist/prosekit-extensions-list.d.ts +26 -26
  80. package/dist/prosekit-extensions-list.d.ts.map +1 -1
  81. package/dist/prosekit-extensions-list.js +26 -34
  82. package/dist/prosekit-extensions-list.js.map +1 -1
  83. package/dist/prosekit-extensions-loro.d.ts +16 -16
  84. package/dist/prosekit-extensions-loro.d.ts.map +1 -1
  85. package/dist/prosekit-extensions-loro.js +3 -9
  86. package/dist/prosekit-extensions-loro.js.map +1 -1
  87. package/dist/prosekit-extensions-mark-rule.js +2 -3
  88. package/dist/prosekit-extensions-math.d.ts +3 -3
  89. package/dist/prosekit-extensions-math.d.ts.map +1 -1
  90. package/dist/prosekit-extensions-math.js +5 -5
  91. package/dist/prosekit-extensions-math.js.map +1 -1
  92. package/dist/prosekit-extensions-mention.js +1 -2
  93. package/dist/prosekit-extensions-mention.js.map +1 -1
  94. package/dist/prosekit-extensions-mod-click-prevention.js +2 -3
  95. package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -1
  96. package/dist/prosekit-extensions-page.d.ts +114 -0
  97. package/dist/prosekit-extensions-page.d.ts.map +1 -0
  98. package/dist/prosekit-extensions-page.js +324 -0
  99. package/dist/prosekit-extensions-page.js.map +1 -0
  100. package/dist/prosekit-extensions-paragraph.d.ts +7 -7
  101. package/dist/prosekit-extensions-paragraph.d.ts.map +1 -1
  102. package/dist/prosekit-extensions-paragraph.js +3 -7
  103. package/dist/prosekit-extensions-paragraph.js.map +1 -1
  104. package/dist/prosekit-extensions-paste-rule.js +2 -3
  105. package/dist/prosekit-extensions-placeholder.d.ts +1 -1
  106. package/dist/prosekit-extensions-placeholder.js +3 -4
  107. package/dist/prosekit-extensions-placeholder.js.map +1 -1
  108. package/dist/prosekit-extensions-readonly.js +2 -3
  109. package/dist/prosekit-extensions-readonly.js.map +1 -1
  110. package/dist/prosekit-extensions-search.js +1 -2
  111. package/dist/prosekit-extensions-search.js.map +1 -1
  112. package/dist/prosekit-extensions-strike.js +1 -2
  113. package/dist/prosekit-extensions-strike.js.map +1 -1
  114. package/dist/prosekit-extensions-table.d.ts +47 -47
  115. package/dist/prosekit-extensions-table.d.ts.map +1 -1
  116. package/dist/prosekit-extensions-table.js +2 -3
  117. package/dist/prosekit-extensions-text-align.d.ts +1 -1
  118. package/dist/prosekit-extensions-text-align.js +1 -2
  119. package/dist/prosekit-extensions-text-align.js.map +1 -1
  120. package/dist/prosekit-extensions-text-color.d.ts +1 -1
  121. package/dist/prosekit-extensions-text-color.js +1 -4
  122. package/dist/prosekit-extensions-text-color.js.map +1 -1
  123. package/dist/prosekit-extensions-text.js +1 -2
  124. package/dist/prosekit-extensions-text.js.map +1 -1
  125. package/dist/prosekit-extensions-underline.js +1 -2
  126. package/dist/prosekit-extensions-underline.js.map +1 -1
  127. package/dist/prosekit-extensions-virtual-selection.js +2 -3
  128. package/dist/prosekit-extensions-virtual-selection.js.map +1 -1
  129. package/dist/prosekit-extensions-yjs.d.ts +3 -3
  130. package/dist/prosekit-extensions-yjs.d.ts.map +1 -1
  131. package/dist/prosekit-extensions-yjs.js +3 -9
  132. package/dist/prosekit-extensions-yjs.js.map +1 -1
  133. package/dist/prosekit-extensions.js +1 -1
  134. package/dist/search/style.css +4 -8
  135. package/dist/shiki-highlighter-chunk.js +1 -2
  136. package/dist/shiki-highlighter-chunk.js.map +1 -1
  137. package/dist/table/style.css +16 -16
  138. package/dist/{table-UJVYsrB7.js → table.js} +29 -41
  139. package/dist/table.js.map +1 -0
  140. package/dist/virtual-selection/style.css +1 -4
  141. package/dist/yjs/style.css +14 -20
  142. package/package.json +30 -16
  143. package/src/autocomplete/autocomplete-helpers.ts +1 -1
  144. package/src/autocomplete/autocomplete-plugin.ts +2 -2
  145. package/src/autocomplete/autocomplete-rule.ts +1 -1
  146. package/src/autocomplete/autocomplete.spec.ts +4 -4
  147. package/src/autocomplete/autocomplete.ts +2 -2
  148. package/src/autocomplete/index.ts +2 -2
  149. package/src/background-color/background-color-commands.spec.ts +1 -1
  150. package/src/background-color/background-color-commands.ts +1 -1
  151. package/src/background-color/background-color-spec.spec.ts +1 -1
  152. package/src/background-color/background-color.ts +2 -2
  153. package/src/background-color/index.ts +3 -3
  154. package/src/blockquote/blockquote-input-rule.ts +1 -1
  155. package/src/blockquote/blockquote-keymap.spec.ts +1 -1
  156. package/src/blockquote/blockquote-keymap.ts +9 -7
  157. package/src/blockquote/blockquote.ts +4 -4
  158. package/src/blockquote/index.ts +5 -5
  159. package/src/bold/bold-input-rule.spec.ts +2 -2
  160. package/src/bold/bold-input-rule.ts +1 -1
  161. package/src/bold/bold.ts +4 -4
  162. package/src/bold/index.ts +5 -5
  163. package/src/code/code-input-rule.ts +1 -1
  164. package/src/code/code.ts +4 -4
  165. package/src/code/index.ts +5 -5
  166. package/src/code-block/code-block-commands.ts +1 -1
  167. package/src/code-block/code-block-highlight.ts +11 -1
  168. package/src/code-block/code-block-input-rule.ts +3 -3
  169. package/src/code-block/code-block-shiki.ts +13 -5
  170. package/src/code-block/code-block-spec.spec.ts +2 -2
  171. package/src/code-block/code-block-spec.ts +1 -1
  172. package/src/code-block/code-block.ts +4 -4
  173. package/src/code-block/index.ts +9 -9
  174. package/src/code-block/shiki-highlighter.ts +2 -2
  175. package/src/code-block/shiki-parser.ts +2 -2
  176. package/src/drop-cursor/index.ts +1 -1
  177. package/src/drop-indicator/drop-indicator.ts +1 -1
  178. package/src/drop-indicator/index.ts +1 -1
  179. package/src/enter-rule/index.ts +3 -3
  180. package/src/file/file-drop-handler.ts +1 -1
  181. package/src/file/file-paste-handler.spec.ts +3 -3
  182. package/src/file/file-paste-handler.ts +1 -1
  183. package/src/file/index.ts +3 -3
  184. package/src/gap-cursor/index.ts +1 -1
  185. package/src/hard-break/hard-break-keymap.spec.ts +2 -2
  186. package/src/hard-break/hard-break-keymap.ts +1 -1
  187. package/src/hard-break/hard-break.ts +3 -3
  188. package/src/hard-break/index.ts +4 -4
  189. package/src/heading/heading-commands.ts +1 -1
  190. package/src/heading/heading-input-rule.ts +2 -2
  191. package/src/heading/heading-keymap.spec.ts +1 -1
  192. package/src/heading/heading-spec.ts +1 -1
  193. package/src/heading/heading.ts +4 -4
  194. package/src/heading/index.ts +6 -6
  195. package/src/horizontal-rule/horizontal-rule-commands.spec.ts +1 -1
  196. package/src/horizontal-rule/horizontal-rule-commands.ts +14 -11
  197. package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +2 -2
  198. package/src/horizontal-rule/horizontal-rule-input-rule.ts +1 -1
  199. package/src/horizontal-rule/horizontal-rule.ts +3 -3
  200. package/src/horizontal-rule/index.ts +4 -4
  201. package/src/image/image-commands/insert-image.ts +1 -1
  202. package/src/image/image-commands/upload-image.spec.ts +4 -4
  203. package/src/image/image-commands/upload-image.ts +2 -2
  204. package/src/image/image-commands.ts +3 -3
  205. package/src/image/image-upload-handler.ts +2 -2
  206. package/src/image/image.ts +2 -2
  207. package/src/image/index.ts +6 -6
  208. package/src/italic/index.ts +5 -5
  209. package/src/italic/italic-commands.spec.ts +4 -4
  210. package/src/italic/italic-input-rule.spec.ts +2 -2
  211. package/src/italic/italic-input-rule.ts +1 -1
  212. package/src/italic/italic.ts +4 -4
  213. package/src/link/index.spec.ts +2 -2
  214. package/src/link/index.ts +6 -6
  215. package/src/link/link-paste-rule.spec.ts +2 -2
  216. package/src/link/link-paste-rule.ts +3 -3
  217. package/src/link/link-regex.spec.ts +1 -1
  218. package/src/list/index.ts +8 -8
  219. package/src/list/list-drop-indicator.ts +2 -2
  220. package/src/list/list-input-rules.ts +1 -1
  221. package/src/list/list-keymap.spec.ts +1 -1
  222. package/src/list/list-spec.ts +1 -1
  223. package/src/list/list-types.spec.ts +2 -2
  224. package/src/list/list.spec.ts +6 -6
  225. package/src/list/list.ts +7 -7
  226. package/src/loro/index.ts +6 -6
  227. package/src/loro/loro.ts +8 -7
  228. package/src/mark-rule/apply.ts +2 -2
  229. package/src/mark-rule/index.ts +2 -2
  230. package/src/mark-rule/mark-rule.spec.ts +4 -4
  231. package/src/mark-rule/mark-rule.ts +2 -2
  232. package/src/math/index.ts +4 -4
  233. package/src/math/math-block.ts +8 -1
  234. package/src/math/math-inline.ts +1 -1
  235. package/src/math/math.ts +3 -3
  236. package/src/page/index.ts +5 -0
  237. package/src/page/page-break-commands.spec.ts +61 -0
  238. package/src/page/page-break-commands.ts +41 -0
  239. package/src/page/page-break-keymap.ts +17 -0
  240. package/src/page/page-break-spec.ts +33 -0
  241. package/src/page/page-break.ts +23 -0
  242. package/src/page/page-element.ts +246 -0
  243. package/src/page/page-rendering.ts +164 -0
  244. package/src/page/style.css +43 -0
  245. package/src/paragraph/index.ts +7 -7
  246. package/src/paragraph/paragraph-keymap.ts +1 -1
  247. package/src/paragraph/paragraph.ts +6 -5
  248. package/src/paste-rule/index.ts +2 -2
  249. package/src/paste-rule/mark-paste-rule.spec.ts +8 -8
  250. package/src/paste-rule/mark-paste-rule.ts +2 -2
  251. package/src/paste-rule/paste-rule.spec.ts +2 -2
  252. package/src/paste-rule/paste-rule.ts +1 -1
  253. package/src/paste-rule/split-text-by-regex.spec.ts +1 -1
  254. package/src/placeholder/index.ts +1 -1
  255. package/src/strike/index.ts +1 -1
  256. package/src/table/index.ts +14 -14
  257. package/src/table/table-commands/delete-cell-selection.spec.ts +3 -3
  258. package/src/table/table-commands/exit-table.spec.ts +2 -2
  259. package/src/table/table-commands/insert-table.spec.ts +1 -1
  260. package/src/table/table-commands/move-table-column.spec.ts +2 -2
  261. package/src/table/table-commands/move-table-row.spec.ts +2 -2
  262. package/src/table/table-commands/select-table-cell.spec.ts +3 -3
  263. package/src/table/table-commands/select-table-cell.ts +1 -1
  264. package/src/table/table-commands/select-table-column.spec.ts +2 -2
  265. package/src/table/table-commands/select-table-column.ts +1 -1
  266. package/src/table/table-commands/select-table-row.spec.ts +2 -2
  267. package/src/table/table-commands/select-table-row.ts +1 -1
  268. package/src/table/table-commands/select-table.spec.ts +2 -2
  269. package/src/table/table-commands/select-table.ts +1 -1
  270. package/src/table/table-commands.ts +9 -9
  271. package/src/table/table-drop-indicator.ts +2 -2
  272. package/src/table/table-spec.spec.ts +4 -4
  273. package/src/table/table.ts +4 -4
  274. package/src/table/test-utils.ts +1 -1
  275. package/src/testing/index.ts +24 -24
  276. package/src/text-color/index.ts +3 -3
  277. package/src/text-color/text-color-commands.spec.ts +1 -1
  278. package/src/text-color/text-color-commands.ts +1 -1
  279. package/src/text-color/text-color-spec.spec.ts +1 -1
  280. package/src/text-color/text-color.ts +2 -2
  281. package/src/yjs/index.ts +7 -7
  282. package/src/yjs/yjs-cursor-plugin.ts +1 -1
  283. package/src/yjs/yjs-undo-plugin.ts +3 -2
  284. package/src/yjs/yjs.ts +9 -8
  285. package/dist/commit/style.css.map +0 -1
  286. package/dist/commit/style.js +0 -1
  287. package/dist/drop-indicator-DJq8pF92.js.map +0 -1
  288. package/dist/file-upload-I9m1EJAM.js.map +0 -1
  289. package/dist/file-upload-dr3IXUty.d.ts.map +0 -1
  290. package/dist/gap-cursor/style.css.map +0 -1
  291. package/dist/gap-cursor/style.js +0 -1
  292. package/dist/list/style.css.map +0 -1
  293. package/dist/list/style.js +0 -1
  294. package/dist/loro/style.css.map +0 -1
  295. package/dist/loro/style.js +0 -1
  296. package/dist/mark-paste-rule-n_2Ehmb5.js.map +0 -1
  297. package/dist/mark-rule-CUnXwBuy.js.map +0 -1
  298. package/dist/placeholder/style.css.map +0 -1
  299. package/dist/placeholder/style.js +0 -1
  300. package/dist/search/style.css.map +0 -1
  301. package/dist/search/style.js +0 -1
  302. package/dist/shiki-highlighter-chunk.d.ts +0 -19
  303. package/dist/shiki-highlighter-chunk.d.ts.map +0 -1
  304. package/dist/table/style.css.map +0 -1
  305. package/dist/table/style.js +0 -1
  306. package/dist/table-UJVYsrB7.js.map +0 -1
  307. package/dist/virtual-selection/style.css.map +0 -1
  308. package/dist/virtual-selection/style.js +0 -1
  309. package/dist/yjs/style.css.map +0 -1
  310. package/dist/yjs/style.js +0 -1
@@ -1,5 +1,5 @@
1
- import { Extension, PlainExtension, Union } from "@prosekit/core";
2
1
  import { Command } from "@prosekit/pm/state";
2
+ import { Extension, PlainExtension, Union } from "@prosekit/core";
3
3
  import { Attrs } from "@prosekit/pm/model";
4
4
 
5
5
  //#region src/hard-break/hard-break-commands.d.ts
@@ -16,6 +16,12 @@ type HardBreakCommandsExtension = Extension<{
16
16
  */
17
17
  declare function defineHardBreakCommands(): HardBreakCommandsExtension;
18
18
  //#endregion
19
+ //#region src/hard-break/hard-break-keymap.d.ts
20
+ /**
21
+ * @internal
22
+ */
23
+ declare function defineHardBreakKeymap(): PlainExtension;
24
+ //#endregion
19
25
  //#region src/hard-break/hard-break-spec.d.ts
20
26
  /**
21
27
  * @internal
@@ -40,11 +46,5 @@ type HardBreakExtension = Union<[HardBreakSpecExtension, HardBreakCommandsExtens
40
46
  */
41
47
  declare function defineHardBreak(): HardBreakExtension;
42
48
  //#endregion
43
- //#region src/hard-break/hard-break-keymap.d.ts
44
- /**
45
- * @internal
46
- */
47
- declare function defineHardBreakKeymap(): PlainExtension;
48
- //#endregion
49
49
  export { type HardBreakCommandsExtension, type HardBreakExtension, type HardBreakSpecExtension, defineHardBreak, defineHardBreakCommands, defineHardBreakKeymap, defineHardBreakSpec };
50
50
  //# sourceMappingURL=prosekit-extensions-hard-break.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-hard-break.d.ts","names":[],"sources":["../src/hard-break/hard-break-commands.ts","../src/hard-break/hard-break-spec.ts","../src/hard-break/hard-break.ts","../src/hard-break/hard-break-keymap.ts"],"mappings":";;;;;;;;KAMY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,eAAA;EAAA;AAAA;AAcJ;;;AAAA,iBAAgB,uBAAA,CAAA,GAA2B,0BAAA;;;;;;KChB/B,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;;;;;ADTvC;KEGY,kBAAA,GAAqB,KAAA,EAC9B,sBAAA,EAAwB,0BAAA;;;;iBAMX,eAAA,CAAA,GAAmB,kBAAA;;;;;;iBCTnB,qBAAA,CAAA,GAAyB,cAAA"}
1
+ {"version":3,"file":"prosekit-extensions-hard-break.d.ts","names":[],"sources":["../src/hard-break/hard-break-commands.ts","../src/hard-break/hard-break-keymap.ts","../src/hard-break/hard-break-spec.ts","../src/hard-break/hard-break.ts"],"mappings":";;;;;;;;KAMY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,eAAA;EAAA;AAAA;AAcJ;;;AAAA,iBAAgB,uBAAA,CAAA,GAA2B,0BAAA;;;;;;iBCf3B,qBAAA,CAAA,GAAyB,cAAA;;;;;;KCD7B,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;;;;;AFTvC;KGGY,kBAAA,GAAqB,KAAA,EAC9B,sBAAA,EAAwB,0BAAA;;;;iBAMX,eAAA,CAAA,GAAmB,kBAAA"}
@@ -1,5 +1,4 @@
1
1
  import { defineCommands, defineKeymap, defineNodeSpec, insertNode, union } from "@prosekit/core";
2
-
3
2
  //#region src/hard-break/hard-break-commands.ts
4
3
  /**
5
4
  * @internal
@@ -13,7 +12,6 @@ function insertHardBreak() {
13
12
  function defineHardBreakCommands() {
14
13
  return defineCommands({ insertHardBreak });
15
14
  }
16
-
17
15
  //#endregion
18
16
  //#region src/hard-break/hard-break-keymap.ts
19
17
  /**
@@ -25,7 +23,6 @@ function defineHardBreakKeymap() {
25
23
  "Shift-Enter": insertHardBreak()
26
24
  });
27
25
  }
28
-
29
26
  //#endregion
30
27
  //#region src/hard-break/hard-break-spec.ts
31
28
  /**
@@ -44,7 +41,6 @@ function defineHardBreakSpec() {
44
41
  }
45
42
  });
46
43
  }
47
-
48
44
  //#endregion
49
45
  //#region src/hard-break/hard-break.ts
50
46
  /**
@@ -53,7 +49,7 @@ function defineHardBreakSpec() {
53
49
  function defineHardBreak() {
54
50
  return union(defineHardBreakSpec(), defineHardBreakKeymap(), defineHardBreakCommands());
55
51
  }
56
-
57
52
  //#endregion
58
53
  export { defineHardBreak, defineHardBreakCommands, defineHardBreakKeymap, defineHardBreakSpec };
54
+
59
55
  //# sourceMappingURL=prosekit-extensions-hard-break.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-hard-break.js","names":[],"sources":["../src/hard-break/hard-break-commands.ts","../src/hard-break/hard-break-keymap.ts","../src/hard-break/hard-break-spec.ts","../src/hard-break/hard-break.ts"],"sourcesContent":["import { defineCommands, insertNode, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type HardBreakCommandsExtension = Extension<{\n Commands: {\n insertHardBreak: []\n }\n}>\n\n/**\n * @internal\n */\nexport function insertHardBreak(): Command {\n return insertNode({ type: 'hardBreak' })\n}\n\n/**\n * @internal\n */\nexport function defineHardBreakCommands(): HardBreakCommandsExtension {\n return defineCommands({\n insertHardBreak: insertHardBreak,\n })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { insertHardBreak } from './hard-break-commands'\n\n/**\n * @internal\n */\nexport function defineHardBreakKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Enter': insertHardBreak(),\n 'Shift-Enter': insertHardBreak(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type HardBreakSpecExtension = Extension<{\n Nodes: {\n hardBreak: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHardBreakSpec(): HardBreakSpecExtension {\n return defineNodeSpec({\n name: 'hardBreak',\n inline: true,\n selectable: false,\n leafText: () => '\\n',\n group: 'inline',\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHardBreakCommands, type HardBreakCommandsExtension } from './hard-break-commands'\nimport { defineHardBreakKeymap } from './hard-break-keymap'\nimport { defineHardBreakSpec, type HardBreakSpecExtension } from './hard-break-spec'\n\n/**\n * @internal\n */\nexport type HardBreakExtension = Union<\n [HardBreakSpecExtension, HardBreakCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHardBreak(): HardBreakExtension {\n return union(\n defineHardBreakSpec(),\n defineHardBreakKeymap(),\n defineHardBreakCommands(),\n )\n}\n"],"mappings":";;;;;;AAeA,SAAgB,kBAA2B;AACzC,QAAO,WAAW,EAAE,MAAM,aAAa,CAAC;;;;;AAM1C,SAAgB,0BAAsD;AACpE,QAAO,eAAe,EACH,iBAClB,CAAC;;;;;;;;AClBJ,SAAgB,wBAAwC;AACtD,QAAO,aAAa;EAClB,aAAa,iBAAiB;EAC9B,eAAe,iBAAiB;EACjC,CAAC;;;;;;;;ACIJ,SAAgB,sBAA8C;AAC5D,QAAO,eAAe;EACpB,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;EACzB,QAAQ;AACN,UAAO,CAAC,KAAK;;EAEhB,CAAC;;;;;;;;ACVJ,SAAgB,kBAAsC;AACpD,QAAO,MACL,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,CAC1B"}
1
+ {"version":3,"file":"prosekit-extensions-hard-break.js","names":[],"sources":["../src/hard-break/hard-break-commands.ts","../src/hard-break/hard-break-keymap.ts","../src/hard-break/hard-break-spec.ts","../src/hard-break/hard-break.ts"],"sourcesContent":["import { defineCommands, insertNode, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type HardBreakCommandsExtension = Extension<{\n Commands: {\n insertHardBreak: []\n }\n}>\n\n/**\n * @internal\n */\nexport function insertHardBreak(): Command {\n return insertNode({ type: 'hardBreak' })\n}\n\n/**\n * @internal\n */\nexport function defineHardBreakCommands(): HardBreakCommandsExtension {\n return defineCommands({\n insertHardBreak: insertHardBreak,\n })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { insertHardBreak } from './hard-break-commands.ts'\n\n/**\n * @internal\n */\nexport function defineHardBreakKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Enter': insertHardBreak(),\n 'Shift-Enter': insertHardBreak(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type HardBreakSpecExtension = Extension<{\n Nodes: {\n hardBreak: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHardBreakSpec(): HardBreakSpecExtension {\n return defineNodeSpec({\n name: 'hardBreak',\n inline: true,\n selectable: false,\n leafText: () => '\\n',\n group: 'inline',\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHardBreakCommands, type HardBreakCommandsExtension } from './hard-break-commands.ts'\nimport { defineHardBreakKeymap } from './hard-break-keymap.ts'\nimport { defineHardBreakSpec, type HardBreakSpecExtension } from './hard-break-spec.ts'\n\n/**\n * @internal\n */\nexport type HardBreakExtension = Union<\n [HardBreakSpecExtension, HardBreakCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHardBreak(): HardBreakExtension {\n return union(\n defineHardBreakSpec(),\n defineHardBreakKeymap(),\n defineHardBreakCommands(),\n )\n}\n"],"mappings":";;;;;AAeA,SAAgB,kBAA2B;AACzC,QAAO,WAAW,EAAE,MAAM,aAAa,CAAC;;;;;AAM1C,SAAgB,0BAAsD;AACpE,QAAO,eAAe,EACH,iBAClB,CAAC;;;;;;;AClBJ,SAAgB,wBAAwC;AACtD,QAAO,aAAa;EAClB,aAAa,iBAAiB;EAC9B,eAAe,iBAAiB;EACjC,CAAC;;;;;;;ACIJ,SAAgB,sBAA8C;AAC5D,QAAO,eAAe;EACpB,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAChB,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;EACzB,QAAQ;AACN,UAAO,CAAC,KAAK;;EAEhB,CAAC;;;;;;;ACVJ,SAAgB,kBAAsC;AACpD,QAAO,MACL,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,CAC1B"}
@@ -21,6 +21,21 @@ type HeadingCommandsExtension = Extension<{
21
21
  */
22
22
  declare function defineHeadingCommands(): HeadingCommandsExtension;
23
23
  //#endregion
24
+ //#region src/heading/heading-input-rule.d.ts
25
+ /**
26
+ * Converts the text block to a heading when `#` is typed at the start of a new
27
+ * line followed by a space.
28
+ *
29
+ * @internal
30
+ */
31
+ declare function defineHeadingInputRule(): PlainExtension;
32
+ //#endregion
33
+ //#region src/heading/heading-keymap.d.ts
34
+ /**
35
+ * @internal
36
+ */
37
+ declare function defineHeadingKeymap(): PlainExtension;
38
+ //#endregion
24
39
  //#region src/heading/heading-spec.d.ts
25
40
  /**
26
41
  * @internal
@@ -45,20 +60,5 @@ type HeadingExtension = Union<[HeadingSpecExtension, HeadingCommandsExtension]>;
45
60
  */
46
61
  declare function defineHeading(): HeadingExtension;
47
62
  //#endregion
48
- //#region src/heading/heading-input-rule.d.ts
49
- /**
50
- * Converts the text block to a heading when `#` is typed at the start of a new
51
- * line followed by a space.
52
- *
53
- * @internal
54
- */
55
- declare function defineHeadingInputRule(): PlainExtension;
56
- //#endregion
57
- //#region src/heading/heading-keymap.d.ts
58
- /**
59
- * @internal
60
- */
61
- declare function defineHeadingKeymap(): PlainExtension;
62
- //#endregion
63
63
  export { type HeadingAttrs, type HeadingCommandsExtension, type HeadingExtension, type HeadingSpecExtension, defineHeading, defineHeadingCommands, defineHeadingInputRule, defineHeadingKeymap, defineHeadingSpec };
64
64
  //# sourceMappingURL=prosekit-extensions-heading.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-heading.d.ts","names":[],"sources":["../src/heading/heading-types.ts","../src/heading/heading-commands.ts","../src/heading/heading-spec.ts","../src/heading/heading.ts","../src/heading/heading-input-rule.ts","../src/heading/heading-keymap.ts"],"mappings":";;;UAAiB,YAAA;EACf,KAAA;AAAA;;;;AADF;;KCOY,wBAAA,GAA2B,SAAA;EACrC,QAAA;IACE,UAAA,GAAa,KAAA,GAAQ,YAAA;IACrB,aAAA,GAAgB,KAAA,GAAQ,YAAA;IACxB,aAAA,GAAgB,KAAA,GAAQ,YAAA;EAAA;AAAA;;;;iBAOZ,qBAAA,CAAA,GAAyB,wBAAA;;;;ADlBzC;;KEOY,oBAAA,GAAuB,SAAA;EACjC,KAAA;IACE,OAAA,EAAS,YAAA;EAAA;AAAA;;ADFb;;iBCSgB,iBAAA,CAAA,GAAqB,oBAAA;;;AFhBrC;;;AAAA,KGUY,gBAAA,GAAmB,KAAA,EAC5B,oBAAA,EAAsB,wBAAA;;AFJzB;;iBEUgB,aAAA,CAAA,GAAiB,gBAAA;;;;;AHjBjC;;;;iBIYgB,sBAAA,CAAA,GAA0B,cAAA;;;;;AJZ1C;iBKsBgB,mBAAA,CAAA,GAAuB,cAAA"}
1
+ {"version":3,"file":"prosekit-extensions-heading.d.ts","names":[],"sources":["../src/heading/heading-types.ts","../src/heading/heading-commands.ts","../src/heading/heading-input-rule.ts","../src/heading/heading-keymap.ts","../src/heading/heading-spec.ts","../src/heading/heading.ts"],"mappings":";;;UAAiB,YAAA;EACf,KAAA;AAAA;;;;AADF;;KCOY,wBAAA,GAA2B,SAAA;EACrC,QAAA;IACE,UAAA,GAAa,KAAA,GAAQ,YAAA;IACrB,aAAA,GAAgB,KAAA,GAAQ,YAAA;IACxB,aAAA,GAAgB,KAAA,GAAQ,YAAA;EAAA;AAAA;;;;iBAOZ,qBAAA,CAAA,GAAyB,wBAAA;;;;;ADlBzC;;;;iBEYgB,sBAAA,CAAA,GAA0B,cAAA;;;;;AFZ1C;iBGsBgB,mBAAA,CAAA,GAAuB,cAAA;;;;AHtBvC;;KIOY,oBAAA,GAAuB,SAAA;EACjC,KAAA;IACE,OAAA,EAAS,YAAA;EAAA;AAAA;;AHFb;;iBGSgB,iBAAA,CAAA,GAAqB,oBAAA;;;AJhBrC;;;AAAA,KKUY,gBAAA,GAAmB,KAAA,EAC5B,oBAAA,EAAsB,wBAAA;;AJJzB;;iBIUgB,aAAA,CAAA,GAAiB,gBAAA"}
@@ -1,6 +1,5 @@
1
1
  import { defineTextBlockInputRule } from "./prosekit-extensions-input-rule.js";
2
2
  import { defineCommands, defineKeymap, defineNodeSpec, insertNode, isAtBlockStart, setBlockType, toggleNode, union, unsetBlockType, withSkipCodeBlock } from "@prosekit/core";
3
-
4
3
  //#region src/heading/heading-commands.ts
5
4
  /**
6
5
  * @internal
@@ -27,7 +26,6 @@ function defineHeadingCommands() {
27
26
  }
28
27
  });
29
28
  }
30
-
31
29
  //#endregion
32
30
  //#region src/heading/heading-input-rule.ts
33
31
  /**
@@ -45,7 +43,6 @@ function defineHeadingInputRule() {
45
43
  }
46
44
  });
47
45
  }
48
-
49
46
  //#endregion
50
47
  //#region src/heading/heading-keymap.ts
51
48
  function toggleHeadingKeybinding(level) {
@@ -76,7 +73,6 @@ function defineHeadingKeymap() {
76
73
  "Backspace": backspaceUnsetHeading
77
74
  });
78
75
  }
79
-
80
76
  //#endregion
81
77
  //#region src/heading/heading-spec.ts
82
78
  /**
@@ -123,7 +119,6 @@ function defineHeadingSpec() {
123
119
  }
124
120
  });
125
121
  }
126
-
127
122
  //#endregion
128
123
  //#region src/heading/heading.ts
129
124
  /**
@@ -132,7 +127,7 @@ function defineHeadingSpec() {
132
127
  function defineHeading() {
133
128
  return union(defineHeadingSpec(), defineHeadingInputRule(), defineHeadingKeymap(), defineHeadingCommands());
134
129
  }
135
-
136
130
  //#endregion
137
131
  export { defineHeading, defineHeadingCommands, defineHeadingInputRule, defineHeadingKeymap, defineHeadingSpec };
132
+
138
133
  //# sourceMappingURL=prosekit-extensions-heading.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-heading.js","names":[],"sources":["../src/heading/heading-commands.ts","../src/heading/heading-input-rule.ts","../src/heading/heading-keymap.ts","../src/heading/heading-spec.ts","../src/heading/heading.ts"],"sourcesContent":["import { defineCommands, insertNode, setBlockType, toggleNode, type Extension } from '@prosekit/core'\n\nimport type { HeadingAttrs } from './heading-types'\n\n/**\n * @internal\n */\nexport type HeadingCommandsExtension = Extension<{\n Commands: {\n setHeading: [attrs?: HeadingAttrs | undefined]\n insertHeading: [attrs?: HeadingAttrs | undefined]\n toggleHeading: [attrs?: HeadingAttrs | undefined]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHeadingCommands(): HeadingCommandsExtension {\n return defineCommands({\n setHeading: (attrs?: HeadingAttrs) => {\n return setBlockType({ type: 'heading', attrs })\n },\n insertHeading: (attrs?: HeadingAttrs) => {\n return insertNode({ type: 'heading', attrs })\n },\n toggleHeading: (attrs?: HeadingAttrs) => {\n return toggleNode({ type: 'heading', attrs })\n },\n })\n}\n","import type { PlainExtension } from '@prosekit/core'\n\nimport { defineTextBlockInputRule } from '../input-rule'\n\nimport type { HeadingAttrs } from './heading-types'\n\n/**\n * Converts the text block to a heading when `#` is typed at the start of a new\n * line followed by a space.\n *\n * @internal\n */\nexport function defineHeadingInputRule(): PlainExtension {\n return defineTextBlockInputRule({\n regex: /^(#{1,6})\\s$/,\n type: 'heading',\n attrs: (match) => {\n const level: number = match[1]?.length ?? 1\n return { level } satisfies HeadingAttrs\n },\n })\n}\n","import { defineKeymap, isAtBlockStart, toggleNode, unsetBlockType, withSkipCodeBlock, type PlainExtension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nfunction toggleHeadingKeybinding(level: number): Command {\n return withSkipCodeBlock(toggleNode({ type: 'heading', attrs: { level } }))\n}\n\n/**\n * Set the block type to default (usually `paragraph`) when pressing Backspace at\n * the start of a heading block.\n */\nconst backspaceUnsetHeading: Command = (state, dispatch, view) => {\n const $pos = isAtBlockStart(state, view)\n if ($pos?.parent.type.name === 'heading') {\n return unsetBlockType()(state, dispatch, view)\n }\n return false\n}\n\n/**\n * @internal\n */\nexport function defineHeadingKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Alt-1': toggleHeadingKeybinding(1),\n 'Mod-Alt-2': toggleHeadingKeybinding(2),\n 'Mod-Alt-3': toggleHeadingKeybinding(3),\n 'Mod-Alt-4': toggleHeadingKeybinding(4),\n 'Mod-Alt-5': toggleHeadingKeybinding(5),\n 'Mod-Alt-6': toggleHeadingKeybinding(6),\n 'Backspace': backspaceUnsetHeading,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\nimport type { HeadingAttrs } from './heading-types'\n\n/**\n * @internal\n */\nexport type HeadingSpecExtension = Extension<{\n Nodes: {\n heading: HeadingAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHeadingSpec(): HeadingSpecExtension {\n return defineNodeSpec({\n name: 'heading',\n attrs: { level: { default: 1, validate: 'number' } },\n content: 'inline*',\n group: 'block',\n defining: true,\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${node.attrs.level}`, 0]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHeadingCommands, type HeadingCommandsExtension } from './heading-commands'\nimport { defineHeadingInputRule } from './heading-input-rule'\nimport { defineHeadingKeymap } from './heading-keymap'\nimport { defineHeadingSpec, type HeadingSpecExtension } from './heading-spec'\n\n/**\n * @internal\n */\nexport type HeadingExtension = Union<\n [HeadingSpecExtension, HeadingCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHeading(): HeadingExtension {\n return union(\n defineHeadingSpec(),\n defineHeadingInputRule(),\n defineHeadingKeymap(),\n defineHeadingCommands(),\n )\n}\n"],"mappings":";;;;;;;AAkBA,SAAgB,wBAAkD;AAChE,QAAO,eAAe;EACpB,aAAa,UAAyB;AACpC,UAAO,aAAa;IAAE,MAAM;IAAW;IAAO,CAAC;;EAEjD,gBAAgB,UAAyB;AACvC,UAAO,WAAW;IAAE,MAAM;IAAW;IAAO,CAAC;;EAE/C,gBAAgB,UAAyB;AACvC,UAAO,WAAW;IAAE,MAAM;IAAW;IAAO,CAAC;;EAEhD,CAAC;;;;;;;;;;;ACjBJ,SAAgB,yBAAyC;AACvD,QAAO,yBAAyB;EAC9B,OAAO;EACP,MAAM;EACN,QAAQ,UAAU;AAEhB,UAAO,EAAE,OADa,MAAM,IAAI,UAAU,GAC1B;;EAEnB,CAAC;;;;;ACjBJ,SAAS,wBAAwB,OAAwB;AACvD,QAAO,kBAAkB,WAAW;EAAE,MAAM;EAAW,OAAO,EAAE,OAAO;EAAE,CAAC,CAAC;;;;;;AAO7E,MAAM,yBAAkC,OAAO,UAAU,SAAS;AAEhE,KADa,eAAe,OAAO,KAAK,EAC9B,OAAO,KAAK,SAAS,UAC7B,QAAO,gBAAgB,CAAC,OAAO,UAAU,KAAK;AAEhD,QAAO;;;;;AAMT,SAAgB,sBAAsC;AACpD,QAAO,aAAa;EAClB,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa;EACd,CAAC;;;;;;;;ACfJ,SAAgB,oBAA0C;AACxD,QAAO,eAAe;EACpB,MAAM;EACN,OAAO,EAAE,OAAO;GAAE,SAAS;GAAG,UAAU;GAAU,EAAE;EACpD,SAAS;EACT,OAAO;EACP,UAAU;EACV,UAAU;GACR;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GACnC;EACD,MAAM,MAAM;AACV,UAAO,CAAC,IAAI,KAAK,MAAM,SAAS,EAAE;;EAErC,CAAC;;;;;;;;ACjBJ,SAAgB,gBAAkC;AAChD,QAAO,MACL,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,CACxB"}
1
+ {"version":3,"file":"prosekit-extensions-heading.js","names":[],"sources":["../src/heading/heading-commands.ts","../src/heading/heading-input-rule.ts","../src/heading/heading-keymap.ts","../src/heading/heading-spec.ts","../src/heading/heading.ts"],"sourcesContent":["import { defineCommands, insertNode, setBlockType, toggleNode, type Extension } from '@prosekit/core'\n\nimport type { HeadingAttrs } from './heading-types.ts'\n\n/**\n * @internal\n */\nexport type HeadingCommandsExtension = Extension<{\n Commands: {\n setHeading: [attrs?: HeadingAttrs | undefined]\n insertHeading: [attrs?: HeadingAttrs | undefined]\n toggleHeading: [attrs?: HeadingAttrs | undefined]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHeadingCommands(): HeadingCommandsExtension {\n return defineCommands({\n setHeading: (attrs?: HeadingAttrs) => {\n return setBlockType({ type: 'heading', attrs })\n },\n insertHeading: (attrs?: HeadingAttrs) => {\n return insertNode({ type: 'heading', attrs })\n },\n toggleHeading: (attrs?: HeadingAttrs) => {\n return toggleNode({ type: 'heading', attrs })\n },\n })\n}\n","import type { PlainExtension } from '@prosekit/core'\n\nimport { defineTextBlockInputRule } from '../input-rule/index.ts'\n\nimport type { HeadingAttrs } from './heading-types.ts'\n\n/**\n * Converts the text block to a heading when `#` is typed at the start of a new\n * line followed by a space.\n *\n * @internal\n */\nexport function defineHeadingInputRule(): PlainExtension {\n return defineTextBlockInputRule({\n regex: /^(#{1,6})\\s$/,\n type: 'heading',\n attrs: (match) => {\n const level: number = match[1]?.length ?? 1\n return { level } satisfies HeadingAttrs\n },\n })\n}\n","import { defineKeymap, isAtBlockStart, toggleNode, unsetBlockType, withSkipCodeBlock, type PlainExtension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nfunction toggleHeadingKeybinding(level: number): Command {\n return withSkipCodeBlock(toggleNode({ type: 'heading', attrs: { level } }))\n}\n\n/**\n * Set the block type to default (usually `paragraph`) when pressing Backspace at\n * the start of a heading block.\n */\nconst backspaceUnsetHeading: Command = (state, dispatch, view) => {\n const $pos = isAtBlockStart(state, view)\n if ($pos?.parent.type.name === 'heading') {\n return unsetBlockType()(state, dispatch, view)\n }\n return false\n}\n\n/**\n * @internal\n */\nexport function defineHeadingKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Alt-1': toggleHeadingKeybinding(1),\n 'Mod-Alt-2': toggleHeadingKeybinding(2),\n 'Mod-Alt-3': toggleHeadingKeybinding(3),\n 'Mod-Alt-4': toggleHeadingKeybinding(4),\n 'Mod-Alt-5': toggleHeadingKeybinding(5),\n 'Mod-Alt-6': toggleHeadingKeybinding(6),\n 'Backspace': backspaceUnsetHeading,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\nimport type { HeadingAttrs } from './heading-types.ts'\n\n/**\n * @internal\n */\nexport type HeadingSpecExtension = Extension<{\n Nodes: {\n heading: HeadingAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineHeadingSpec(): HeadingSpecExtension {\n return defineNodeSpec({\n name: 'heading',\n attrs: { level: { default: 1, validate: 'number' } },\n content: 'inline*',\n group: 'block',\n defining: true,\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${node.attrs.level}`, 0]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHeadingCommands, type HeadingCommandsExtension } from './heading-commands.ts'\nimport { defineHeadingInputRule } from './heading-input-rule.ts'\nimport { defineHeadingKeymap } from './heading-keymap.ts'\nimport { defineHeadingSpec, type HeadingSpecExtension } from './heading-spec.ts'\n\n/**\n * @internal\n */\nexport type HeadingExtension = Union<\n [HeadingSpecExtension, HeadingCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHeading(): HeadingExtension {\n return union(\n defineHeadingSpec(),\n defineHeadingInputRule(),\n defineHeadingKeymap(),\n defineHeadingCommands(),\n )\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,wBAAkD;AAChE,QAAO,eAAe;EACpB,aAAa,UAAyB;AACpC,UAAO,aAAa;IAAE,MAAM;IAAW;IAAO,CAAC;;EAEjD,gBAAgB,UAAyB;AACvC,UAAO,WAAW;IAAE,MAAM;IAAW;IAAO,CAAC;;EAE/C,gBAAgB,UAAyB;AACvC,UAAO,WAAW;IAAE,MAAM;IAAW;IAAO,CAAC;;EAEhD,CAAC;;;;;;;;;;ACjBJ,SAAgB,yBAAyC;AACvD,QAAO,yBAAyB;EAC9B,OAAO;EACP,MAAM;EACN,QAAQ,UAAU;AAEhB,UAAO,EAAE,OADa,MAAM,IAAI,UAAU,GAC1B;;EAEnB,CAAC;;;;ACjBJ,SAAS,wBAAwB,OAAwB;AACvD,QAAO,kBAAkB,WAAW;EAAE,MAAM;EAAW,OAAO,EAAE,OAAO;EAAE,CAAC,CAAC;;;;;;AAO7E,MAAM,yBAAkC,OAAO,UAAU,SAAS;AAEhE,KADa,eAAe,OAAO,KAAK,EAC9B,OAAO,KAAK,SAAS,UAC7B,QAAO,gBAAgB,CAAC,OAAO,UAAU,KAAK;AAEhD,QAAO;;;;;AAMT,SAAgB,sBAAsC;AACpD,QAAO,aAAa;EAClB,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa,wBAAwB,EAAE;EACvC,aAAa;EACd,CAAC;;;;;;;ACfJ,SAAgB,oBAA0C;AACxD,QAAO,eAAe;EACpB,MAAM;EACN,OAAO,EAAE,OAAO;GAAE,SAAS;GAAG,UAAU;GAAU,EAAE;EACpD,SAAS;EACT,OAAO;EACP,UAAU;EACV,UAAU;GACR;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GAClC;IAAE,KAAK;IAAM,OAAO,EAAE,OAAO,GAAG;IAAE;GACnC;EACD,MAAM,MAAM;AACV,UAAO,CAAC,IAAI,KAAK,MAAM,SAAS,EAAE;;EAErC,CAAC;;;;;;;ACjBJ,SAAgB,gBAAkC;AAChD,QAAO,MACL,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,CACxB"}
@@ -1,5 +1,5 @@
1
- import { Extension, PlainExtension, Union } from "@prosekit/core";
2
1
  import { Command } from "@prosekit/pm/state";
2
+ import { Extension, PlainExtension, Union } from "@prosekit/core";
3
3
  import { Attrs } from "@prosekit/pm/model";
4
4
 
5
5
  //#region src/horizontal-rule/horizontal-rule-commands.d.ts
@@ -14,6 +14,12 @@ type HorizontalRuleCommandsExtension = Extension<{
14
14
  declare function insertHorizontalRule(): Command;
15
15
  declare function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension;
16
16
  //#endregion
17
+ //#region src/horizontal-rule/horizontal-rule-input-rule.d.ts
18
+ /**
19
+ * @public
20
+ */
21
+ declare function defineHorizontalRuleInputRule(): PlainExtension;
22
+ //#endregion
17
23
  //#region src/horizontal-rule/horizontal-rule-spec.d.ts
18
24
  type HorizontalRuleSpecExtension = Extension<{
19
25
  Nodes: {
@@ -29,11 +35,5 @@ type HorizontalRuleExtension = Union<[HorizontalRuleSpecExtension, HorizontalRul
29
35
  */
30
36
  declare function defineHorizontalRule(): HorizontalRuleExtension;
31
37
  //#endregion
32
- //#region src/horizontal-rule/horizontal-rule-input-rule.d.ts
33
- /**
34
- * @public
35
- */
36
- declare function defineHorizontalRuleInputRule(): PlainExtension;
37
- //#endregion
38
38
  export { type HorizontalRuleCommandsExtension, type HorizontalRuleExtension, type HorizontalRuleSpecExtension, defineHorizontalRule, defineHorizontalRuleCommands, defineHorizontalRuleInputRule, defineHorizontalRuleSpec, insertHorizontalRule };
39
39
  //# sourceMappingURL=prosekit-extensions-horizontal-rule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-horizontal-rule.d.ts","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts"],"mappings":";;;;;KAIY,+BAAA,GAAkC,SAAA;EAC5C,QAAA;IACE,oBAAA;EAAA;AAAA;;;;iBAOY,oBAAA,CAAA,GAAwB,OAAA;AAAA,iBAcxB,4BAAA,CAAA,GAAgC,+BAAA;;;KCxBpC,2BAAA,GAA8B,SAAA;EACxC,KAAA;IACE,cAAA,EAAgB,KAAA;EAAA;AAAA;AAAA,iBAIJ,wBAAA,CAAA,GAA4B,2BAAA;;;KCHhC,uBAAA,GAA0B,KAAA,EACnC,2BAAA,EAA6B,+BAAA;;;;iBAMhB,oBAAA,CAAA,GAAwB,uBAAA;;;;;;iBCLxB,6BAAA,CAAA,GAAiC,cAAA"}
1
+ {"version":3,"file":"prosekit-extensions-horizontal-rule.d.ts","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"mappings":";;;;;KAIY,+BAAA,GAAkC,SAAA;EAC5C,QAAA;IACE,oBAAA;EAAA;AAAA;;;;iBAoBY,oBAAA,CAAA,GAAwB,OAAA;AAAA,iBAIxB,4BAAA,CAAA,GAAgC,+BAAA;;;;;;iBCtBhC,6BAAA,CAAA,GAAiC,cAAA;;;KCLrC,2BAAA,GAA8B,SAAA;EACxC,KAAA;IACE,cAAA,EAAgB,KAAA;EAAA;AAAA;AAAA,iBAIJ,wBAAA,CAAA,GAA4B,2BAAA;;;KCHhC,uBAAA,GAA0B,KAAA,EACnC,2BAAA,EAA6B,+BAAA;;;;iBAMhB,oBAAA,CAAA,GAAwB,uBAAA"}
@@ -2,26 +2,26 @@ import { defineInputRule } from "./prosekit-extensions-input-rule.js";
2
2
  import { defineCommands, defineNodeSpec, getNodeType, union } from "@prosekit/core";
3
3
  import { InputRule } from "@prosekit/pm/inputrules";
4
4
  import { Fragment, Slice } from "@prosekit/pm/model";
5
-
6
5
  //#region src/horizontal-rule/horizontal-rule-commands.ts
6
+ const insertHorizontalRuleCommand = (state, dispatch) => {
7
+ if (!dispatch) return true;
8
+ const { schema, tr } = state;
9
+ const node = getNodeType(schema, "horizontalRule").createChecked();
10
+ const pos = tr.selection.anchor;
11
+ const slice = new Slice(Fragment.from(node), 0, 0);
12
+ tr.replaceRange(pos, pos, slice).scrollIntoView();
13
+ dispatch(tr);
14
+ return true;
15
+ };
7
16
  /**
8
17
  * Returns a command that inserts a horizontal rule at the current selection.
9
18
  */
10
19
  function insertHorizontalRule() {
11
- return (state, dispatch) => {
12
- if (!dispatch) return true;
13
- const { schema, tr } = state;
14
- const node = getNodeType(schema, "horizontalRule").createChecked();
15
- const pos = tr.selection.anchor;
16
- tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0));
17
- dispatch(tr);
18
- return true;
19
- };
20
+ return insertHorizontalRuleCommand;
20
21
  }
21
22
  function defineHorizontalRuleCommands() {
22
23
  return defineCommands({ insertHorizontalRule });
23
24
  }
24
-
25
25
  //#endregion
26
26
  //#region src/horizontal-rule/horizontal-rule-input-rule.ts
27
27
  /**
@@ -36,7 +36,6 @@ function defineHorizontalRuleInputRule() {
36
36
  return tr.scrollIntoView();
37
37
  })));
38
38
  }
39
-
40
39
  //#endregion
41
40
  //#region src/horizontal-rule/horizontal-rule-spec.ts
42
41
  function defineHorizontalRuleSpec() {
@@ -51,7 +50,6 @@ function defineHorizontalRuleSpec() {
51
50
  ]
52
51
  });
53
52
  }
54
-
55
53
  //#endregion
56
54
  //#region src/horizontal-rule/horizontal-rule.ts
57
55
  /**
@@ -60,7 +58,7 @@ function defineHorizontalRuleSpec() {
60
58
  function defineHorizontalRule() {
61
59
  return union(defineHorizontalRuleSpec(), defineHorizontalRuleInputRule(), defineHorizontalRuleCommands());
62
60
  }
63
-
64
61
  //#endregion
65
62
  export { defineHorizontalRule, defineHorizontalRuleCommands, defineHorizontalRuleInputRule, defineHorizontalRuleSpec, insertHorizontalRule };
63
+
66
64
  //# sourceMappingURL=prosekit-extensions-horizontal-rule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-horizontal-rule.js","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\nexport type HorizontalRuleCommandsExtension = Extension<{\n Commands: {\n insertHorizontalRule: []\n }\n}>\n\n/**\n * Returns a command that inserts a horizontal rule at the current selection.\n */\nexport function insertHorizontalRule(): Command {\n return (state, dispatch) => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n const pos = tr.selection.anchor\n tr.replaceRange(pos, pos, new Slice(Fragment.from(node), 0, 0))\n dispatch(tr)\n return true\n }\n}\n\nexport function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension {\n return defineCommands({ insertHorizontalRule })\n}\n","import { getNodeType, union, type PlainExtension } from '@prosekit/core'\nimport { InputRule } from '@prosekit/pm/inputrules'\n\nimport { defineInputRule } from '../input-rule'\n\n/**\n * @public\n */\nexport function defineHorizontalRuleInputRule(): PlainExtension {\n return union(\n defineInputRule(\n new InputRule(/^---$/, (state, match, start, end) => {\n const { schema } = state\n const { tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n tr.delete(start, end).insert(start - 1, node)\n return tr.scrollIntoView()\n }),\n ),\n )\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\nexport type HorizontalRuleSpecExtension = Extension<{\n Nodes: {\n horizontalRule: Attrs\n }\n}>\n\nexport function defineHorizontalRuleSpec(): HorizontalRuleSpecExtension {\n return defineNodeSpec({\n name: 'horizontalRule',\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n // Wrap the `<hr>` in a `<div>` so that we can make it taller and easier to click.\n toDOM: () => ['div', { class: 'prosekit-horizontal-rule' }, ['hr']],\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHorizontalRuleCommands, type HorizontalRuleCommandsExtension } from './horizontal-rule-commands'\nimport { defineHorizontalRuleInputRule } from './horizontal-rule-input-rule'\nimport { defineHorizontalRuleSpec, type HorizontalRuleSpecExtension } from './horizontal-rule-spec'\n\nexport type HorizontalRuleExtension = Union<\n [HorizontalRuleSpecExtension, HorizontalRuleCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHorizontalRule(): HorizontalRuleExtension {\n return union(\n defineHorizontalRuleSpec(),\n defineHorizontalRuleInputRule(),\n defineHorizontalRuleCommands(),\n )\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,uBAAgC;AAC9C,SAAQ,OAAO,aAAa;AAC1B,MAAI,CAAC,SAAU,QAAO;EAEtB,MAAM,EAAE,QAAQ,OAAO;EAEvB,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;EACjC,MAAM,MAAM,GAAG,UAAU;AACzB,KAAG,aAAa,KAAK,KAAK,IAAI,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/D,WAAS,GAAG;AACZ,SAAO;;;AAIX,SAAgB,+BAAgE;AAC9E,QAAO,eAAe,EAAE,sBAAsB,CAAC;;;;;;;;ACpBjD,SAAgB,gCAAgD;AAC9D,QAAO,MACL,gBACE,IAAI,UAAU,UAAU,OAAO,OAAO,OAAO,QAAQ;EACnD,MAAM,EAAE,WAAW;EACnB,MAAM,EAAE,OAAO;EAEf,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;AACjC,KAAG,OAAO,OAAO,IAAI,CAAC,OAAO,QAAQ,GAAG,KAAK;AAC7C,SAAO,GAAG,gBAAgB;GAC1B,CACH,CACF;;;;;ACXH,SAAgB,2BAAwD;AACtE,QAAO,eAAe;EACpB,MAAM;EACN,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;EAEzB,aAAa;GAAC;GAAO,EAAE,OAAO,4BAA4B;GAAE,CAAC,KAAK;GAAC;EACpE,CAAC;;;;;;;;ACHJ,SAAgB,uBAAgD;AAC9D,QAAO,MACL,0BAA0B,EAC1B,+BAA+B,EAC/B,8BAA8B,CAC/B"}
1
+ {"version":3,"file":"prosekit-extensions-horizontal-rule.js","names":[],"sources":["../src/horizontal-rule/horizontal-rule-commands.ts","../src/horizontal-rule/horizontal-rule-input-rule.ts","../src/horizontal-rule/horizontal-rule-spec.ts","../src/horizontal-rule/horizontal-rule.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\nexport type HorizontalRuleCommandsExtension = Extension<{\n Commands: {\n insertHorizontalRule: []\n }\n}>\n\nconst insertHorizontalRuleCommand: Command = (state, dispatch): boolean => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n const pos = tr.selection.anchor\n const slice = new Slice(Fragment.from(node), 0, 0)\n tr.replaceRange(pos, pos, slice).scrollIntoView()\n dispatch(tr)\n return true\n}\n\n/**\n * Returns a command that inserts a horizontal rule at the current selection.\n */\nexport function insertHorizontalRule(): Command {\n return insertHorizontalRuleCommand\n}\n\nexport function defineHorizontalRuleCommands(): HorizontalRuleCommandsExtension {\n return defineCommands({ insertHorizontalRule })\n}\n","import { getNodeType, union, type PlainExtension } from '@prosekit/core'\nimport { InputRule } from '@prosekit/pm/inputrules'\n\nimport { defineInputRule } from '../input-rule/index.ts'\n\n/**\n * @public\n */\nexport function defineHorizontalRuleInputRule(): PlainExtension {\n return union(\n defineInputRule(\n new InputRule(/^---$/, (state, match, start, end) => {\n const { schema } = state\n const { tr } = state\n const type = getNodeType(schema, 'horizontalRule')\n const node = type.createChecked()\n tr.delete(start, end).insert(start - 1, node)\n return tr.scrollIntoView()\n }),\n ),\n )\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\nexport type HorizontalRuleSpecExtension = Extension<{\n Nodes: {\n horizontalRule: Attrs\n }\n}>\n\nexport function defineHorizontalRuleSpec(): HorizontalRuleSpecExtension {\n return defineNodeSpec({\n name: 'horizontalRule',\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n // Wrap the `<hr>` in a `<div>` so that we can make it taller and easier to click.\n toDOM: () => ['div', { class: 'prosekit-horizontal-rule' }, ['hr']],\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineHorizontalRuleCommands, type HorizontalRuleCommandsExtension } from './horizontal-rule-commands.ts'\nimport { defineHorizontalRuleInputRule } from './horizontal-rule-input-rule.ts'\nimport { defineHorizontalRuleSpec, type HorizontalRuleSpecExtension } from './horizontal-rule-spec.ts'\n\nexport type HorizontalRuleExtension = Union<\n [HorizontalRuleSpecExtension, HorizontalRuleCommandsExtension]\n>\n\n/**\n * @public\n */\nexport function defineHorizontalRule(): HorizontalRuleExtension {\n return union(\n defineHorizontalRuleSpec(),\n defineHorizontalRuleInputRule(),\n defineHorizontalRuleCommands(),\n )\n}\n"],"mappings":";;;;;AAUA,MAAM,+BAAwC,OAAO,aAAsB;AACzE,KAAI,CAAC,SAAU,QAAO;CAEtB,MAAM,EAAE,QAAQ,OAAO;CAEvB,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;CACjC,MAAM,MAAM,GAAG,UAAU;CACzB,MAAM,QAAQ,IAAI,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,EAAE;AAClD,IAAG,aAAa,KAAK,KAAK,MAAM,CAAC,gBAAgB;AACjD,UAAS,GAAG;AACZ,QAAO;;;;;AAMT,SAAgB,uBAAgC;AAC9C,QAAO;;AAGT,SAAgB,+BAAgE;AAC9E,QAAO,eAAe,EAAE,sBAAsB,CAAC;;;;;;;ACvBjD,SAAgB,gCAAgD;AAC9D,QAAO,MACL,gBACE,IAAI,UAAU,UAAU,OAAO,OAAO,OAAO,QAAQ;EACnD,MAAM,EAAE,WAAW;EACnB,MAAM,EAAE,OAAO;EAEf,MAAM,OADO,YAAY,QAAQ,iBAAiB,CAChC,eAAe;AACjC,KAAG,OAAO,OAAO,IAAI,CAAC,OAAO,QAAQ,GAAG,KAAK;AAC7C,SAAO,GAAG,gBAAgB;GAC1B,CACH,CACF;;;;ACXH,SAAgB,2BAAwD;AACtE,QAAO,eAAe;EACpB,MAAM;EACN,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,MAAM,CAAC;EAEzB,aAAa;GAAC;GAAO,EAAE,OAAO,4BAA4B;GAAE,CAAC,KAAK;GAAC;EACpE,CAAC;;;;;;;ACHJ,SAAgB,uBAAgD;AAC9D,QAAO,MACL,0BAA0B,EAC1B,+BAA+B,EAC/B,8BAA8B,CAC/B"}
@@ -1,7 +1,6 @@
1
- import { l as FileDropHandlerOptions, n as UploadTask, o as FilePasteHandlerOptions, r as Uploader } from "./file-upload-dr3IXUty.js";
2
- import "./prosekit-extensions-file.js";
3
- import { Extension, PlainExtension, Union } from "@prosekit/core";
1
+ import { l as FileDropHandlerOptions, n as UploadTask, o as FilePasteHandlerOptions, r as Uploader } from "./index.js";
4
2
  import { Command } from "@prosekit/pm/state";
3
+ import { Extension, PlainExtension, Union } from "@prosekit/core";
5
4
  import { EditorView } from "@prosekit/pm/view";
6
5
 
7
6
  //#region src/image/image-commands/upload-image.d.ts
@@ -121,16 +120,6 @@ type ImageCommandsExtension = Extension<{
121
120
  */
122
121
  declare function defineImageCommands(): ImageCommandsExtension;
123
122
  //#endregion
124
- //#region src/image/image.d.ts
125
- /**
126
- * @internal
127
- */
128
- type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>;
129
- /**
130
- * @public
131
- */
132
- declare function defineImage(): ImageExtension;
133
- //#endregion
134
123
  //#region src/image/image-commands/insert-image.d.ts
135
124
  /**
136
125
  * Returns a command that inserts an image node with the given attributes at the
@@ -187,5 +176,15 @@ declare function defineImageUploadHandler({
187
176
  onError
188
177
  }: ImageUploadHandlerOptions): PlainExtension;
189
178
  //#endregion
179
+ //#region src/image/image.d.ts
180
+ /**
181
+ * @internal
182
+ */
183
+ type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>;
184
+ /**
185
+ * @public
186
+ */
187
+ declare function defineImage(): ImageExtension;
188
+ //#endregion
190
189
  export { type ImageAttrs, type ImageCanDropPredicate, type ImageCanPastePredicate, type ImageCommandsExtension, type ImageExtension, type ImageSpecExtension, type ImageUploadErrorHandler, type ImageUploadErrorHandlerOptions, type ImageUploadHandlerOptions, type UploadImageOptions, defineImage, defineImageCommands, defineImageSpec, defineImageUploadHandler, insertImage, replaceImageURL, uploadImage };
191
190
  //# sourceMappingURL=prosekit-extensions-image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-image.d.ts","names":[],"sources":["../src/image/image-commands/upload-image.ts","../src/image/image-spec.ts","../src/image/image-commands.ts","../src/image/image.ts","../src/image/image-commands/insert-image.ts","../src/image/image-upload-handler.ts"],"mappings":";;;;;;;;;;;AAYA;UAAiB,kBAAA;;;;;EAKf,QAAA,EAAU,QAAA;EAoBuB;;;EAhBjC,IAAA,EAAM,IAAA;EAAA;;;;EAKN,GAAA;EAWiC;;AAQnC;;;;EAZE,OAAA;EAgBM;;;EAZN,OAAA,GAAU,uBAAA;AAAA;;AA4BZ;;;;UApBiB,8BAAA;EA8BD;;;EA1Bd,IAAA,EAAM,IAAA;EA4BN;;;EAxBA,KAAA;EA4BC;;;EAxBD,UAAA,EAAY,UAAA;AAAA;;;;;;KAQF,uBAAA,IAA2B,OAAA,EAAS,8BAAA;;;;;;;;AAkFhD;iBAxEgB,WAAA,CAAA;EACd,QAAA;EACA,IAAA;EACA,GAAA;EACA,OAAA;EACA;AAAA,GACC,kBAAA,GAAqB,OAAA;;;;;;iBAkER,eAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,UACA,MAAA;;;;;;UCjJe,UAAA;EACf,GAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;KAMU,kBAAA,GAAqB,SAAA;EAC/B,KAAA;IACE,KAAA,EAAO,UAAA;EAAA;AAAA;;;;iBAOK,eAAA,CAAA,GAAmB,kBAAA;;;;;;KCdvB,sBAAA,GAAyB,SAAA;EACnC,QAAA;IACE,WAAA,GAAc,KAAA,GAAQ,UAAA;IACtB,WAAA,GAAc,OAAA,EAAS,kBAAA;EAAA;AAAA;;;;iBAOX,mBAAA,CAAA,GAAuB,sBAAA;;;;;;KCX3B,cAAA,GAAiB,KAAA,EAAO,kBAAA,EAAoB,sBAAA;AHIxD;;;AAAA,iBGCgB,WAAA,CAAA,GAAe,cAAA;;;;;;;;AHD/B;iBIDgB,WAAA,CAAY,KAAA,GAAQ,UAAA,GAAa,OAAA;;;;;;KCMrC,sBAAA,IAA0B,OAAA,EAAS,uBAAA;ALL/C;;;AAAA,KKUY,qBAAA,IAAyB,OAAA,EAAS,sBAAA;;;;UAK7B,yBAAA;ELVf;;;;EKeA,QAAA,EAAU,QAAA;ELCV;;;;EKIA,QAAA,GAAW,sBAAA;ELQI;;;;EKHf,OAAA,GAAU,qBAAA;ELOJ;;;;EKFN,OAAA,GAAU,uBAAA;AAAA;ALkBZ;;;;;AAUA;AAVA,iBKAgB,wBAAA,CAAA;EACd,QAAA;EACA,QAAA;EACA,OAAA;EACA;AAAA,GACC,yBAAA,GAA4B,cAAA"}
1
+ {"version":3,"file":"prosekit-extensions-image.d.ts","names":[],"sources":["../src/image/image-commands/upload-image.ts","../src/image/image-spec.ts","../src/image/image-commands.ts","../src/image/image-commands/insert-image.ts","../src/image/image-upload-handler.ts","../src/image/image.ts"],"mappings":";;;;;;;;;AAYA;;UAAiB,kBAAA;EAKL;;;;EAAV,QAAA,EAAU,QAAA;EAAV;;;EAIA,IAAA,EAAM,IAAA;EAKN;;;;EAAA,GAAA;EAWiC;AAQnC;;;;;EAZE,OAAA;EAoBA;;;EAhBA,OAAA,GAAU,uBAAA;AAAA;AA4BZ;;;;;AAAA,UApBiB,8BAAA;EA8BU;;;EA1BzB,IAAA,EAAM,IAAA;EA6BN;;;EAzBA,KAAA;EA4BsB;;;EAxBtB,UAAA,EAAY,UAAA;AAAA;;;;;;KAQF,uBAAA,IAA2B,OAAA,EAAS,8BAAA;;;;;;;AAkFhD;;iBAxEgB,WAAA,CAAA;EACd,QAAA;EACA,IAAA;EACA,GAAA;EACA,OAAA;EACA;AAAA,GACC,kBAAA,GAAqB,OAAA;;;;;;iBAkER,eAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,UACA,MAAA;;;;;;UCjJe,UAAA;EACf,GAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;KAMU,kBAAA,GAAqB,SAAA;EAC/B,KAAA;IACE,KAAA,EAAO,UAAA;EAAA;AAAA;;;;iBAOK,eAAA,CAAA,GAAmB,kBAAA;;;;;;KCdvB,sBAAA,GAAyB,SAAA;EACnC,QAAA;IACE,WAAA,GAAc,KAAA,GAAQ,UAAA;IACtB,WAAA,GAAc,OAAA,EAAS,kBAAA;EAAA;AAAA;;;;iBAOX,mBAAA,CAAA,GAAuB,sBAAA;;;;;;;AFPvC;;iBGDgB,WAAA,CAAY,KAAA,GAAQ,UAAA,GAAa,OAAA;;;;;;KCMrC,sBAAA,IAA0B,OAAA,EAAS,uBAAA;;;;KAKnC,qBAAA,IAAyB,OAAA,EAAS,sBAAA;;;;UAK7B,yBAAA;EJVL;;;;EIeV,QAAA,EAAU,QAAA;EJKV;;;;EIAA,QAAA,GAAW,sBAAA;EJQkC;;;;EIH7C,OAAA,GAAU,qBAAA;EJWV;;;;EINA,OAAA,GAAU,uBAAA;AAAA;;;;;AJ4BZ;;iBIVgB,wBAAA,CAAA;EACd,QAAA;EACA,QAAA;EACA,OAAA;EACA;AAAA,GACC,yBAAA,GAA4B,cAAA;;;;;;KC9DnB,cAAA,GAAiB,KAAA,EAAO,kBAAA,EAAoB,sBAAA;;;;iBAKxC,WAAA,CAAA,GAAe,cAAA"}
@@ -1,6 +1,5 @@
1
- import { n as defineFilePasteHandler, r as defineFileDropHandler, t as UploadTask } from "./file-upload-I9m1EJAM.js";
1
+ import { n as defineFilePasteHandler, r as defineFileDropHandler, t as UploadTask } from "./file.js";
2
2
  import { ProseKitError, defineCommands, defineNodeSpec, insertNode, union } from "@prosekit/core";
3
-
4
3
  //#region src/image/image-commands/insert-image.ts
5
4
  /**
6
5
  * Returns a command that inserts an image node with the given attributes at the
@@ -14,7 +13,6 @@ function insertImage(attrs) {
14
13
  attrs
15
14
  });
16
15
  }
17
-
18
16
  //#endregion
19
17
  //#region src/image/image-commands/upload-image.ts
20
18
  /**
@@ -97,7 +95,6 @@ function replaceImageURL(view, oldURL, newURL) {
97
95
  for (const pos of positions) tr.setNodeAttribute(pos, "src", newURL);
98
96
  view.dispatch(tr);
99
97
  }
100
-
101
98
  //#endregion
102
99
  //#region src/image/image-commands.ts
103
100
  /**
@@ -109,7 +106,6 @@ function defineImageCommands() {
109
106
  uploadImage
110
107
  });
111
108
  }
112
-
113
109
  //#endregion
114
110
  //#region src/image/image-spec.ts
115
111
  /**
@@ -162,16 +158,6 @@ function defineImageSpec() {
162
158
  }
163
159
  });
164
160
  }
165
-
166
- //#endregion
167
- //#region src/image/image.ts
168
- /**
169
- * @public
170
- */
171
- function defineImage() {
172
- return union(defineImageSpec(), defineImageCommands());
173
- }
174
-
175
161
  //#endregion
176
162
  //#region src/image/image-upload-handler.ts
177
163
  function defaultCanUpload({ file }) {
@@ -208,7 +194,15 @@ function defineImageUploadHandler({ uploader, canPaste = defaultCanUpload, canDr
208
194
  };
209
195
  return union(defineFilePasteHandler(handlePaste), defineFileDropHandler(handleDrop));
210
196
  }
211
-
197
+ //#endregion
198
+ //#region src/image/image.ts
199
+ /**
200
+ * @public
201
+ */
202
+ function defineImage() {
203
+ return union(defineImageSpec(), defineImageCommands());
204
+ }
212
205
  //#endregion
213
206
  export { defineImage, defineImageCommands, defineImageSpec, defineImageUploadHandler, insertImage, replaceImageURL, uploadImage };
207
+
214
208
  //# sourceMappingURL=prosekit-extensions-image.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-image.js","names":[],"sources":["../src/image/image-commands/insert-image.ts","../src/image/image-commands/upload-image.ts","../src/image/image-commands.ts","../src/image/image-spec.ts","../src/image/image.ts","../src/image/image-upload-handler.ts"],"sourcesContent":["import { insertNode } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nimport type { ImageAttrs } from '../image-spec'\n\n/**\n * Returns a command that inserts an image node with the given attributes at the\n * current selection position.\n *\n * @public\n */\nexport function insertImage(attrs?: ImageAttrs): Command {\n return insertNode({ type: 'image', attrs })\n}\n","import { insertNode, ProseKitError } from '@prosekit/core'\nimport type { Command, EditorState, Transaction } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { UploadTask, type Uploader } from '../../file'\nimport type { ImageAttrs } from '../image-spec'\n\n/**\n * Options for {@link uploadImage}.\n *\n * @public\n */\nexport interface UploadImageOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * The file that will be uploaded.\n */\n file: File\n /**\n * The position where the image should be inserted. If not provided, the\n * image is inserted at the current selection.\n */\n pos?: number\n /**\n * If the image should replace the existing image at the given position. This\n * is only used if `pos` is provided.\n *\n * @default false\n */\n replace?: boolean\n /**\n * A handler to be called when an error occurs during the upload.\n */\n onError?: ImageUploadErrorHandler\n}\n\n/**\n * Options for the {@link ImageUploadErrorHandler} callback.\n *\n * @public\n */\nexport interface ImageUploadErrorHandlerOptions {\n /**\n * The file that was uploaded.\n */\n file: File\n /**\n * The error that occurred during the upload.\n */\n error: unknown\n /**\n * The upload task that was used to upload the file.\n */\n uploadTask: UploadTask<string>\n}\n\n/**\n * A handler to be called when an error occurs during the upload.\n *\n * @public\n */\nexport type ImageUploadErrorHandler = (options: ImageUploadErrorHandlerOptions) => void\n\n/**\n * Returns a command that uploads an image file and inserts an image node with a\n * temporary URL which is replaced once the upload completes.\n *\n * @param options\n *\n * @public\n */\nexport function uploadImage({\n uploader,\n file,\n pos,\n replace = false,\n onError,\n}: UploadImageOptions): Command {\n return (state, dispatch, view) => {\n const uploadTask = new UploadTask({ file, uploader })\n const objectURL = uploadTask.objectURL\n\n uploadTask.finished\n .then((resultURL) => {\n if (view && view.isDestroyed) {\n return\n } else if (typeof resultURL !== 'string') {\n const error = new ProseKitError(\n `Unexpected upload result. Expected a string but got ${typeof resultURL}`,\n )\n onError?.({ file, error, uploadTask })\n } else if (!view) {\n const error = new ProseKitError(\n 'View must be available to replace the image URL',\n )\n onError?.({ file, error, uploadTask })\n } else {\n replaceImageURL(view, objectURL, resultURL)\n UploadTask.delete(objectURL)\n }\n })\n .catch((error) => {\n onError?.({ file, error, uploadTask })\n })\n\n if (replace && pos != null) {\n if (replaceExistingImageURL(state, pos, objectURL, dispatch)) {\n return true\n }\n }\n\n const attrs: ImageAttrs = { src: objectURL }\n return insertNode({ type: 'image', attrs, pos })(state, dispatch, view)\n }\n}\n\nfunction replaceExistingImageURL(\n state: EditorState,\n pos: number,\n imageURL: string,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const node = state.doc.nodeAt(pos)\n if (!node || node.type.name !== 'image') {\n return false\n }\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === imageURL) {\n return true\n }\n if (dispatch) {\n const tr = state.tr\n tr.setNodeAttribute(pos, 'src', imageURL)\n dispatch(tr)\n }\n return true\n}\n\n/**\n * Replaces the temporary image URL with the final uploaded URL.\n *\n * @internal\n */\nexport function replaceImageURL(\n view: EditorView,\n oldURL: string,\n newURL: string,\n): void {\n const positions: number[] = []\n view.state.doc.descendants((node, pos) => {\n if (node.type.name === 'image') {\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === oldURL) {\n positions.push(pos)\n }\n }\n })\n\n if (positions.length === 0) {\n return\n }\n\n const tr = view.state.tr\n for (const pos of positions) {\n tr.setNodeAttribute(pos, 'src', newURL)\n }\n view.dispatch(tr)\n}\n","import { defineCommands, type Extension } from '@prosekit/core'\n\nimport { insertImage } from './image-commands/insert-image'\nimport { uploadImage, type UploadImageOptions } from './image-commands/upload-image'\nimport type { ImageAttrs } from './image-spec'\n\n/**\n * @internal\n */\nexport type ImageCommandsExtension = Extension<{\n Commands: {\n insertImage: [attrs?: ImageAttrs]\n uploadImage: [options: UploadImageOptions]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageCommands(): ImageCommandsExtension {\n return defineCommands({\n insertImage,\n uploadImage,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\n/**\n * @public\n */\nexport interface ImageAttrs {\n src?: string | null\n width?: number | null\n height?: number | null\n}\n\n/**\n * @internal\n */\nexport type ImageSpecExtension = Extension<{\n Nodes: {\n image: ImageAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageSpec(): ImageSpecExtension {\n return defineNodeSpec({\n name: 'image',\n attrs: {\n src: { default: null, validate: 'string|null' },\n width: { default: null, validate: 'number|null' },\n height: { default: null, validate: 'number|null' },\n },\n group: 'block',\n defining: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (element): ImageAttrs => {\n if (typeof element === 'string') {\n return { src: null }\n }\n\n const src = element.getAttribute('src') || null\n\n let width: number | null = null\n let height: number | null = null\n\n const rect = element.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) {\n width = rect.width\n height = rect.height\n } else if (\n element instanceof HTMLImageElement\n && element.naturalWidth > 0\n && element.naturalHeight > 0\n ) {\n width = element.naturalWidth\n height = element.naturalHeight\n }\n return { src, width, height }\n },\n },\n ],\n toDOM(node) {\n const attrs = node.attrs as ImageAttrs\n return ['img', attrs]\n },\n })\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineImageCommands, type ImageCommandsExtension } from './image-commands'\nimport { defineImageSpec, type ImageSpecExtension } from './image-spec'\n\n/**\n * @internal\n */\nexport type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineImage(): ImageExtension {\n return union(defineImageSpec(), defineImageCommands())\n}\n","import { union, type PlainExtension } from '@prosekit/core'\n\nimport {\n defineFileDropHandler,\n defineFilePasteHandler,\n type FileDropHandler,\n type FileDropHandlerOptions,\n type FilePasteHandler,\n type FilePasteHandlerOptions,\n type Uploader,\n} from '../file'\n\nimport { uploadImage, type ImageUploadErrorHandler } from './image-commands/upload-image'\n\n/**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n */\nexport type ImageCanPastePredicate = (options: FilePasteHandlerOptions) => boolean\n\n/**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n */\nexport type ImageCanDropPredicate = (options: FileDropHandlerOptions) => boolean\n\n/**\n * A handler to be called when an error occurs during the upload.\n */\nexport interface ImageUploadHandlerOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing paste of files with a content type starting with `image/`.\n */\n canPaste?: ImageCanPastePredicate\n /**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing drop of files with a content type starting with `image/`.\n */\n canDrop?: ImageCanDropPredicate\n /**\n * A handler to be called when an error occurs during the upload.\n * If not provided, it defaults to logging the error to the console.\n */\n onError?: ImageUploadErrorHandler\n}\n\nfunction defaultCanUpload({ file }: { file: File }): boolean {\n // Only handle image files by default\n return file.type.startsWith('image/')\n}\n\nconst defaultOnError: ImageUploadErrorHandler = ({ error }) => {\n console.error('[prosekit] Failed to upload image:', error)\n}\n\n/**\n * Returns an extension that handles image file uploads when pasting or dropping\n * images into the editor.\n *\n * @param options\n */\nexport function defineImageUploadHandler({\n uploader,\n canPaste = defaultCanUpload,\n canDrop = defaultCanUpload,\n onError = defaultOnError,\n}: ImageUploadHandlerOptions): PlainExtension {\n const handlePaste: FilePasteHandler = (options) => {\n if (!canPaste(options)) return false\n const { view, file } = options\n const command = uploadImage({ uploader, file, onError })\n return command(view.state, view.dispatch, view)\n }\n\n const handleDrop: FileDropHandler = (options) => {\n if (!canDrop(options)) return false\n const { view, file, pos } = options\n const command = uploadImage({ uploader, file, onError, pos })\n return command(view.state, view.dispatch, view)\n }\n\n return union(\n defineFilePasteHandler(handlePaste),\n defineFileDropHandler(handleDrop),\n )\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,YAAY,OAA6B;AACvD,QAAO,WAAW;EAAE,MAAM;EAAS;EAAO,CAAC;;;;;;;;;;;;;AC+D7C,SAAgB,YAAY,EAC1B,UACA,MACA,KACA,UAAU,OACV,WAC8B;AAC9B,SAAQ,OAAO,UAAU,SAAS;EAChC,MAAM,aAAa,IAAI,WAAW;GAAE;GAAM;GAAU,CAAC;EACrD,MAAM,YAAY,WAAW;AAE7B,aAAW,SACR,MAAM,cAAc;AACnB,OAAI,QAAQ,KAAK,YACf;YACS,OAAO,cAAc,UAAU;IACxC,MAAM,QAAQ,IAAI,cAChB,uDAAuD,OAAO,YAC/D;AACD,cAAU;KAAE;KAAM;KAAO;KAAY,CAAC;cAC7B,CAAC,MAAM;IAChB,MAAM,QAAQ,IAAI,cAChB,kDACD;AACD,cAAU;KAAE;KAAM;KAAO;KAAY,CAAC;UACjC;AACL,oBAAgB,MAAM,WAAW,UAAU;AAC3C,eAAW,OAAO,UAAU;;IAE9B,CACD,OAAO,UAAU;AAChB,aAAU;IAAE;IAAM;IAAO;IAAY,CAAC;IACtC;AAEJ,MAAI,WAAW,OAAO,MACpB;OAAI,wBAAwB,OAAO,KAAK,WAAW,SAAS,CAC1D,QAAO;;AAKX,SAAO,WAAW;GAAE,MAAM;GAAS,OADT,EAAE,KAAK,WAAW;GACF;GAAK,CAAC,CAAC,OAAO,UAAU,KAAK;;;AAI3E,SAAS,wBACP,OACA,KACA,UACA,UACS;CACT,MAAM,OAAO,MAAM,IAAI,OAAO,IAAI;AAClC,KAAI,CAAC,QAAQ,KAAK,KAAK,SAAS,QAC9B,QAAO;AAGT,KADc,KAAK,MACT,QAAQ,SAChB,QAAO;AAET,KAAI,UAAU;EACZ,MAAM,KAAK,MAAM;AACjB,KAAG,iBAAiB,KAAK,OAAO,SAAS;AACzC,WAAS,GAAG;;AAEd,QAAO;;;;;;;AAQT,SAAgB,gBACd,MACA,QACA,QACM;CACN,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,IAAI,aAAa,MAAM,QAAQ;AACxC,MAAI,KAAK,KAAK,SAAS,SAErB;OADc,KAAK,MACT,QAAQ,OAChB,WAAU,KAAK,IAAI;;GAGvB;AAEF,KAAI,UAAU,WAAW,EACvB;CAGF,MAAM,KAAK,KAAK,MAAM;AACtB,MAAK,MAAM,OAAO,UAChB,IAAG,iBAAiB,KAAK,OAAO,OAAO;AAEzC,MAAK,SAAS,GAAG;;;;;;;;ACvJnB,SAAgB,sBAA8C;AAC5D,QAAO,eAAe;EACpB;EACA;EACD,CAAC;;;;;;;;ACAJ,SAAgB,kBAAsC;AACpD,QAAO,eAAe;EACpB,MAAM;EACN,OAAO;GACL,KAAK;IAAE,SAAS;IAAM,UAAU;IAAe;GAC/C,OAAO;IAAE,SAAS;IAAM,UAAU;IAAe;GACjD,QAAQ;IAAE,SAAS;IAAM,UAAU;IAAe;GACnD;EACD,OAAO;EACP,UAAU;EACV,WAAW;EACX,UAAU,CACR;GACE,KAAK;GACL,WAAW,YAAwB;AACjC,QAAI,OAAO,YAAY,SACrB,QAAO,EAAE,KAAK,MAAM;IAGtB,MAAM,MAAM,QAAQ,aAAa,MAAM,IAAI;IAE3C,IAAI,QAAuB;IAC3B,IAAI,SAAwB;IAE5B,MAAM,OAAO,QAAQ,uBAAuB;AAC5C,QAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,aAAQ,KAAK;AACb,cAAS,KAAK;eAEd,mBAAmB,oBAChB,QAAQ,eAAe,KACvB,QAAQ,gBAAgB,GAC3B;AACA,aAAQ,QAAQ;AAChB,cAAS,QAAQ;;AAEnB,WAAO;KAAE;KAAK;KAAO;KAAQ;;GAEhC,CACF;EACD,MAAM,MAAM;AAEV,UAAO,CAAC,OADM,KAAK,MACE;;EAExB,CAAC;;;;;;;;ACtDJ,SAAgB,cAA8B;AAC5C,QAAO,MAAM,iBAAiB,EAAE,qBAAqB,CAAC;;;;;ACoCxD,SAAS,iBAAiB,EAAE,QAAiC;AAE3D,QAAO,KAAK,KAAK,WAAW,SAAS;;AAGvC,MAAM,kBAA2C,EAAE,YAAY;AAC7D,SAAQ,MAAM,sCAAsC,MAAM;;;;;;;;AAS5D,SAAgB,yBAAyB,EACvC,UACA,WAAW,kBACX,UAAU,kBACV,UAAU,kBACkC;CAC5C,MAAM,eAAiC,YAAY;AACjD,MAAI,CAAC,SAAS,QAAQ,CAAE,QAAO;EAC/B,MAAM,EAAE,MAAM,SAAS;AAEvB,SADgB,YAAY;GAAE;GAAU;GAAM;GAAS,CAAC,CACzC,KAAK,OAAO,KAAK,UAAU,KAAK;;CAGjD,MAAM,cAA+B,YAAY;AAC/C,MAAI,CAAC,QAAQ,QAAQ,CAAE,QAAO;EAC9B,MAAM,EAAE,MAAM,MAAM,QAAQ;AAE5B,SADgB,YAAY;GAAE;GAAU;GAAM;GAAS;GAAK,CAAC,CAC9C,KAAK,OAAO,KAAK,UAAU,KAAK;;AAGjD,QAAO,MACL,uBAAuB,YAAY,EACnC,sBAAsB,WAAW,CAClC"}
1
+ {"version":3,"file":"prosekit-extensions-image.js","names":[],"sources":["../src/image/image-commands/insert-image.ts","../src/image/image-commands/upload-image.ts","../src/image/image-commands.ts","../src/image/image-spec.ts","../src/image/image-upload-handler.ts","../src/image/image.ts"],"sourcesContent":["import { insertNode } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\nimport type { ImageAttrs } from '../image-spec.ts'\n\n/**\n * Returns a command that inserts an image node with the given attributes at the\n * current selection position.\n *\n * @public\n */\nexport function insertImage(attrs?: ImageAttrs): Command {\n return insertNode({ type: 'image', attrs })\n}\n","import { insertNode, ProseKitError } from '@prosekit/core'\nimport type { Command, EditorState, Transaction } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { UploadTask, type Uploader } from '../../file/index.ts'\nimport type { ImageAttrs } from '../image-spec.ts'\n\n/**\n * Options for {@link uploadImage}.\n *\n * @public\n */\nexport interface UploadImageOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * The file that will be uploaded.\n */\n file: File\n /**\n * The position where the image should be inserted. If not provided, the\n * image is inserted at the current selection.\n */\n pos?: number\n /**\n * If the image should replace the existing image at the given position. This\n * is only used if `pos` is provided.\n *\n * @default false\n */\n replace?: boolean\n /**\n * A handler to be called when an error occurs during the upload.\n */\n onError?: ImageUploadErrorHandler\n}\n\n/**\n * Options for the {@link ImageUploadErrorHandler} callback.\n *\n * @public\n */\nexport interface ImageUploadErrorHandlerOptions {\n /**\n * The file that was uploaded.\n */\n file: File\n /**\n * The error that occurred during the upload.\n */\n error: unknown\n /**\n * The upload task that was used to upload the file.\n */\n uploadTask: UploadTask<string>\n}\n\n/**\n * A handler to be called when an error occurs during the upload.\n *\n * @public\n */\nexport type ImageUploadErrorHandler = (options: ImageUploadErrorHandlerOptions) => void\n\n/**\n * Returns a command that uploads an image file and inserts an image node with a\n * temporary URL which is replaced once the upload completes.\n *\n * @param options\n *\n * @public\n */\nexport function uploadImage({\n uploader,\n file,\n pos,\n replace = false,\n onError,\n}: UploadImageOptions): Command {\n return (state, dispatch, view) => {\n const uploadTask = new UploadTask({ file, uploader })\n const objectURL = uploadTask.objectURL\n\n uploadTask.finished\n .then((resultURL) => {\n if (view && view.isDestroyed) {\n return\n } else if (typeof resultURL !== 'string') {\n const error = new ProseKitError(\n `Unexpected upload result. Expected a string but got ${typeof resultURL}`,\n )\n onError?.({ file, error, uploadTask })\n } else if (!view) {\n const error = new ProseKitError(\n 'View must be available to replace the image URL',\n )\n onError?.({ file, error, uploadTask })\n } else {\n replaceImageURL(view, objectURL, resultURL)\n UploadTask.delete(objectURL)\n }\n })\n .catch((error) => {\n onError?.({ file, error, uploadTask })\n })\n\n if (replace && pos != null) {\n if (replaceExistingImageURL(state, pos, objectURL, dispatch)) {\n return true\n }\n }\n\n const attrs: ImageAttrs = { src: objectURL }\n return insertNode({ type: 'image', attrs, pos })(state, dispatch, view)\n }\n}\n\nfunction replaceExistingImageURL(\n state: EditorState,\n pos: number,\n imageURL: string,\n dispatch?: (tr: Transaction) => void,\n): boolean {\n const node = state.doc.nodeAt(pos)\n if (!node || node.type.name !== 'image') {\n return false\n }\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === imageURL) {\n return true\n }\n if (dispatch) {\n const tr = state.tr\n tr.setNodeAttribute(pos, 'src', imageURL)\n dispatch(tr)\n }\n return true\n}\n\n/**\n * Replaces the temporary image URL with the final uploaded URL.\n *\n * @internal\n */\nexport function replaceImageURL(\n view: EditorView,\n oldURL: string,\n newURL: string,\n): void {\n const positions: number[] = []\n view.state.doc.descendants((node, pos) => {\n if (node.type.name === 'image') {\n const attrs = node.attrs as ImageAttrs\n if (attrs.src === oldURL) {\n positions.push(pos)\n }\n }\n })\n\n if (positions.length === 0) {\n return\n }\n\n const tr = view.state.tr\n for (const pos of positions) {\n tr.setNodeAttribute(pos, 'src', newURL)\n }\n view.dispatch(tr)\n}\n","import { defineCommands, type Extension } from '@prosekit/core'\n\nimport { insertImage } from './image-commands/insert-image.ts'\nimport { uploadImage, type UploadImageOptions } from './image-commands/upload-image.ts'\nimport type { ImageAttrs } from './image-spec.ts'\n\n/**\n * @internal\n */\nexport type ImageCommandsExtension = Extension<{\n Commands: {\n insertImage: [attrs?: ImageAttrs]\n uploadImage: [options: UploadImageOptions]\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageCommands(): ImageCommandsExtension {\n return defineCommands({\n insertImage,\n uploadImage,\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\n\n/**\n * @public\n */\nexport interface ImageAttrs {\n src?: string | null\n width?: number | null\n height?: number | null\n}\n\n/**\n * @internal\n */\nexport type ImageSpecExtension = Extension<{\n Nodes: {\n image: ImageAttrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineImageSpec(): ImageSpecExtension {\n return defineNodeSpec({\n name: 'image',\n attrs: {\n src: { default: null, validate: 'string|null' },\n width: { default: null, validate: 'number|null' },\n height: { default: null, validate: 'number|null' },\n },\n group: 'block',\n defining: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs: (element): ImageAttrs => {\n if (typeof element === 'string') {\n return { src: null }\n }\n\n const src = element.getAttribute('src') || null\n\n let width: number | null = null\n let height: number | null = null\n\n const rect = element.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) {\n width = rect.width\n height = rect.height\n } else if (\n element instanceof HTMLImageElement\n && element.naturalWidth > 0\n && element.naturalHeight > 0\n ) {\n width = element.naturalWidth\n height = element.naturalHeight\n }\n return { src, width, height }\n },\n },\n ],\n toDOM(node) {\n const attrs = node.attrs as ImageAttrs\n return ['img', attrs]\n },\n })\n}\n","import { union, type PlainExtension } from '@prosekit/core'\n\nimport {\n defineFileDropHandler,\n defineFilePasteHandler,\n type FileDropHandler,\n type FileDropHandlerOptions,\n type FilePasteHandler,\n type FilePasteHandlerOptions,\n type Uploader,\n} from '../file/index.ts'\n\nimport { uploadImage, type ImageUploadErrorHandler } from './image-commands/upload-image.ts'\n\n/**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n */\nexport type ImageCanPastePredicate = (options: FilePasteHandlerOptions) => boolean\n\n/**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n */\nexport type ImageCanDropPredicate = (options: FileDropHandlerOptions) => boolean\n\n/**\n * A handler to be called when an error occurs during the upload.\n */\nexport interface ImageUploadHandlerOptions {\n /**\n * The uploader used to upload the file. It should return a promise that\n * resolves to the URL of the uploaded image.\n */\n uploader: Uploader<string>\n /**\n * A predicate to determine if the pasted file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing paste of files with a content type starting with `image/`.\n */\n canPaste?: ImageCanPastePredicate\n /**\n * A predicate to determine if the dropped file should be uploaded and inserted as an image.\n * If not provided, it defaults to only allowing drop of files with a content type starting with `image/`.\n */\n canDrop?: ImageCanDropPredicate\n /**\n * A handler to be called when an error occurs during the upload.\n * If not provided, it defaults to logging the error to the console.\n */\n onError?: ImageUploadErrorHandler\n}\n\nfunction defaultCanUpload({ file }: { file: File }): boolean {\n // Only handle image files by default\n return file.type.startsWith('image/')\n}\n\nconst defaultOnError: ImageUploadErrorHandler = ({ error }) => {\n console.error('[prosekit] Failed to upload image:', error)\n}\n\n/**\n * Returns an extension that handles image file uploads when pasting or dropping\n * images into the editor.\n *\n * @param options\n */\nexport function defineImageUploadHandler({\n uploader,\n canPaste = defaultCanUpload,\n canDrop = defaultCanUpload,\n onError = defaultOnError,\n}: ImageUploadHandlerOptions): PlainExtension {\n const handlePaste: FilePasteHandler = (options) => {\n if (!canPaste(options)) return false\n const { view, file } = options\n const command = uploadImage({ uploader, file, onError })\n return command(view.state, view.dispatch, view)\n }\n\n const handleDrop: FileDropHandler = (options) => {\n if (!canDrop(options)) return false\n const { view, file, pos } = options\n const command = uploadImage({ uploader, file, onError, pos })\n return command(view.state, view.dispatch, view)\n }\n\n return union(\n defineFilePasteHandler(handlePaste),\n defineFileDropHandler(handleDrop),\n )\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { defineImageCommands, type ImageCommandsExtension } from './image-commands.ts'\nimport { defineImageSpec, type ImageSpecExtension } from './image-spec.ts'\n\n/**\n * @internal\n */\nexport type ImageExtension = Union<[ImageSpecExtension, ImageCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineImage(): ImageExtension {\n return union(defineImageSpec(), defineImageCommands())\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { defineFacet, defineFacetPayload, getMarkType, getNodeType, isMarkAbsent, maybeRun, pluginFacet } from "@prosekit/core";
2
2
  import { InputRule, inputRules, textblockTypeInputRule, wrappingInputRule } from "@prosekit/pm/inputrules";
3
-
4
3
  //#region src/input-rule/index.ts
5
4
  /**
6
5
  * Defines an input rule extension.
@@ -84,7 +83,7 @@ const inputRuleFacet = defineFacet({
84
83
  },
85
84
  parent: pluginFacet
86
85
  });
87
-
88
86
  //#endregion
89
87
  export { createMarkInputRule, defineInputRule, defineMarkInputRule, defineTextBlockInputRule, defineWrappingInputRule };
88
+
90
89
  //# sourceMappingURL=prosekit-extensions-input-rule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prosekit-extensions-input-rule.js","names":[],"sources":["../src/input-rule/index.ts"],"sourcesContent":["import {\n defineFacet,\n defineFacetPayload,\n getMarkType,\n getNodeType,\n isMarkAbsent,\n maybeRun,\n pluginFacet,\n type PlainExtension,\n type PluginPayload,\n} from '@prosekit/core'\nimport { InputRule, inputRules, textblockTypeInputRule, wrappingInputRule } from '@prosekit/pm/inputrules'\nimport type { Attrs, MarkType, NodeType, ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport type { Plugin } from '@prosekit/pm/state'\n\n/**\n * Defines an input rule extension.\n *\n * @param rule - The ProseMirror input rule to add.\n *\n * @public\n */\nexport function defineInputRule(rule: InputRule): PlainExtension {\n return defineInputRuleFacetPayload(() => rule)\n}\n\n/**\n * Options for {@link defineMarkInputRule}.\n *\n * @public\n */\nexport interface MarkInputRuleOptions {\n /**\n * The regular expression to match against, which should end with `$` and has\n * exactly one capture group. All other matched text outside the capture group\n * will be deleted.\n */\n regex: RegExp\n\n /**\n * The type of mark to set.\n */\n type: string | MarkType\n\n /**\n * Attributes to set on the mark.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n\n /**\n * Whether this rule should fire inside marks marked as [code](https://prosemirror.net/docs/ref/#model.MarkSpec.code).\n *\n * @default `false`\n */\n inCodeMark?: boolean\n}\n\n/**\n * @internal\n */\nexport function createMarkInputRule({\n regex,\n type,\n attrs = null,\n inCodeMark = false,\n}: MarkInputRuleOptions): InputRule {\n const rule = new InputRule(regex, (state, match, start, end) => {\n const { tr, schema } = state\n const [fullText, markText] = match\n\n if (!markText) {\n return null\n }\n\n const markStart = start + fullText.indexOf(markText)\n const markEnd = markStart + markText.length\n\n if (!(start <= markStart && markStart < markEnd && markEnd <= end)) {\n // Incorrect regex.\n return null\n }\n\n const markType = getMarkType(schema, type)\n const mark = markType.create(maybeRun(attrs, match))\n\n if (!isMarkAbsent(tr.doc, markStart, markEnd, markType, attrs)) {\n // The mark is already active.\n return null\n }\n\n const initialStoredMarks = tr.storedMarks ?? []\n\n tr.addMark(markStart, markEnd, mark)\n\n if (markEnd < end) {\n tr.delete(markEnd, end)\n }\n if (start < markStart) {\n tr.delete(start, markStart)\n }\n\n // Make sure not to reactivate any marks which had previously been\n // deactivated. By keeping track of the initial stored marks we are able to\n // discard any unintended consequences of deleting text and adding it again.\n tr.setStoredMarks(initialStoredMarks)\n\n return tr\n }, { inCodeMark })\n\n return rule\n}\n\n/**\n * Defines an input rule for automatically adding inline marks when a given\n * pattern is typed.\n *\n * @public\n */\nexport function defineMarkInputRule(\n options: MarkInputRuleOptions,\n): PlainExtension {\n return defineInputRule(createMarkInputRule(options))\n}\n\n/**\n * Defines an input rule that changes the type of a textblock when the matched\n * text is typed into it.\n *\n * See also [textblockTypeInputRule](https://prosemirror.net/docs/ref/#inputrules.textblockTypeInputRule)\n *\n * @param options\n *\n * @public\n */\nexport function defineTextBlockInputRule({\n regex,\n type,\n attrs,\n}: {\n /**\n * The regular expression to match against, which should end with `$`. It\n * usually also starts with `^` to that it is only matched at the start of a\n * textblock.\n */\n regex: RegExp\n\n /**\n * The node type to replace the matched text with.\n */\n type: string | NodeType\n\n /**\n * Attributes to set on the node.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n}): PlainExtension {\n return defineInputRuleFacetPayload(({ schema }): InputRule => {\n const nodeType = getNodeType(schema, type)\n return textblockTypeInputRule(regex, nodeType, attrs)\n })\n}\n\n/**\n * Defines an input rule for automatically wrapping a textblock when a given\n * string is typed.\n *\n * See also [wrappingInputRule](https://prosemirror.net/docs/ref/#inputrules.wrappingInputRule)\n *\n * @param options\n *\n * @public\n */\nexport function defineWrappingInputRule({\n regex,\n type,\n attrs,\n join,\n}: {\n /**\n * The regular expression to match against, which should end with `$`. It\n * usually also starts with `^` to that it is only matched at the start of a\n * textblock.\n */\n regex: RegExp\n\n /**\n * The type of node to wrap in.\n */\n type: string | NodeType\n\n /**\n * Attributes to set on the node.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n\n /**\n * By default, if there's a node with the same type above the newly wrapped\n * node, the rule will try to\n * [join](https://prosemirror.net/docs/ref/#transform.Transform.join) those\n * two nodes. You can pass a join predicate, which takes a regular expression\n * match and the node before the wrapped node, and can return a boolean to\n * indicate whether a join should happen.\n */\n join?: (match: RegExpMatchArray, node: ProseMirrorNode) => boolean\n}): PlainExtension {\n return defineInputRuleFacetPayload(({ schema }): InputRule => {\n const nodeType = getNodeType(schema, type)\n return wrappingInputRule(regex, nodeType, attrs, join)\n })\n}\n\nfunction defineInputRuleFacetPayload(input: InputRulePayload): PlainExtension {\n return defineFacetPayload(inputRuleFacet, [input]) as PlainExtension\n}\n\ntype InputRulePayload = (context: { schema: Schema }) => InputRule\n\nconst inputRuleFacet = defineFacet<InputRulePayload, PluginPayload>({\n reducer: (inputs: InputRulePayload[]): PluginPayload => {\n return (context): Plugin[] => {\n const rules: InputRule[] = inputs.flatMap((callback) => callback(context))\n return [inputRules({ rules })]\n }\n },\n parent: pluginFacet,\n})\n"],"mappings":";;;;;;;;;;;AAsBA,SAAgB,gBAAgB,MAAiC;AAC/D,QAAO,kCAAkC,KAAK;;;;;AAqChD,SAAgB,oBAAoB,EAClC,OACA,MACA,QAAQ,MACR,aAAa,SACqB;AA4ClC,QA3Ca,IAAI,UAAU,QAAQ,OAAO,OAAO,OAAO,QAAQ;EAC9D,MAAM,EAAE,IAAI,WAAW;EACvB,MAAM,CAAC,UAAU,YAAY;AAE7B,MAAI,CAAC,SACH,QAAO;EAGT,MAAM,YAAY,QAAQ,SAAS,QAAQ,SAAS;EACpD,MAAM,UAAU,YAAY,SAAS;AAErC,MAAI,EAAE,SAAS,aAAa,YAAY,WAAW,WAAW,KAE5D,QAAO;EAGT,MAAM,WAAW,YAAY,QAAQ,KAAK;EAC1C,MAAM,OAAO,SAAS,OAAO,SAAS,OAAO,MAAM,CAAC;AAEpD,MAAI,CAAC,aAAa,GAAG,KAAK,WAAW,SAAS,UAAU,MAAM,CAE5D,QAAO;EAGT,MAAM,qBAAqB,GAAG,eAAe,EAAE;AAE/C,KAAG,QAAQ,WAAW,SAAS,KAAK;AAEpC,MAAI,UAAU,IACZ,IAAG,OAAO,SAAS,IAAI;AAEzB,MAAI,QAAQ,UACV,IAAG,OAAO,OAAO,UAAU;AAM7B,KAAG,eAAe,mBAAmB;AAErC,SAAO;IACN,EAAE,YAAY,CAAC;;;;;;;;AAWpB,SAAgB,oBACd,SACgB;AAChB,QAAO,gBAAgB,oBAAoB,QAAQ,CAAC;;;;;;;;;;;;AAatD,SAAgB,yBAAyB,EACvC,OACA,MACA,SAkBiB;AACjB,QAAO,6BAA6B,EAAE,aAAwB;AAE5D,SAAO,uBAAuB,OADb,YAAY,QAAQ,KAAK,EACK,MAAM;GACrD;;;;;;;;;;;;AAaJ,SAAgB,wBAAwB,EACtC,OACA,MACA,OACA,QA4BiB;AACjB,QAAO,6BAA6B,EAAE,aAAwB;AAE5D,SAAO,kBAAkB,OADR,YAAY,QAAQ,KAAK,EACA,OAAO,KAAK;GACtD;;AAGJ,SAAS,4BAA4B,OAAyC;AAC5E,QAAO,mBAAmB,gBAAgB,CAAC,MAAM,CAAC;;AAKpD,MAAM,iBAAiB,YAA6C;CAClE,UAAU,WAA8C;AACtD,UAAQ,YAAsB;AAE5B,UAAO,CAAC,WAAW,EAAE,OADM,OAAO,SAAS,aAAa,SAAS,QAAQ,CAAC,EAC9C,CAAC,CAAC;;;CAGlC,QAAQ;CACT,CAAC"}
1
+ {"version":3,"file":"prosekit-extensions-input-rule.js","names":[],"sources":["../src/input-rule/index.ts"],"sourcesContent":["import {\n defineFacet,\n defineFacetPayload,\n getMarkType,\n getNodeType,\n isMarkAbsent,\n maybeRun,\n pluginFacet,\n type PlainExtension,\n type PluginPayload,\n} from '@prosekit/core'\nimport { InputRule, inputRules, textblockTypeInputRule, wrappingInputRule } from '@prosekit/pm/inputrules'\nimport type { Attrs, MarkType, NodeType, ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport type { Plugin } from '@prosekit/pm/state'\n\n/**\n * Defines an input rule extension.\n *\n * @param rule - The ProseMirror input rule to add.\n *\n * @public\n */\nexport function defineInputRule(rule: InputRule): PlainExtension {\n return defineInputRuleFacetPayload(() => rule)\n}\n\n/**\n * Options for {@link defineMarkInputRule}.\n *\n * @public\n */\nexport interface MarkInputRuleOptions {\n /**\n * The regular expression to match against, which should end with `$` and has\n * exactly one capture group. All other matched text outside the capture group\n * will be deleted.\n */\n regex: RegExp\n\n /**\n * The type of mark to set.\n */\n type: string | MarkType\n\n /**\n * Attributes to set on the mark.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n\n /**\n * Whether this rule should fire inside marks marked as [code](https://prosemirror.net/docs/ref/#model.MarkSpec.code).\n *\n * @default `false`\n */\n inCodeMark?: boolean\n}\n\n/**\n * @internal\n */\nexport function createMarkInputRule({\n regex,\n type,\n attrs = null,\n inCodeMark = false,\n}: MarkInputRuleOptions): InputRule {\n const rule = new InputRule(regex, (state, match, start, end) => {\n const { tr, schema } = state\n const [fullText, markText] = match\n\n if (!markText) {\n return null\n }\n\n const markStart = start + fullText.indexOf(markText)\n const markEnd = markStart + markText.length\n\n if (!(start <= markStart && markStart < markEnd && markEnd <= end)) {\n // Incorrect regex.\n return null\n }\n\n const markType = getMarkType(schema, type)\n const mark = markType.create(maybeRun(attrs, match))\n\n if (!isMarkAbsent(tr.doc, markStart, markEnd, markType, attrs)) {\n // The mark is already active.\n return null\n }\n\n const initialStoredMarks = tr.storedMarks ?? []\n\n tr.addMark(markStart, markEnd, mark)\n\n if (markEnd < end) {\n tr.delete(markEnd, end)\n }\n if (start < markStart) {\n tr.delete(start, markStart)\n }\n\n // Make sure not to reactivate any marks which had previously been\n // deactivated. By keeping track of the initial stored marks we are able to\n // discard any unintended consequences of deleting text and adding it again.\n tr.setStoredMarks(initialStoredMarks)\n\n return tr\n }, { inCodeMark })\n\n return rule\n}\n\n/**\n * Defines an input rule for automatically adding inline marks when a given\n * pattern is typed.\n *\n * @public\n */\nexport function defineMarkInputRule(\n options: MarkInputRuleOptions,\n): PlainExtension {\n return defineInputRule(createMarkInputRule(options))\n}\n\n/**\n * Defines an input rule that changes the type of a textblock when the matched\n * text is typed into it.\n *\n * See also [textblockTypeInputRule](https://prosemirror.net/docs/ref/#inputrules.textblockTypeInputRule)\n *\n * @param options\n *\n * @public\n */\nexport function defineTextBlockInputRule({\n regex,\n type,\n attrs,\n}: {\n /**\n * The regular expression to match against, which should end with `$`. It\n * usually also starts with `^` to that it is only matched at the start of a\n * textblock.\n */\n regex: RegExp\n\n /**\n * The node type to replace the matched text with.\n */\n type: string | NodeType\n\n /**\n * Attributes to set on the node.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n}): PlainExtension {\n return defineInputRuleFacetPayload(({ schema }): InputRule => {\n const nodeType = getNodeType(schema, type)\n return textblockTypeInputRule(regex, nodeType, attrs)\n })\n}\n\n/**\n * Defines an input rule for automatically wrapping a textblock when a given\n * string is typed.\n *\n * See also [wrappingInputRule](https://prosemirror.net/docs/ref/#inputrules.wrappingInputRule)\n *\n * @param options\n *\n * @public\n */\nexport function defineWrappingInputRule({\n regex,\n type,\n attrs,\n join,\n}: {\n /**\n * The regular expression to match against, which should end with `$`. It\n * usually also starts with `^` to that it is only matched at the start of a\n * textblock.\n */\n regex: RegExp\n\n /**\n * The type of node to wrap in.\n */\n type: string | NodeType\n\n /**\n * Attributes to set on the node.\n */\n attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null)\n\n /**\n * By default, if there's a node with the same type above the newly wrapped\n * node, the rule will try to\n * [join](https://prosemirror.net/docs/ref/#transform.Transform.join) those\n * two nodes. You can pass a join predicate, which takes a regular expression\n * match and the node before the wrapped node, and can return a boolean to\n * indicate whether a join should happen.\n */\n join?: (match: RegExpMatchArray, node: ProseMirrorNode) => boolean\n}): PlainExtension {\n return defineInputRuleFacetPayload(({ schema }): InputRule => {\n const nodeType = getNodeType(schema, type)\n return wrappingInputRule(regex, nodeType, attrs, join)\n })\n}\n\nfunction defineInputRuleFacetPayload(input: InputRulePayload): PlainExtension {\n return defineFacetPayload(inputRuleFacet, [input]) as PlainExtension\n}\n\ntype InputRulePayload = (context: { schema: Schema }) => InputRule\n\nconst inputRuleFacet = defineFacet<InputRulePayload, PluginPayload>({\n reducer: (inputs: InputRulePayload[]): PluginPayload => {\n return (context): Plugin[] => {\n const rules: InputRule[] = inputs.flatMap((callback) => callback(context))\n return [inputRules({ rules })]\n }\n },\n parent: pluginFacet,\n})\n"],"mappings":";;;;;;;;;;AAsBA,SAAgB,gBAAgB,MAAiC;AAC/D,QAAO,kCAAkC,KAAK;;;;;AAqChD,SAAgB,oBAAoB,EAClC,OACA,MACA,QAAQ,MACR,aAAa,SACqB;AA4ClC,QA3Ca,IAAI,UAAU,QAAQ,OAAO,OAAO,OAAO,QAAQ;EAC9D,MAAM,EAAE,IAAI,WAAW;EACvB,MAAM,CAAC,UAAU,YAAY;AAE7B,MAAI,CAAC,SACH,QAAO;EAGT,MAAM,YAAY,QAAQ,SAAS,QAAQ,SAAS;EACpD,MAAM,UAAU,YAAY,SAAS;AAErC,MAAI,EAAE,SAAS,aAAa,YAAY,WAAW,WAAW,KAE5D,QAAO;EAGT,MAAM,WAAW,YAAY,QAAQ,KAAK;EAC1C,MAAM,OAAO,SAAS,OAAO,SAAS,OAAO,MAAM,CAAC;AAEpD,MAAI,CAAC,aAAa,GAAG,KAAK,WAAW,SAAS,UAAU,MAAM,CAE5D,QAAO;EAGT,MAAM,qBAAqB,GAAG,eAAe,EAAE;AAE/C,KAAG,QAAQ,WAAW,SAAS,KAAK;AAEpC,MAAI,UAAU,IACZ,IAAG,OAAO,SAAS,IAAI;AAEzB,MAAI,QAAQ,UACV,IAAG,OAAO,OAAO,UAAU;AAM7B,KAAG,eAAe,mBAAmB;AAErC,SAAO;IACN,EAAE,YAAY,CAAC;;;;;;;;AAWpB,SAAgB,oBACd,SACgB;AAChB,QAAO,gBAAgB,oBAAoB,QAAQ,CAAC;;;;;;;;;;;;AAatD,SAAgB,yBAAyB,EACvC,OACA,MACA,SAkBiB;AACjB,QAAO,6BAA6B,EAAE,aAAwB;AAE5D,SAAO,uBAAuB,OADb,YAAY,QAAQ,KAAK,EACK,MAAM;GACrD;;;;;;;;;;;;AAaJ,SAAgB,wBAAwB,EACtC,OACA,MACA,OACA,QA4BiB;AACjB,QAAO,6BAA6B,EAAE,aAAwB;AAE5D,SAAO,kBAAkB,OADR,YAAY,QAAQ,KAAK,EACA,OAAO,KAAK;GACtD;;AAGJ,SAAS,4BAA4B,OAAyC;AAC5E,QAAO,mBAAmB,gBAAgB,CAAC,MAAM,CAAC;;AAKpD,MAAM,iBAAiB,YAA6C;CAClE,UAAU,WAA8C;AACtD,UAAQ,YAAsB;AAE5B,UAAO,CAAC,WAAW,EAAE,OADM,OAAO,SAAS,aAAa,SAAS,QAAQ,CAAC,EAC9C,CAAC,CAAC;;;CAGlC,QAAQ;CACT,CAAC"}
@@ -15,6 +15,18 @@ type ItalicCommandsExtension = Extension<{
15
15
  */
16
16
  declare function defineItalicCommands(): ItalicCommandsExtension;
17
17
  //#endregion
18
+ //#region src/italic/italic-input-rule.d.ts
19
+ /**
20
+ * @internal
21
+ */
22
+ declare function defineItalicInputRule(): PlainExtension;
23
+ //#endregion
24
+ //#region src/italic/italic-keymap.d.ts
25
+ /**
26
+ * @internal
27
+ */
28
+ declare function defineItalicKeymap(): PlainExtension;
29
+ //#endregion
18
30
  //#region src/italic/italic-spec.d.ts
19
31
  /**
20
32
  * @internal
@@ -39,17 +51,5 @@ type ItalicExtension = Union<[ItalicSpecExtension, ItalicCommandsExtension]>;
39
51
  */
40
52
  declare function defineItalic(): ItalicExtension;
41
53
  //#endregion
42
- //#region src/italic/italic-input-rule.d.ts
43
- /**
44
- * @internal
45
- */
46
- declare function defineItalicInputRule(): PlainExtension;
47
- //#endregion
48
- //#region src/italic/italic-keymap.d.ts
49
- /**
50
- * @internal
51
- */
52
- declare function defineItalicKeymap(): PlainExtension;
53
- //#endregion
54
54
  export { type ItalicCommandsExtension, type ItalicExtension, type ItalicSpecExtension, defineItalic, defineItalicCommands, defineItalicInputRule, defineItalicKeymap, defineItalicSpec };
55
55
  //# sourceMappingURL=prosekit-extensions-italic.d.ts.map