@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.
- package/dist/commit/style.css +1 -3
- package/dist/{drop-indicator-DJq8pF92.js → drop-indicator.js} +2 -4
- package/dist/drop-indicator.js.map +1 -0
- package/dist/{file-upload-I9m1EJAM.js → file.js} +2 -6
- package/dist/file.js.map +1 -0
- package/dist/gap-cursor/style.css +5 -8
- package/dist/{file-upload-dr3IXUty.d.ts → index.d.ts} +1 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/list/style.css +79 -110
- package/dist/loro/style.css +18 -21
- package/dist/{mark-rule-CUnXwBuy.js → mark-rule.js} +3 -6
- package/dist/mark-rule.js.map +1 -0
- package/dist/page/style.css +43 -0
- package/dist/{mark-paste-rule-n_2Ehmb5.js → paste-rule.js} +3 -7
- package/dist/paste-rule.js.map +1 -0
- package/dist/placeholder/style.css +4 -7
- package/dist/prosekit-extensions-autocomplete.d.ts +1 -1
- package/dist/prosekit-extensions-autocomplete.js +17 -21
- package/dist/prosekit-extensions-autocomplete.js.map +1 -1
- package/dist/prosekit-extensions-background-color.d.ts +1 -1
- package/dist/prosekit-extensions-background-color.js +1 -4
- package/dist/prosekit-extensions-background-color.js.map +1 -1
- package/dist/prosekit-extensions-blockquote.d.ts +13 -13
- package/dist/prosekit-extensions-blockquote.d.ts.map +1 -1
- package/dist/prosekit-extensions-blockquote.js +6 -10
- package/dist/prosekit-extensions-blockquote.js.map +1 -1
- package/dist/prosekit-extensions-bold.d.ts +12 -12
- package/dist/prosekit-extensions-bold.d.ts.map +1 -1
- package/dist/prosekit-extensions-bold.js +1 -6
- package/dist/prosekit-extensions-bold.js.map +1 -1
- package/dist/prosekit-extensions-code-block.d.ts +56 -37
- package/dist/prosekit-extensions-code-block.d.ts.map +1 -1
- package/dist/prosekit-extensions-code-block.js +73 -76
- package/dist/prosekit-extensions-code-block.js.map +1 -1
- package/dist/prosekit-extensions-code.d.ts +12 -12
- package/dist/prosekit-extensions-code.d.ts.map +1 -1
- package/dist/prosekit-extensions-code.js +1 -6
- package/dist/prosekit-extensions-code.js.map +1 -1
- package/dist/prosekit-extensions-commit.d.ts +1 -1
- package/dist/prosekit-extensions-commit.js +2 -3
- package/dist/prosekit-extensions-commit.js.map +1 -1
- package/dist/prosekit-extensions-doc.js +1 -2
- package/dist/prosekit-extensions-doc.js.map +1 -1
- package/dist/prosekit-extensions-drop-cursor.js +1 -2
- package/dist/prosekit-extensions-drop-cursor.js.map +1 -1
- package/dist/prosekit-extensions-drop-indicator.js +2 -3
- package/dist/prosekit-extensions-enter-rule.d.ts +2 -2
- package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -1
- package/dist/prosekit-extensions-enter-rule.js +1 -2
- package/dist/prosekit-extensions-enter-rule.js.map +1 -1
- package/dist/prosekit-extensions-file.d.ts +2 -2
- package/dist/prosekit-extensions-file.js +2 -3
- package/dist/prosekit-extensions-gap-cursor.js +1 -2
- package/dist/prosekit-extensions-gap-cursor.js.map +1 -1
- package/dist/prosekit-extensions-hard-break.d.ts +7 -7
- package/dist/prosekit-extensions-hard-break.d.ts.map +1 -1
- package/dist/prosekit-extensions-hard-break.js +1 -5
- package/dist/prosekit-extensions-hard-break.js.map +1 -1
- package/dist/prosekit-extensions-heading.d.ts +15 -15
- package/dist/prosekit-extensions-heading.d.ts.map +1 -1
- package/dist/prosekit-extensions-heading.js +1 -6
- package/dist/prosekit-extensions-heading.js.map +1 -1
- package/dist/prosekit-extensions-horizontal-rule.d.ts +7 -7
- package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -1
- package/dist/prosekit-extensions-horizontal-rule.js +12 -14
- package/dist/prosekit-extensions-horizontal-rule.js.map +1 -1
- package/dist/prosekit-extensions-image.d.ts +12 -13
- package/dist/prosekit-extensions-image.d.ts.map +1 -1
- package/dist/prosekit-extensions-image.js +10 -16
- package/dist/prosekit-extensions-image.js.map +1 -1
- package/dist/prosekit-extensions-input-rule.js +1 -2
- package/dist/prosekit-extensions-input-rule.js.map +1 -1
- package/dist/prosekit-extensions-italic.d.ts +12 -12
- package/dist/prosekit-extensions-italic.d.ts.map +1 -1
- package/dist/prosekit-extensions-italic.js +1 -6
- package/dist/prosekit-extensions-italic.js.map +1 -1
- package/dist/prosekit-extensions-link.js +3 -6
- package/dist/prosekit-extensions-link.js.map +1 -1
- package/dist/prosekit-extensions-list.d.ts +26 -26
- package/dist/prosekit-extensions-list.d.ts.map +1 -1
- package/dist/prosekit-extensions-list.js +26 -34
- package/dist/prosekit-extensions-list.js.map +1 -1
- package/dist/prosekit-extensions-loro.d.ts +16 -16
- package/dist/prosekit-extensions-loro.d.ts.map +1 -1
- package/dist/prosekit-extensions-loro.js +3 -9
- package/dist/prosekit-extensions-loro.js.map +1 -1
- package/dist/prosekit-extensions-mark-rule.js +2 -3
- package/dist/prosekit-extensions-math.d.ts +3 -3
- package/dist/prosekit-extensions-math.d.ts.map +1 -1
- package/dist/prosekit-extensions-math.js +5 -5
- package/dist/prosekit-extensions-math.js.map +1 -1
- package/dist/prosekit-extensions-mention.js +1 -2
- package/dist/prosekit-extensions-mention.js.map +1 -1
- package/dist/prosekit-extensions-mod-click-prevention.js +2 -3
- package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -1
- package/dist/prosekit-extensions-page.d.ts +114 -0
- package/dist/prosekit-extensions-page.d.ts.map +1 -0
- package/dist/prosekit-extensions-page.js +324 -0
- package/dist/prosekit-extensions-page.js.map +1 -0
- package/dist/prosekit-extensions-paragraph.d.ts +7 -7
- package/dist/prosekit-extensions-paragraph.d.ts.map +1 -1
- package/dist/prosekit-extensions-paragraph.js +3 -7
- package/dist/prosekit-extensions-paragraph.js.map +1 -1
- package/dist/prosekit-extensions-paste-rule.js +2 -3
- package/dist/prosekit-extensions-placeholder.d.ts +1 -1
- package/dist/prosekit-extensions-placeholder.js +3 -4
- package/dist/prosekit-extensions-placeholder.js.map +1 -1
- package/dist/prosekit-extensions-readonly.js +2 -3
- package/dist/prosekit-extensions-readonly.js.map +1 -1
- package/dist/prosekit-extensions-search.js +1 -2
- package/dist/prosekit-extensions-search.js.map +1 -1
- package/dist/prosekit-extensions-strike.js +1 -2
- package/dist/prosekit-extensions-strike.js.map +1 -1
- package/dist/prosekit-extensions-table.d.ts +47 -47
- package/dist/prosekit-extensions-table.d.ts.map +1 -1
- package/dist/prosekit-extensions-table.js +2 -3
- package/dist/prosekit-extensions-text-align.d.ts +1 -1
- package/dist/prosekit-extensions-text-align.js +1 -2
- package/dist/prosekit-extensions-text-align.js.map +1 -1
- package/dist/prosekit-extensions-text-color.d.ts +1 -1
- package/dist/prosekit-extensions-text-color.js +1 -4
- package/dist/prosekit-extensions-text-color.js.map +1 -1
- package/dist/prosekit-extensions-text.js +1 -2
- package/dist/prosekit-extensions-text.js.map +1 -1
- package/dist/prosekit-extensions-underline.js +1 -2
- package/dist/prosekit-extensions-underline.js.map +1 -1
- package/dist/prosekit-extensions-virtual-selection.js +2 -3
- package/dist/prosekit-extensions-virtual-selection.js.map +1 -1
- package/dist/prosekit-extensions-yjs.d.ts +3 -3
- package/dist/prosekit-extensions-yjs.d.ts.map +1 -1
- package/dist/prosekit-extensions-yjs.js +3 -9
- package/dist/prosekit-extensions-yjs.js.map +1 -1
- package/dist/prosekit-extensions.js +1 -1
- package/dist/search/style.css +4 -8
- package/dist/shiki-highlighter-chunk.js +1 -2
- package/dist/shiki-highlighter-chunk.js.map +1 -1
- package/dist/table/style.css +16 -16
- package/dist/{table-UJVYsrB7.js → table.js} +29 -41
- package/dist/table.js.map +1 -0
- package/dist/virtual-selection/style.css +1 -4
- package/dist/yjs/style.css +14 -20
- package/package.json +30 -16
- package/src/autocomplete/autocomplete-helpers.ts +1 -1
- package/src/autocomplete/autocomplete-plugin.ts +2 -2
- package/src/autocomplete/autocomplete-rule.ts +1 -1
- package/src/autocomplete/autocomplete.spec.ts +4 -4
- package/src/autocomplete/autocomplete.ts +2 -2
- package/src/autocomplete/index.ts +2 -2
- package/src/background-color/background-color-commands.spec.ts +1 -1
- package/src/background-color/background-color-commands.ts +1 -1
- package/src/background-color/background-color-spec.spec.ts +1 -1
- package/src/background-color/background-color.ts +2 -2
- package/src/background-color/index.ts +3 -3
- package/src/blockquote/blockquote-input-rule.ts +1 -1
- package/src/blockquote/blockquote-keymap.spec.ts +1 -1
- package/src/blockquote/blockquote-keymap.ts +9 -7
- package/src/blockquote/blockquote.ts +4 -4
- package/src/blockquote/index.ts +5 -5
- package/src/bold/bold-input-rule.spec.ts +2 -2
- package/src/bold/bold-input-rule.ts +1 -1
- package/src/bold/bold.ts +4 -4
- package/src/bold/index.ts +5 -5
- package/src/code/code-input-rule.ts +1 -1
- package/src/code/code.ts +4 -4
- package/src/code/index.ts +5 -5
- package/src/code-block/code-block-commands.ts +1 -1
- package/src/code-block/code-block-highlight.ts +11 -1
- package/src/code-block/code-block-input-rule.ts +3 -3
- package/src/code-block/code-block-shiki.ts +13 -5
- package/src/code-block/code-block-spec.spec.ts +2 -2
- package/src/code-block/code-block-spec.ts +1 -1
- package/src/code-block/code-block.ts +4 -4
- package/src/code-block/index.ts +9 -9
- package/src/code-block/shiki-highlighter.ts +2 -2
- package/src/code-block/shiki-parser.ts +2 -2
- package/src/drop-cursor/index.ts +1 -1
- package/src/drop-indicator/drop-indicator.ts +1 -1
- package/src/drop-indicator/index.ts +1 -1
- package/src/enter-rule/index.ts +3 -3
- package/src/file/file-drop-handler.ts +1 -1
- package/src/file/file-paste-handler.spec.ts +3 -3
- package/src/file/file-paste-handler.ts +1 -1
- package/src/file/index.ts +3 -3
- package/src/gap-cursor/index.ts +1 -1
- package/src/hard-break/hard-break-keymap.spec.ts +2 -2
- package/src/hard-break/hard-break-keymap.ts +1 -1
- package/src/hard-break/hard-break.ts +3 -3
- package/src/hard-break/index.ts +4 -4
- package/src/heading/heading-commands.ts +1 -1
- package/src/heading/heading-input-rule.ts +2 -2
- package/src/heading/heading-keymap.spec.ts +1 -1
- package/src/heading/heading-spec.ts +1 -1
- package/src/heading/heading.ts +4 -4
- package/src/heading/index.ts +6 -6
- package/src/horizontal-rule/horizontal-rule-commands.spec.ts +1 -1
- package/src/horizontal-rule/horizontal-rule-commands.ts +14 -11
- package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +2 -2
- package/src/horizontal-rule/horizontal-rule-input-rule.ts +1 -1
- package/src/horizontal-rule/horizontal-rule.ts +3 -3
- package/src/horizontal-rule/index.ts +4 -4
- package/src/image/image-commands/insert-image.ts +1 -1
- package/src/image/image-commands/upload-image.spec.ts +4 -4
- package/src/image/image-commands/upload-image.ts +2 -2
- package/src/image/image-commands.ts +3 -3
- package/src/image/image-upload-handler.ts +2 -2
- package/src/image/image.ts +2 -2
- package/src/image/index.ts +6 -6
- package/src/italic/index.ts +5 -5
- package/src/italic/italic-commands.spec.ts +4 -4
- package/src/italic/italic-input-rule.spec.ts +2 -2
- package/src/italic/italic-input-rule.ts +1 -1
- package/src/italic/italic.ts +4 -4
- package/src/link/index.spec.ts +2 -2
- package/src/link/index.ts +6 -6
- package/src/link/link-paste-rule.spec.ts +2 -2
- package/src/link/link-paste-rule.ts +3 -3
- package/src/link/link-regex.spec.ts +1 -1
- package/src/list/index.ts +8 -8
- package/src/list/list-drop-indicator.ts +2 -2
- package/src/list/list-input-rules.ts +1 -1
- package/src/list/list-keymap.spec.ts +1 -1
- package/src/list/list-spec.ts +1 -1
- package/src/list/list-types.spec.ts +2 -2
- package/src/list/list.spec.ts +6 -6
- package/src/list/list.ts +7 -7
- package/src/loro/index.ts +6 -6
- package/src/loro/loro.ts +8 -7
- package/src/mark-rule/apply.ts +2 -2
- package/src/mark-rule/index.ts +2 -2
- package/src/mark-rule/mark-rule.spec.ts +4 -4
- package/src/mark-rule/mark-rule.ts +2 -2
- package/src/math/index.ts +4 -4
- package/src/math/math-block.ts +8 -1
- package/src/math/math-inline.ts +1 -1
- package/src/math/math.ts +3 -3
- package/src/page/index.ts +5 -0
- package/src/page/page-break-commands.spec.ts +61 -0
- package/src/page/page-break-commands.ts +41 -0
- package/src/page/page-break-keymap.ts +17 -0
- package/src/page/page-break-spec.ts +33 -0
- package/src/page/page-break.ts +23 -0
- package/src/page/page-element.ts +246 -0
- package/src/page/page-rendering.ts +164 -0
- package/src/page/style.css +43 -0
- package/src/paragraph/index.ts +7 -7
- package/src/paragraph/paragraph-keymap.ts +1 -1
- package/src/paragraph/paragraph.ts +6 -5
- package/src/paste-rule/index.ts +2 -2
- package/src/paste-rule/mark-paste-rule.spec.ts +8 -8
- package/src/paste-rule/mark-paste-rule.ts +2 -2
- package/src/paste-rule/paste-rule.spec.ts +2 -2
- package/src/paste-rule/paste-rule.ts +1 -1
- package/src/paste-rule/split-text-by-regex.spec.ts +1 -1
- package/src/placeholder/index.ts +1 -1
- package/src/strike/index.ts +1 -1
- package/src/table/index.ts +14 -14
- package/src/table/table-commands/delete-cell-selection.spec.ts +3 -3
- package/src/table/table-commands/exit-table.spec.ts +2 -2
- package/src/table/table-commands/insert-table.spec.ts +1 -1
- package/src/table/table-commands/move-table-column.spec.ts +2 -2
- package/src/table/table-commands/move-table-row.spec.ts +2 -2
- package/src/table/table-commands/select-table-cell.spec.ts +3 -3
- package/src/table/table-commands/select-table-cell.ts +1 -1
- package/src/table/table-commands/select-table-column.spec.ts +2 -2
- package/src/table/table-commands/select-table-column.ts +1 -1
- package/src/table/table-commands/select-table-row.spec.ts +2 -2
- package/src/table/table-commands/select-table-row.ts +1 -1
- package/src/table/table-commands/select-table.spec.ts +2 -2
- package/src/table/table-commands/select-table.ts +1 -1
- package/src/table/table-commands.ts +9 -9
- package/src/table/table-drop-indicator.ts +2 -2
- package/src/table/table-spec.spec.ts +4 -4
- package/src/table/table.ts +4 -4
- package/src/table/test-utils.ts +1 -1
- package/src/testing/index.ts +24 -24
- package/src/text-color/index.ts +3 -3
- package/src/text-color/text-color-commands.spec.ts +1 -1
- package/src/text-color/text-color-commands.ts +1 -1
- package/src/text-color/text-color-spec.spec.ts +1 -1
- package/src/text-color/text-color.ts +2 -2
- package/src/yjs/index.ts +7 -7
- package/src/yjs/yjs-cursor-plugin.ts +1 -1
- package/src/yjs/yjs-undo-plugin.ts +3 -2
- package/src/yjs/yjs.ts +9 -8
- package/dist/commit/style.css.map +0 -1
- package/dist/commit/style.js +0 -1
- package/dist/drop-indicator-DJq8pF92.js.map +0 -1
- package/dist/file-upload-I9m1EJAM.js.map +0 -1
- package/dist/file-upload-dr3IXUty.d.ts.map +0 -1
- package/dist/gap-cursor/style.css.map +0 -1
- package/dist/gap-cursor/style.js +0 -1
- package/dist/list/style.css.map +0 -1
- package/dist/list/style.js +0 -1
- package/dist/loro/style.css.map +0 -1
- package/dist/loro/style.js +0 -1
- package/dist/mark-paste-rule-n_2Ehmb5.js.map +0 -1
- package/dist/mark-rule-CUnXwBuy.js.map +0 -1
- package/dist/placeholder/style.css.map +0 -1
- package/dist/placeholder/style.js +0 -1
- package/dist/search/style.css.map +0 -1
- package/dist/search/style.js +0 -1
- package/dist/shiki-highlighter-chunk.d.ts +0 -19
- package/dist/shiki-highlighter-chunk.d.ts.map +0 -1
- package/dist/table/style.css.map +0 -1
- package/dist/table/style.js +0 -1
- package/dist/table-UJVYsrB7.js.map +0 -1
- package/dist/virtual-selection/style.css.map +0 -1
- package/dist/virtual-selection/style.js +0 -1
- package/dist/yjs/style.css.map +0 -1
- package/dist/yjs/style.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-math.d.ts","names":[],"sources":["../src/math/math-block.ts","../src/math/math-inline.ts","../src/math/math.ts","../src/math/math
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-math.d.ts","names":[],"sources":["../src/math/math-block.ts","../src/math/math-inline.ts","../src/math/math-plugin.ts","../src/math/math.ts"],"mappings":";;;;;;;AASA;KAAY,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;AAAvC;;;;;AAAA,UAmBiB,oBAAA;EAAoB;;;EAInC,MAAA,EAAQ,eAAA;AAAA;;;;;;;iBASM,mBAAA,CAAA;EAAsB;AAAA,GAAU,oBAAA,GAAuB,SAAA;;;;iBAYvD,wBAAA,CAAA,GAA4B,cAAA;;;AAA5C;;;UASiB,gBAAA;EATyC;AAS1D;;EAIE,MAAA,EAAQ,eAAA;AAAA;;AAMV;;KAAY,kBAAA,GAAqB,KAAA,EAAO,sBAAA;;;AAQxC;;;;iBAAgB,eAAA,CAAgB,OAAA,EAAS,gBAAA,GAAmB,kBAAA;;;;;AAhF5D;KCAY,uBAAA,GAA0B,SAAA;EACpC,KAAA;IACE,UAAA,EAAY,KAAA;EAAA;AAAA;;;;iBAOA,oBAAA,CAAA,GAAwB,uBAAA;ADAxC;;;;;AAAA,UCYiB,qBAAA;EDOoB;;;ECHnC,MAAA,EAAQ,gBAAA;AAAA;;;;;;;iBASM,oBAAA,CAAA;EAAuB;AAAA,GAAU,qBAAA,GAAwB,SAAA;;;;iBAYzD,yBAAA,CAAA,GAA6B,cAAA;;;ADO7C;;;UCEiB,iBAAA;EDFyC;AAS1D;;ECHE,MAAA,EAAQ,gBAAA;AAAA;;ADaV;;KCPY,mBAAA,GAAsB,KAAA,EAAO,uBAAA;;;ADezC;;;;iBCPgB,gBAAA,CAAiB,OAAA,EAAS,iBAAA,GAAoB,mBAAA;;;iBC/E9C,gBAAA,CAAA,GAAoB,cAAA;;;;AFMpC;;KGCY,aAAA,GAAgB,KAAA,EAAO,mBAAA,EAAqB,kBAAA;;;;;;UAOvC,WAAA;EHNG;AAOpB;;EGGE,eAAA,EAAiB,eAAA;EHHoB;;AAmBvC;EGXE,gBAAA,EAAkB,gBAAA;AAAA;;;AHwBpB;iBGlBgB,UAAA,CAAW,OAAA,EAAS,WAAA,GAAc,aAAA"}
|
|
@@ -2,7 +2,6 @@ import { defineInputRule } from "./prosekit-extensions-input-rule.js";
|
|
|
2
2
|
import { defineEnterRule } from "./prosekit-extensions-enter-rule.js";
|
|
3
3
|
import { defineNodeSpec, defineNodeView, definePlugin, union } from "@prosekit/core";
|
|
4
4
|
import { createCursorInsidePlugin, createMathBlockView, createMathInlineInputRule, createMathInlineView, mathBlockEnterRule, mathBlockSpec, mathInlineSpec } from "prosemirror-math";
|
|
5
|
-
|
|
6
5
|
//#region src/math/math-block.ts
|
|
7
6
|
/**
|
|
8
7
|
* @internal
|
|
@@ -10,6 +9,10 @@ import { createCursorInsidePlugin, createMathBlockView, createMathInlineInputRul
|
|
|
10
9
|
function defineMathBlockSpec() {
|
|
11
10
|
return defineNodeSpec({
|
|
12
11
|
...mathBlockSpec,
|
|
12
|
+
attrs: { language: {
|
|
13
|
+
default: "tex",
|
|
14
|
+
validate: "string"
|
|
15
|
+
} },
|
|
13
16
|
name: "mathBlock"
|
|
14
17
|
});
|
|
15
18
|
}
|
|
@@ -42,7 +45,6 @@ function defineMathBlockEnterRule() {
|
|
|
42
45
|
function defineMathBlock(options) {
|
|
43
46
|
return union(defineMathBlockSpec(), defineMathBlockView(options), defineMathBlockEnterRule());
|
|
44
47
|
}
|
|
45
|
-
|
|
46
48
|
//#endregion
|
|
47
49
|
//#region src/math/math-inline.ts
|
|
48
50
|
/**
|
|
@@ -83,13 +85,11 @@ function defineMathInlineInputRule() {
|
|
|
83
85
|
function defineMathInline(options) {
|
|
84
86
|
return union(defineMathInlineSpec(), defineMathInlineView(options), defineMathInlineInputRule());
|
|
85
87
|
}
|
|
86
|
-
|
|
87
88
|
//#endregion
|
|
88
89
|
//#region src/math/math-plugin.ts
|
|
89
90
|
function defineMathPlugin() {
|
|
90
91
|
return definePlugin(createCursorInsidePlugin());
|
|
91
92
|
}
|
|
92
|
-
|
|
93
93
|
//#endregion
|
|
94
94
|
//#region src/math/math.ts
|
|
95
95
|
/**
|
|
@@ -98,7 +98,7 @@ function defineMathPlugin() {
|
|
|
98
98
|
function defineMath(options) {
|
|
99
99
|
return union(defineMathBlock({ render: options.renderMathBlock }), defineMathInline({ render: options.renderMathInline }), defineMathPlugin());
|
|
100
100
|
}
|
|
101
|
-
|
|
102
101
|
//#endregion
|
|
103
102
|
export { defineMath, defineMathBlock, defineMathBlockEnterRule, defineMathBlockSpec, defineMathBlockView, defineMathInline, defineMathInlineInputRule, defineMathInlineSpec, defineMathInlineView, defineMathPlugin };
|
|
103
|
+
|
|
104
104
|
//# sourceMappingURL=prosekit-extensions-math.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-math.js","names":[],"sources":["../src/math/math-block.ts","../src/math/math-inline.ts","../src/math/math-plugin.ts","../src/math/math.ts"],"sourcesContent":["import { defineNodeSpec, defineNodeView, union, type Extension, type PlainExtension, type Union } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\nimport { createMathBlockView, mathBlockEnterRule, mathBlockSpec, type RenderMathBlock } from 'prosemirror-math'\n\nimport { defineEnterRule } from '../enter-rule'\n\n/**\n * @internal\n */\nexport type MathBlockSpecExtension = Extension<{\n Nodes: {\n mathBlock: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineMathBlockSpec(): MathBlockSpecExtension {\n return defineNodeSpec<'mathBlock', Attrs>({\n ...mathBlockSpec,\n name: 'mathBlock',\n })\n}\n\n/**\n * Options for {@link defineMathBlockView}.\n *\n * @internal\n */\nexport interface MathBlockViewOptions {\n /**\n * The function to render the math block.\n */\n render: RenderMathBlock\n}\n\n/**\n * Defines an extension that renders a math block using a custom node view.\n *\n * @param options\n * @internal\n */\nexport function defineMathBlockView({ render }: MathBlockViewOptions): Extension {\n return defineNodeView({\n name: 'mathBlock',\n constructor: (node, view, getPos, decorations) => {\n return createMathBlockView(render, node, decorations)\n },\n })\n}\n\n/**\n * @internal\n */\nexport function defineMathBlockEnterRule(): PlainExtension {\n return defineEnterRule(mathBlockEnterRule)\n}\n\n/**\n * Options for {@link defineMathBlock}.\n *\n * @internal\n */\nexport interface MathBlockOptions {\n /**\n * The function to render the math block.\n */\n render: RenderMathBlock\n}\n\n/**\n * @internal\n */\nexport type MathBlockExtension = Union<[MathBlockSpecExtension]>\n\n/**\n * Defines node `mathBlock` and related functionalities.\n *\n * @param options\n * @public\n */\nexport function defineMathBlock(options: MathBlockOptions): MathBlockExtension {\n return union(\n defineMathBlockSpec(),\n defineMathBlockView(options),\n defineMathBlockEnterRule(),\n )\n}\n","import { defineNodeSpec, defineNodeView, union, type Extension, type PlainExtension, type Union } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\nimport { createMathInlineInputRule, createMathInlineView, mathInlineSpec, type RenderMathInline } from 'prosemirror-math'\n\nimport { defineInputRule } from '../input-rule'\n\n/**\n * @internal\n */\nexport type MathInlineSpecExtension = Extension<{\n Nodes: {\n mathInline: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineMathInlineSpec(): MathInlineSpecExtension {\n return defineNodeSpec<'mathInline', Attrs>({\n ...mathInlineSpec,\n name: 'mathInline',\n })\n}\n\n/**\n * Options for {@link defineMathInlineView}.\n *\n * @internal\n */\nexport interface MathInlineViewOptions {\n /**\n * The function to render the math inline.\n */\n render: RenderMathInline\n}\n\n/**\n * Defines an extension that renders a math inline using a custom node view.\n *\n * @param options\n * @internal\n */\nexport function defineMathInlineView({ render }: MathInlineViewOptions): Extension {\n return defineNodeView({\n name: 'mathInline',\n constructor: (node, view, getPos, decorations) => {\n return createMathInlineView(render, node, decorations)\n },\n })\n}\n\n/**\n * @internal\n */\nexport function defineMathInlineInputRule(): PlainExtension {\n return defineInputRule(createMathInlineInputRule('mathInline'))\n}\n\n/**\n * Options for {@link defineMathInline}.\n *\n * @internal\n */\nexport interface MathInlineOptions {\n /**\n * The function to render the math inline.\n */\n render: RenderMathInline\n}\n\n/**\n * @internal\n */\nexport type MathInlineExtension = Union<[MathInlineSpecExtension]>\n\n/**\n * Defines node `mathInline` and related functionalities.\n *\n * @param options\n * @public\n */\nexport function defineMathInline(options: MathInlineOptions): MathInlineExtension {\n return union(\n defineMathInlineSpec(),\n defineMathInlineView(options),\n defineMathInlineInputRule(),\n )\n}\n","import { definePlugin, type PlainExtension } from '@prosekit/core'\nimport { createCursorInsidePlugin } from 'prosemirror-math'\n\nexport function defineMathPlugin(): PlainExtension {\n return definePlugin(\n createCursorInsidePlugin(),\n )\n}\n","import { union, type Union } from '@prosekit/core'\nimport type { RenderMathBlock, RenderMathInline } from 'prosemirror-math'\n\nimport { defineMathBlock, type MathBlockExtension } from './math-block'\nimport { defineMathInline, type MathInlineExtension } from './math-inline'\nimport { defineMathPlugin } from './math-plugin'\n\n/**\n * @public\n */\nexport type MathExtension = Union<[MathInlineExtension, MathBlockExtension]>\n\n/**\n * Options for {@link defineMath}.\n *\n * @public\n */\nexport interface MathOptions {\n /**\n * The function to render the math block.\n */\n renderMathBlock: RenderMathBlock\n\n /**\n * The function to render the math inline.\n */\n renderMathInline: RenderMathInline\n}\n\n/**\n * @public\n */\nexport function defineMath(options: MathOptions): MathExtension {\n return union(\n defineMathBlock({ render: options.renderMathBlock }),\n defineMathInline({ render: options.renderMathInline }),\n defineMathPlugin(),\n )\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-math.js","names":[],"sources":["../src/math/math-block.ts","../src/math/math-inline.ts","../src/math/math-plugin.ts","../src/math/math.ts"],"sourcesContent":["import { defineNodeSpec, defineNodeView, union, type Extension, type PlainExtension, type Union } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\nimport { createMathBlockView, mathBlockEnterRule, mathBlockSpec, type RenderMathBlock } from 'prosemirror-math'\n\nimport { defineEnterRule } from '../enter-rule/index.ts'\n\n/**\n * @internal\n */\nexport type MathBlockSpecExtension = Extension<{\n Nodes: {\n mathBlock: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineMathBlockSpec(): MathBlockSpecExtension {\n return defineNodeSpec<'mathBlock', Attrs>({\n ...mathBlockSpec,\n attrs: {\n // The language in the `mathBlock` node, useful for syntax highlighting.\n // This library doesn't focus on using the TeX language in a `mathBlock` node,\n // but this is the most common language used for math blocks in rich text\n // editors, so 'tex' is set as the default value.\n language: { default: 'tex', validate: 'string' },\n },\n name: 'mathBlock',\n })\n}\n\n/**\n * Options for {@link defineMathBlockView}.\n *\n * @internal\n */\nexport interface MathBlockViewOptions {\n /**\n * The function to render the math block.\n */\n render: RenderMathBlock\n}\n\n/**\n * Defines an extension that renders a math block using a custom node view.\n *\n * @param options\n * @internal\n */\nexport function defineMathBlockView({ render }: MathBlockViewOptions): Extension {\n return defineNodeView({\n name: 'mathBlock',\n constructor: (node, view, getPos, decorations) => {\n return createMathBlockView(render, node, decorations)\n },\n })\n}\n\n/**\n * @internal\n */\nexport function defineMathBlockEnterRule(): PlainExtension {\n return defineEnterRule(mathBlockEnterRule)\n}\n\n/**\n * Options for {@link defineMathBlock}.\n *\n * @internal\n */\nexport interface MathBlockOptions {\n /**\n * The function to render the math block.\n */\n render: RenderMathBlock\n}\n\n/**\n * @internal\n */\nexport type MathBlockExtension = Union<[MathBlockSpecExtension]>\n\n/**\n * Defines node `mathBlock` and related functionalities.\n *\n * @param options\n * @public\n */\nexport function defineMathBlock(options: MathBlockOptions): MathBlockExtension {\n return union(\n defineMathBlockSpec(),\n defineMathBlockView(options),\n defineMathBlockEnterRule(),\n )\n}\n","import { defineNodeSpec, defineNodeView, union, type Extension, type PlainExtension, type Union } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\nimport { createMathInlineInputRule, createMathInlineView, mathInlineSpec, type RenderMathInline } from 'prosemirror-math'\n\nimport { defineInputRule } from '../input-rule/index.ts'\n\n/**\n * @internal\n */\nexport type MathInlineSpecExtension = Extension<{\n Nodes: {\n mathInline: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function defineMathInlineSpec(): MathInlineSpecExtension {\n return defineNodeSpec<'mathInline', Attrs>({\n ...mathInlineSpec,\n name: 'mathInline',\n })\n}\n\n/**\n * Options for {@link defineMathInlineView}.\n *\n * @internal\n */\nexport interface MathInlineViewOptions {\n /**\n * The function to render the math inline.\n */\n render: RenderMathInline\n}\n\n/**\n * Defines an extension that renders a math inline using a custom node view.\n *\n * @param options\n * @internal\n */\nexport function defineMathInlineView({ render }: MathInlineViewOptions): Extension {\n return defineNodeView({\n name: 'mathInline',\n constructor: (node, view, getPos, decorations) => {\n return createMathInlineView(render, node, decorations)\n },\n })\n}\n\n/**\n * @internal\n */\nexport function defineMathInlineInputRule(): PlainExtension {\n return defineInputRule(createMathInlineInputRule('mathInline'))\n}\n\n/**\n * Options for {@link defineMathInline}.\n *\n * @internal\n */\nexport interface MathInlineOptions {\n /**\n * The function to render the math inline.\n */\n render: RenderMathInline\n}\n\n/**\n * @internal\n */\nexport type MathInlineExtension = Union<[MathInlineSpecExtension]>\n\n/**\n * Defines node `mathInline` and related functionalities.\n *\n * @param options\n * @public\n */\nexport function defineMathInline(options: MathInlineOptions): MathInlineExtension {\n return union(\n defineMathInlineSpec(),\n defineMathInlineView(options),\n defineMathInlineInputRule(),\n )\n}\n","import { definePlugin, type PlainExtension } from '@prosekit/core'\nimport { createCursorInsidePlugin } from 'prosemirror-math'\n\nexport function defineMathPlugin(): PlainExtension {\n return definePlugin(\n createCursorInsidePlugin(),\n )\n}\n","import { union, type Union } from '@prosekit/core'\nimport type { RenderMathBlock, RenderMathInline } from 'prosemirror-math'\n\nimport { defineMathBlock, type MathBlockExtension } from './math-block.ts'\nimport { defineMathInline, type MathInlineExtension } from './math-inline.ts'\nimport { defineMathPlugin } from './math-plugin.ts'\n\n/**\n * @public\n */\nexport type MathExtension = Union<[MathInlineExtension, MathBlockExtension]>\n\n/**\n * Options for {@link defineMath}.\n *\n * @public\n */\nexport interface MathOptions {\n /**\n * The function to render the math block.\n */\n renderMathBlock: RenderMathBlock\n\n /**\n * The function to render the math inline.\n */\n renderMathInline: RenderMathInline\n}\n\n/**\n * @public\n */\nexport function defineMath(options: MathOptions): MathExtension {\n return union(\n defineMathBlock({ render: options.renderMathBlock }),\n defineMathInline({ render: options.renderMathInline }),\n defineMathPlugin(),\n )\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,sBAA8C;AAC5D,QAAO,eAAmC;EACxC,GAAG;EACH,OAAO,EAKL,UAAU;GAAE,SAAS;GAAO,UAAU;GAAU,EACjD;EACD,MAAM;EACP,CAAC;;;;;;;;AAqBJ,SAAgB,oBAAoB,EAAE,UAA2C;AAC/E,QAAO,eAAe;EACpB,MAAM;EACN,cAAc,MAAM,MAAM,QAAQ,gBAAgB;AAChD,UAAO,oBAAoB,QAAQ,MAAM,YAAY;;EAExD,CAAC;;;;;AAMJ,SAAgB,2BAA2C;AACzD,QAAO,gBAAgB,mBAAmB;;;;;;;;AA0B5C,SAAgB,gBAAgB,SAA+C;AAC7E,QAAO,MACL,qBAAqB,EACrB,oBAAoB,QAAQ,EAC5B,0BAA0B,CAC3B;;;;;;;AC5EH,SAAgB,uBAAgD;AAC9D,QAAO,eAAoC;EACzC,GAAG;EACH,MAAM;EACP,CAAC;;;;;;;;AAqBJ,SAAgB,qBAAqB,EAAE,UAA4C;AACjF,QAAO,eAAe;EACpB,MAAM;EACN,cAAc,MAAM,MAAM,QAAQ,gBAAgB;AAChD,UAAO,qBAAqB,QAAQ,MAAM,YAAY;;EAEzD,CAAC;;;;;AAMJ,SAAgB,4BAA4C;AAC1D,QAAO,gBAAgB,0BAA0B,aAAa,CAAC;;;;;;;;AA0BjE,SAAgB,iBAAiB,SAAiD;AAChF,QAAO,MACL,sBAAsB,EACtB,qBAAqB,QAAQ,EAC7B,2BAA2B,CAC5B;;;;ACpFH,SAAgB,mBAAmC;AACjD,QAAO,aACL,0BAA0B,CAC3B;;;;;;;AC0BH,SAAgB,WAAW,SAAqC;AAC9D,QAAO,MACL,gBAAgB,EAAE,QAAQ,QAAQ,iBAAiB,CAAC,EACpD,iBAAiB,EAAE,QAAQ,QAAQ,kBAAkB,CAAC,EACtD,kBAAkB,CACnB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineCommands, defineNodeSpec, insertNode, union } from "@prosekit/core";
|
|
2
|
-
|
|
3
2
|
//#region src/mention/index.ts
|
|
4
3
|
/**
|
|
5
4
|
* @public
|
|
@@ -53,7 +52,7 @@ function defineMentionCommands() {
|
|
|
53
52
|
function defineMention() {
|
|
54
53
|
return union(defineMentionSpec(), defineMentionCommands());
|
|
55
54
|
}
|
|
56
|
-
|
|
57
55
|
//#endregion
|
|
58
56
|
export { defineMention, defineMentionCommands, defineMentionSpec };
|
|
57
|
+
|
|
59
58
|
//# sourceMappingURL=prosekit-extensions-mention.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-mention.js","names":[],"sources":["../src/mention/index.ts"],"sourcesContent":["import { defineCommands, defineNodeSpec, insertNode, union, type Extension, type Union } from '@prosekit/core'\n\nexport interface MentionAttrs {\n id: string\n value: string\n kind: string\n}\n\n/**\n * @internal\n */\nexport type MentionSpecExtension = Extension<{\n Nodes: {\n mention: MentionAttrs\n }\n}>\n\n/**\n * @public\n */\nexport function defineMentionSpec(): MentionSpecExtension {\n return defineNodeSpec<'mention', MentionAttrs>({\n name: 'mention',\n atom: true,\n group: 'inline',\n attrs: {\n id: { validate: 'string' },\n value: { validate: 'string' },\n kind: { default: '', validate: 'string' },\n },\n inline: true,\n leafText: (node) => (node.attrs as MentionAttrs).value.toString(),\n parseDOM: [\n {\n tag: `span[data-mention]`,\n getAttrs: (dom: HTMLElement): MentionAttrs => ({\n id: dom.getAttribute('data-id') || '',\n kind: dom.getAttribute('data-mention') || '',\n value: dom.textContent || '',\n }),\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-id': (node.attrs as MentionAttrs).id.toString(),\n 'data-mention': (node.attrs as MentionAttrs).kind.toString(),\n },\n (node.attrs as MentionAttrs).value.toString(),\n ]\n },\n })\n}\n\n/**\n * @internal\n */\nexport type MentionCommandsExtension = Extension<{\n Commands: {\n insertMention: [attrs: MentionAttrs]\n }\n}>\n\nexport function defineMentionCommands(): MentionCommandsExtension {\n return defineCommands({\n insertMention: (attrs: MentionAttrs) => {\n return insertNode({ type: 'mention', attrs })\n },\n })\n}\n\n/**\n * @internal\n */\nexport type MentionExtension = Union<[MentionSpecExtension, MentionCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineMention(): MentionExtension {\n return union(defineMentionSpec(), defineMentionCommands())\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-mention.js","names":[],"sources":["../src/mention/index.ts"],"sourcesContent":["import { defineCommands, defineNodeSpec, insertNode, union, type Extension, type Union } from '@prosekit/core'\n\nexport interface MentionAttrs {\n id: string\n value: string\n kind: string\n}\n\n/**\n * @internal\n */\nexport type MentionSpecExtension = Extension<{\n Nodes: {\n mention: MentionAttrs\n }\n}>\n\n/**\n * @public\n */\nexport function defineMentionSpec(): MentionSpecExtension {\n return defineNodeSpec<'mention', MentionAttrs>({\n name: 'mention',\n atom: true,\n group: 'inline',\n attrs: {\n id: { validate: 'string' },\n value: { validate: 'string' },\n kind: { default: '', validate: 'string' },\n },\n inline: true,\n leafText: (node) => (node.attrs as MentionAttrs).value.toString(),\n parseDOM: [\n {\n tag: `span[data-mention]`,\n getAttrs: (dom: HTMLElement): MentionAttrs => ({\n id: dom.getAttribute('data-id') || '',\n kind: dom.getAttribute('data-mention') || '',\n value: dom.textContent || '',\n }),\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-id': (node.attrs as MentionAttrs).id.toString(),\n 'data-mention': (node.attrs as MentionAttrs).kind.toString(),\n },\n (node.attrs as MentionAttrs).value.toString(),\n ]\n },\n })\n}\n\n/**\n * @internal\n */\nexport type MentionCommandsExtension = Extension<{\n Commands: {\n insertMention: [attrs: MentionAttrs]\n }\n}>\n\nexport function defineMentionCommands(): MentionCommandsExtension {\n return defineCommands({\n insertMention: (attrs: MentionAttrs) => {\n return insertNode({ type: 'mention', attrs })\n },\n })\n}\n\n/**\n * @internal\n */\nexport type MentionExtension = Union<[MentionSpecExtension, MentionCommandsExtension]>\n\n/**\n * @public\n */\nexport function defineMention(): MentionExtension {\n return union(defineMentionSpec(), defineMentionCommands())\n}\n"],"mappings":";;;;;AAoBA,SAAgB,oBAA0C;AACxD,QAAO,eAAwC;EAC7C,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;GACL,IAAI,EAAE,UAAU,UAAU;GAC1B,OAAO,EAAE,UAAU,UAAU;GAC7B,MAAM;IAAE,SAAS;IAAI,UAAU;IAAU;GAC1C;EACD,QAAQ;EACR,WAAW,SAAU,KAAK,MAAuB,MAAM,UAAU;EACjE,UAAU,CACR;GACE,KAAK;GACL,WAAW,SAAoC;IAC7C,IAAI,IAAI,aAAa,UAAU,IAAI;IACnC,MAAM,IAAI,aAAa,eAAe,IAAI;IAC1C,OAAO,IAAI,eAAe;IAC3B;GACF,CACF;EACD,MAAM,MAAM;AACV,UAAO;IACL;IACA;KACE,WAAY,KAAK,MAAuB,GAAG,UAAU;KACrD,gBAAiB,KAAK,MAAuB,KAAK,UAAU;KAC7D;IACA,KAAK,MAAuB,MAAM,UAAU;IAC9C;;EAEJ,CAAC;;AAYJ,SAAgB,wBAAkD;AAChE,QAAO,eAAe,EACpB,gBAAgB,UAAwB;AACtC,SAAO,WAAW;GAAE,MAAM;GAAW;GAAO,CAAC;IAEhD,CAAC;;;;;AAWJ,SAAgB,gBAAkC;AAChD,QAAO,MAAM,mBAAmB,EAAE,uBAAuB,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { definePlugin, isApple } from "@prosekit/core";
|
|
2
1
|
import { Plugin, PluginKey } from "@prosekit/pm/state";
|
|
3
|
-
|
|
2
|
+
import { definePlugin, isApple } from "@prosekit/core";
|
|
4
3
|
//#region src/mod-click-prevention/index.ts
|
|
5
4
|
/**
|
|
6
5
|
* By default, clicking a node while holding the mod key will select the node. This
|
|
@@ -19,7 +18,7 @@ function handleClick(_view, _pos, event) {
|
|
|
19
18
|
return !!event[selectNodeModifier];
|
|
20
19
|
}
|
|
21
20
|
const selectNodeModifier = isApple ? "metaKey" : "ctrlKey";
|
|
22
|
-
|
|
23
21
|
//#endregion
|
|
24
22
|
export { defineModClickPrevention };
|
|
23
|
+
|
|
25
24
|
//# sourceMappingURL=prosekit-extensions-mod-click-prevention.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosekit-extensions-mod-click-prevention.js","names":[],"sources":["../src/mod-click-prevention/index.ts"],"sourcesContent":["import { definePlugin, isApple, type PlainExtension } from '@prosekit/core'\nimport { Plugin, PluginKey } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\n/**\n * @internal\n */\nexport type ModClickPreventionExtension = PlainExtension\n\n/**\n * By default, clicking a node while holding the mod key will select the node. This\n * extension disables that behavior.\n *\n * @public\n */\nexport function defineModClickPrevention(): ModClickPreventionExtension {\n return definePlugin(new Plugin({ key, props: { handleClick } }))\n}\n\nconst key = new PluginKey('prosekit-mod-click-prevention')\n\nfunction handleClick(_view: EditorView, _pos: number, event: MouseEvent) {\n return !!event[selectNodeModifier]\n}\n\nconst selectNodeModifier: 'metaKey' | 'ctrlKey' = isApple\n ? 'metaKey'\n : 'ctrlKey'\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-mod-click-prevention.js","names":[],"sources":["../src/mod-click-prevention/index.ts"],"sourcesContent":["import { definePlugin, isApple, type PlainExtension } from '@prosekit/core'\nimport { Plugin, PluginKey } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\n/**\n * @internal\n */\nexport type ModClickPreventionExtension = PlainExtension\n\n/**\n * By default, clicking a node while holding the mod key will select the node. This\n * extension disables that behavior.\n *\n * @public\n */\nexport function defineModClickPrevention(): ModClickPreventionExtension {\n return definePlugin(new Plugin({ key, props: { handleClick } }))\n}\n\nconst key = new PluginKey('prosekit-mod-click-prevention')\n\nfunction handleClick(_view: EditorView, _pos: number, event: MouseEvent) {\n return !!event[selectNodeModifier]\n}\n\nconst selectNodeModifier: 'metaKey' | 'ctrlKey' = isApple\n ? 'metaKey'\n : 'ctrlKey'\n"],"mappings":";;;;;;;;;AAeA,SAAgB,2BAAwD;AACtE,QAAO,aAAa,IAAI,OAAO;EAAE;EAAK,OAAO,EAAE,aAAa;EAAE,CAAC,CAAC;;AAGlE,MAAM,MAAM,IAAI,UAAU,gCAAgC;AAE1D,SAAS,YAAY,OAAmB,MAAc,OAAmB;AACvE,QAAO,CAAC,CAAC,MAAM;;AAGjB,MAAM,qBAA4C,UAC9C,YACA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Command } from "@prosekit/pm/state";
|
|
2
|
+
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
3
|
+
import { Attrs } from "@prosekit/pm/model";
|
|
4
|
+
|
|
5
|
+
//#region src/page/page-break-commands.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
type PageBreakCommandsExtension = Extension<{
|
|
10
|
+
Commands: {
|
|
11
|
+
insertPageBreak: [];
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
declare function insertPageBreak(): Command;
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
declare function definePageBreakCommands(): PageBreakCommandsExtension;
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/page/page-break-keymap.d.ts
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
type PageBreakKeymapExtension = PlainExtension;
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
declare function definePageBreakKeymap(): PageBreakKeymapExtension;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/page/page-break-spec.d.ts
|
|
34
|
+
/**
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
type PageBreakSpecExtension = Extension<{
|
|
38
|
+
Nodes: {
|
|
39
|
+
pageBreak: Attrs;
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
declare function definePageBreakSpec(): PageBreakSpecExtension;
|
|
46
|
+
declare module '@prosekit/pm/model' {
|
|
47
|
+
interface NodeSpec {
|
|
48
|
+
pageBreak?: boolean | undefined;
|
|
49
|
+
}
|
|
50
|
+
} //# sourceMappingURL=page-break-spec.d.ts.map
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/page/page-break.d.ts
|
|
53
|
+
/**
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
type PageBreakExtension = Union<[PageBreakSpecExtension, PageBreakCommandsExtension, PageBreakKeymapExtension]>;
|
|
57
|
+
/**
|
|
58
|
+
* @public
|
|
59
|
+
*/
|
|
60
|
+
declare function definePageBreak(): PageBreakExtension;
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region src/page/page-rendering.d.ts
|
|
63
|
+
/**
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
interface PageRenderingOptions {
|
|
67
|
+
/**
|
|
68
|
+
* The width of the page in px.
|
|
69
|
+
*
|
|
70
|
+
* @default 794 (Portrait A4 paper size in 96 DPI)
|
|
71
|
+
*/
|
|
72
|
+
pageWidth?: number;
|
|
73
|
+
/**
|
|
74
|
+
* The height of the page in px.
|
|
75
|
+
*
|
|
76
|
+
* @default 1123 (Portrait A4 paper size in 96 DPI)
|
|
77
|
+
*/
|
|
78
|
+
pageHeight?: number;
|
|
79
|
+
/**
|
|
80
|
+
* The top margin of the page in px.
|
|
81
|
+
*
|
|
82
|
+
* @default 70
|
|
83
|
+
*/
|
|
84
|
+
marginTop?: number;
|
|
85
|
+
/**
|
|
86
|
+
* The right margin of the page in px.
|
|
87
|
+
*
|
|
88
|
+
* @default 70
|
|
89
|
+
*/
|
|
90
|
+
marginRight?: number;
|
|
91
|
+
/**
|
|
92
|
+
* The bottom margin of the page in px.
|
|
93
|
+
*
|
|
94
|
+
* @default 70
|
|
95
|
+
*/
|
|
96
|
+
marginBottom?: number;
|
|
97
|
+
/**
|
|
98
|
+
* The left margin of the page in px.
|
|
99
|
+
*
|
|
100
|
+
* @default 70
|
|
101
|
+
*/
|
|
102
|
+
marginLeft?: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @public
|
|
106
|
+
*/
|
|
107
|
+
declare function definePageRendering(options?: PageRenderingOptions): PageRenderingExtension;
|
|
108
|
+
/**
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
type PageRenderingExtension = Extension;
|
|
112
|
+
//#endregion
|
|
113
|
+
export { type PageBreakCommandsExtension, type PageBreakExtension, type PageBreakKeymapExtension, type PageBreakSpecExtension, type PageRenderingExtension, type PageRenderingOptions, definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
|
|
114
|
+
//# sourceMappingURL=prosekit-extensions-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-page.d.ts","names":[],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-rendering.ts"],"mappings":";;;;;;;;KAOY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,eAAA;EAAA;AAAA;;;;iBAoBY,eAAA,CAAA,GAAmB,OAAA;AAAnC;;;AAAA,iBAOgB,uBAAA,CAAA,GAA2B,0BAAA;;;;;;KC7B/B,wBAAA,GAA2B,cAAA;ADAvC;;;AAAA,iBCKgB,qBAAA,CAAA,GAAyB,wBAAA;;;;;;KCN7B,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;AAAA;EAAA,UAc3B,QAAA;IACR,SAAA;EAAA;AAAA;;;;AFvBJ;;KGEY,kBAAA,GAAqB,KAAA,EAC9B,sBAAA,EAAwB,0BAAA,EAA4B,wBAAA;;;AHmBvD;iBGbgB,eAAA,CAAA,GAAmB,kBAAA;;;;;;UCLlB,oBAAA;EJJL;;;;;EIUV,SAAA;EJRE;;;AAoBJ;;EILE,UAAA;EJKiC;;AAOnC;;;EILE,SAAA;EJKmE;;;;AC7BrE;EG+BE,WAAA;;;;AH1BF;;EGiCE,YAAA;EHjCuC;;;;;EGwCvC,UAAA;AAAA;;;;iBAMc,mBAAA,CAAoB,OAAA,GAAS,oBAAA,GAA4B,sBAAA;;;;KAS7D,sBAAA,GAAyB,SAAA"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { Plugin, PluginKey } from "@prosekit/pm/state";
|
|
2
|
+
import { defineCommands, defineKeymap, defineNodeSpec, definePlugin, getNodeType, union } from "@prosekit/core";
|
|
3
|
+
import { Decoration, DecorationSet } from "@prosekit/pm/view";
|
|
4
|
+
import { Fragment, Slice } from "@prosekit/pm/model";
|
|
5
|
+
import { getId, once } from "@ocavue/utils";
|
|
6
|
+
import { HTMLElement, customElements } from "server-dom-shim";
|
|
7
|
+
//#region src/page/page-break-commands.ts
|
|
8
|
+
const insertPageBreakCommand = (state, dispatch) => {
|
|
9
|
+
if (!dispatch) return true;
|
|
10
|
+
const { schema, tr } = state;
|
|
11
|
+
const node = getNodeType(schema, "pageBreak").createChecked();
|
|
12
|
+
const pos = tr.selection.anchor;
|
|
13
|
+
const slice = new Slice(Fragment.from(node), 0, 0);
|
|
14
|
+
tr.replaceRange(pos, pos, slice).scrollIntoView();
|
|
15
|
+
dispatch(tr);
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
function insertPageBreak() {
|
|
22
|
+
return insertPageBreakCommand;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
function definePageBreakCommands() {
|
|
28
|
+
return defineCommands({ insertPageBreak });
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/page/page-break-keymap.ts
|
|
32
|
+
/**
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
function definePageBreakKeymap() {
|
|
36
|
+
return defineKeymap({ "Mod-Enter": insertPageBreak() });
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/page/page-break-spec.ts
|
|
40
|
+
/**
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
function definePageBreakSpec() {
|
|
44
|
+
return defineNodeSpec({
|
|
45
|
+
name: "pageBreak",
|
|
46
|
+
group: "block",
|
|
47
|
+
selectable: true,
|
|
48
|
+
parseDOM: [{ tag: "div.prosekit-page-break" }],
|
|
49
|
+
toDOM() {
|
|
50
|
+
return [
|
|
51
|
+
"div",
|
|
52
|
+
{ class: "prosekit-horizontal-rule prosekit-page-break" },
|
|
53
|
+
["hr"]
|
|
54
|
+
];
|
|
55
|
+
},
|
|
56
|
+
pageBreak: true
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/page/page-break.ts
|
|
61
|
+
/**
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
function definePageBreak() {
|
|
65
|
+
return union(definePageBreakSpec(), definePageBreakCommands(), definePageBreakKeymap());
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/page/page-element.ts
|
|
69
|
+
/**
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
const PAGE_CHUNK_TAG_NAME = "pm-page-chunk";
|
|
73
|
+
/**
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
const registerPageChunkElement = /* @__PURE__ */ once(() => {
|
|
77
|
+
if (typeof window === "undefined" || customElements.get("pm-page-chunk")) return;
|
|
78
|
+
customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement);
|
|
79
|
+
});
|
|
80
|
+
var PageChunkElement = class extends HTMLElement {
|
|
81
|
+
static {
|
|
82
|
+
this.observedAttributes = [
|
|
83
|
+
"data-group",
|
|
84
|
+
"data-break",
|
|
85
|
+
"data-h",
|
|
86
|
+
"data-mt",
|
|
87
|
+
"data-mb",
|
|
88
|
+
"data-size"
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
#group = "";
|
|
92
|
+
#forceNextBreak = false;
|
|
93
|
+
#pageHeight = 0;
|
|
94
|
+
#pageMarginTop = 0;
|
|
95
|
+
#pageMarginBottom = 0;
|
|
96
|
+
#size = void 0;
|
|
97
|
+
#updateRequested = false;
|
|
98
|
+
#contentBoxHeight = 0;
|
|
99
|
+
#isHead = false;
|
|
100
|
+
#isTail = false;
|
|
101
|
+
#paddingTop = 0;
|
|
102
|
+
#paddingBottom = 0;
|
|
103
|
+
#isHeadPending = false;
|
|
104
|
+
#isTailPending = false;
|
|
105
|
+
#paddingTopPending = 0;
|
|
106
|
+
#paddingBottomPending = 0;
|
|
107
|
+
connectedCallback() {
|
|
108
|
+
this.#parseDataAttributes();
|
|
109
|
+
if (this.#isLeader()) this.#isHeadPending = true;
|
|
110
|
+
this.#render();
|
|
111
|
+
this.#contentBoxHeight = this.clientHeight - this.#paddingTop - this.#paddingBottom;
|
|
112
|
+
observeElement(this);
|
|
113
|
+
this.#requestUpdate();
|
|
114
|
+
}
|
|
115
|
+
disconnectedCallback() {
|
|
116
|
+
unobserveElement(this);
|
|
117
|
+
}
|
|
118
|
+
attributeChangedCallback(_, oldValue, newValue) {
|
|
119
|
+
if (oldValue === newValue) return;
|
|
120
|
+
this.#parseDataAttributes();
|
|
121
|
+
this.#requestUpdate();
|
|
122
|
+
}
|
|
123
|
+
#parseDataAttributes() {
|
|
124
|
+
this.#group = this.getAttribute("data-group") || "";
|
|
125
|
+
this.#forceNextBreak = this.hasAttribute("data-break");
|
|
126
|
+
this.#pageHeight = this.#parseFloatAttribute("data-h");
|
|
127
|
+
this.#pageMarginTop = this.#parseFloatAttribute("data-mt");
|
|
128
|
+
this.#pageMarginBottom = this.#parseFloatAttribute("data-mb");
|
|
129
|
+
const sizeAttr = this.getAttribute("data-size");
|
|
130
|
+
this.#size = sizeAttr ? Number.parseInt(sizeAttr, 10) : void 0;
|
|
131
|
+
}
|
|
132
|
+
#parseFloatAttribute(name) {
|
|
133
|
+
const value = this.getAttribute(name);
|
|
134
|
+
return value != null ? Number.parseFloat(value) : 0;
|
|
135
|
+
}
|
|
136
|
+
#isLeader() {
|
|
137
|
+
return this.#size != null;
|
|
138
|
+
}
|
|
139
|
+
#render() {
|
|
140
|
+
if (this.#paddingTop !== this.#paddingTopPending || this.#paddingBottom !== this.#paddingBottomPending) Object.assign(this.style, {
|
|
141
|
+
paddingTop: `${this.#paddingTop = this.#paddingTopPending}px`,
|
|
142
|
+
paddingBottom: `${this.#paddingBottom = this.#paddingBottomPending}px`
|
|
143
|
+
});
|
|
144
|
+
if (this.#isHead !== this.#isHeadPending) this.toggleAttribute("data-page-head", this.#isHead = this.#isHeadPending);
|
|
145
|
+
if (this.#isTail !== this.#isTailPending) this.toggleAttribute("data-page-tail", this.#isTail = this.#isTailPending);
|
|
146
|
+
}
|
|
147
|
+
setHeight(height) {
|
|
148
|
+
if (Math.abs(this.#contentBoxHeight - height) < .1) return;
|
|
149
|
+
this.#contentBoxHeight = height;
|
|
150
|
+
this.#requestUpdate();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Schedules a batched page layout recalculation.
|
|
154
|
+
*
|
|
155
|
+
* Any chunk can call this method, but the actual layout work (#updateAll)
|
|
156
|
+
* always runs on the leader chunk, because it needs to iterate over every
|
|
157
|
+
* chunk in order to compute page breaks.
|
|
158
|
+
*
|
|
159
|
+
* Two nested microtasks are used to batch updates:
|
|
160
|
+
*
|
|
161
|
+
* Microtask 1 – Delegation: non-leader chunks forward the request to the
|
|
162
|
+
* leader chunk, so multiple chunks changing in the same tick only trigger
|
|
163
|
+
* one layout pass.
|
|
164
|
+
*
|
|
165
|
+
* Microtask 2 – Execution: the leader chunk defers #updateAll to a second
|
|
166
|
+
* microtask so that any other attribute / resize changes that were queued
|
|
167
|
+
* in the same tick (and forwarded during microtask 1) are already reflected
|
|
168
|
+
* before the layout is recalculated.
|
|
169
|
+
*
|
|
170
|
+
* The #updateRequested flag acts as a deduplication guard so that rapid
|
|
171
|
+
* successive calls (e.g. multiple attributes changing at once) result in at
|
|
172
|
+
* most one scheduled pass per chunk.
|
|
173
|
+
*/
|
|
174
|
+
#requestUpdate() {
|
|
175
|
+
if (this.#updateRequested) return;
|
|
176
|
+
this.#updateRequested = true;
|
|
177
|
+
queueMicrotask(() => {
|
|
178
|
+
if (!this.#isLeader()) {
|
|
179
|
+
this.#updateRequested = false;
|
|
180
|
+
const leader = findLeaderChunk(this, this.#group);
|
|
181
|
+
if (!leader) return;
|
|
182
|
+
leader.#requestUpdate();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
queueMicrotask(() => {
|
|
186
|
+
this.#updateRequested = false;
|
|
187
|
+
this.#updateAll();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
#updateAll() {
|
|
192
|
+
if (!this.isConnected) return;
|
|
193
|
+
const elements = findAllChunks(this, this.#group);
|
|
194
|
+
const count = elements.length;
|
|
195
|
+
if (count === 0) return;
|
|
196
|
+
const pageHeight = this.#pageHeight;
|
|
197
|
+
const pageMarginTop = this.#pageMarginTop;
|
|
198
|
+
const maxContentHeight = pageHeight - pageMarginTop - this.#pageMarginBottom;
|
|
199
|
+
let currentContentHeight = 0;
|
|
200
|
+
let forceNextBreak = false;
|
|
201
|
+
for (let i = 0; i < count; i++) {
|
|
202
|
+
const element = elements[i];
|
|
203
|
+
const h = element.#contentBoxHeight;
|
|
204
|
+
const isHead = forceNextBreak || i === 0 || currentContentHeight + h > maxContentHeight;
|
|
205
|
+
forceNextBreak = element.#forceNextBreak;
|
|
206
|
+
if (isHead && i > 0) {
|
|
207
|
+
const prev = elements[i - 1];
|
|
208
|
+
prev.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight);
|
|
209
|
+
prev.#isTailPending = true;
|
|
210
|
+
currentContentHeight = h;
|
|
211
|
+
} else currentContentHeight += h;
|
|
212
|
+
element.#paddingTopPending = isHead ? pageMarginTop : 0;
|
|
213
|
+
element.#paddingBottomPending = 0;
|
|
214
|
+
element.#isTailPending = false;
|
|
215
|
+
element.#isHeadPending = isHead;
|
|
216
|
+
}
|
|
217
|
+
const last = elements[count - 1];
|
|
218
|
+
last.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight);
|
|
219
|
+
last.#isTailPending = true;
|
|
220
|
+
for (const element of elements) element.#render();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
function handleResize(entries) {
|
|
224
|
+
for (const entry of entries) {
|
|
225
|
+
const contentBoxHeight = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height;
|
|
226
|
+
entry.target.setHeight(contentBoxHeight);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const getResizeObserver = /* @__PURE__ */ once(() => {
|
|
230
|
+
return new ResizeObserver(handleResize);
|
|
231
|
+
});
|
|
232
|
+
function observeElement(element) {
|
|
233
|
+
getResizeObserver().observe(element);
|
|
234
|
+
}
|
|
235
|
+
function unobserveElement(element) {
|
|
236
|
+
getResizeObserver().unobserve(element);
|
|
237
|
+
}
|
|
238
|
+
function findLeaderChunk(element, group) {
|
|
239
|
+
return element.closest(".ProseMirror")?.querySelector(`${PAGE_CHUNK_TAG_NAME}[data-group="${group}"][data-size]`);
|
|
240
|
+
}
|
|
241
|
+
function findAllChunks(element, group) {
|
|
242
|
+
const elements = element.closest(".ProseMirror")?.querySelectorAll(`${PAGE_CHUNK_TAG_NAME}[data-group="${group}"]`);
|
|
243
|
+
return Array.from(elements || []);
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/page/page-rendering.ts
|
|
247
|
+
/**
|
|
248
|
+
* @public
|
|
249
|
+
*/
|
|
250
|
+
function definePageRendering(options = {}) {
|
|
251
|
+
return definePlugin(createPageRenderingPlugin(options));
|
|
252
|
+
}
|
|
253
|
+
function createPageRenderingPlugin(options) {
|
|
254
|
+
const { pageWidth = 794, pageHeight = 1123, marginTop = 70, marginRight = 70, marginBottom = 70, marginLeft = 70 } = options;
|
|
255
|
+
const key = new PluginKey("prosekit-page-render");
|
|
256
|
+
function createDecorationSet(doc, group) {
|
|
257
|
+
const decorations = [];
|
|
258
|
+
const totalCount = doc.childCount;
|
|
259
|
+
doc.forEach((node, pos, index) => {
|
|
260
|
+
const isPageBreak = node.type.spec.pageBreak;
|
|
261
|
+
decorations.push(Decoration.node(pos, pos + node.nodeSize, {
|
|
262
|
+
"nodeName": PAGE_CHUNK_TAG_NAME,
|
|
263
|
+
"data-group": group,
|
|
264
|
+
"data-break": isPageBreak ? "true" : void 0,
|
|
265
|
+
"data-h": String(pageHeight),
|
|
266
|
+
"data-mt": String(marginTop),
|
|
267
|
+
"data-mb": String(marginBottom),
|
|
268
|
+
"data-size": index === 0 ? String(totalCount) : void 0
|
|
269
|
+
}));
|
|
270
|
+
});
|
|
271
|
+
return DecorationSet.create(doc, decorations);
|
|
272
|
+
}
|
|
273
|
+
return new Plugin({
|
|
274
|
+
key,
|
|
275
|
+
view: () => {
|
|
276
|
+
registerPageChunkElement();
|
|
277
|
+
return {};
|
|
278
|
+
},
|
|
279
|
+
state: {
|
|
280
|
+
init: (_config, state) => {
|
|
281
|
+
const group = `page-group-${getId()}`;
|
|
282
|
+
return [group, createDecorationSet(state.doc, group)];
|
|
283
|
+
},
|
|
284
|
+
apply: (tr, value, oldState, newState) => {
|
|
285
|
+
if (!tr.docChanged) return value;
|
|
286
|
+
const [group, decoration] = value;
|
|
287
|
+
let needRecreate = oldState.doc.childCount !== newState.doc.childCount;
|
|
288
|
+
if (!needRecreate) {
|
|
289
|
+
const count = oldState.doc.childCount;
|
|
290
|
+
for (let i = 0; i < count; i++) {
|
|
291
|
+
const oldNode = oldState.doc.child(i);
|
|
292
|
+
const newNode = newState.doc.child(i);
|
|
293
|
+
if (oldNode.type !== newNode.type) {
|
|
294
|
+
needRecreate = true;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (!needRecreate) {
|
|
300
|
+
const mapped = decoration.map(tr.mapping, tr.doc, { onRemove: () => {
|
|
301
|
+
needRecreate = true;
|
|
302
|
+
} });
|
|
303
|
+
if (!needRecreate) return [group, mapped];
|
|
304
|
+
}
|
|
305
|
+
return [group, createDecorationSet(newState.doc, group)];
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
props: {
|
|
309
|
+
decorations: (state) => {
|
|
310
|
+
return key.getState(state)?.[1];
|
|
311
|
+
},
|
|
312
|
+
attributes: { style: [
|
|
313
|
+
`--page-margin-right:${marginRight}px;`,
|
|
314
|
+
`--page-margin-left:${marginLeft}px;`,
|
|
315
|
+
`--page-width:${pageWidth}px;`,
|
|
316
|
+
`--page-height:${pageHeight}px;`
|
|
317
|
+
].join("") }
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
//#endregion
|
|
322
|
+
export { definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
|
|
323
|
+
|
|
324
|
+
//# sourceMappingURL=prosekit-extensions-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prosekit-extensions-page.js","names":["#parseDataAttributes","#isLeader","#isHeadPending","#render","#contentBoxHeight","#paddingTop","#paddingBottom","#requestUpdate","#group","#forceNextBreak","#pageHeight","#parseFloatAttribute","#pageMarginTop","#pageMarginBottom","#size","#paddingTopPending","#paddingBottomPending","#isHead","#isTail","#isTailPending","#updateRequested","#updateAll"],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-element.ts","../src/page/page-rendering.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\n/**\n * @internal\n */\nexport type PageBreakCommandsExtension = Extension<{\n Commands: {\n insertPageBreak: []\n }\n}>\n\nconst insertPageBreakCommand: Command = (state, dispatch): boolean => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'pageBreak')\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 * @internal\n */\nexport function insertPageBreak(): Command {\n return insertPageBreakCommand\n}\n\n/**\n * @internal\n */\nexport function definePageBreakCommands(): PageBreakCommandsExtension {\n return defineCommands({\n insertPageBreak: insertPageBreak,\n })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { insertPageBreak } from './page-break-commands.ts'\n\n/**\n * @internal\n */\nexport type PageBreakKeymapExtension = PlainExtension\n\n/**\n * @internal\n */\nexport function definePageBreakKeymap(): PageBreakKeymapExtension {\n return defineKeymap({\n 'Mod-Enter': insertPageBreak(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type PageBreakSpecExtension = Extension<{\n Nodes: {\n pageBreak: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function definePageBreakSpec(): PageBreakSpecExtension {\n return defineNodeSpec({\n name: 'pageBreak',\n group: 'block',\n selectable: true,\n parseDOM: [{ tag: 'div.prosekit-page-break' }],\n toDOM() {\n return ['div', { class: 'prosekit-horizontal-rule prosekit-page-break' }, ['hr']]\n },\n pageBreak: true,\n })\n}\n\ndeclare module '@prosekit/pm/model' {\n interface NodeSpec {\n pageBreak?: boolean | undefined\n }\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { definePageBreakCommands, type PageBreakCommandsExtension } from './page-break-commands.ts'\nimport { definePageBreakKeymap, type PageBreakKeymapExtension } from './page-break-keymap.ts'\nimport { definePageBreakSpec, type PageBreakSpecExtension } from './page-break-spec.ts'\n\n/**\n * @internal\n */\nexport type PageBreakExtension = Union<\n [PageBreakSpecExtension, PageBreakCommandsExtension, PageBreakKeymapExtension]\n>\n\n/**\n * @public\n */\nexport function definePageBreak(): PageBreakExtension {\n return union(\n definePageBreakSpec(),\n definePageBreakCommands(),\n definePageBreakKeymap(),\n )\n}\n","import { once } from '@ocavue/utils'\nimport { customElements, HTMLElement } from 'server-dom-shim'\n\n/**\n * @internal\n */\nexport const PAGE_CHUNK_TAG_NAME = 'pm-page-chunk'\n\n/**\n * @internal\n */\nexport const registerPageChunkElement: VoidFunction = /* @__PURE__ */ once(() => {\n if (typeof window === 'undefined' || customElements.get(PAGE_CHUNK_TAG_NAME)) return\n customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement)\n})\n\nclass PageChunkElement extends HTMLElement {\n static observedAttributes = [\n 'data-group',\n 'data-break',\n 'data-h',\n 'data-mt',\n 'data-mb',\n\n // Only the first chunk of the whole document has this attribute.\n 'data-size',\n ]\n\n // Data attributes set by external code\n #group: string = ''\n #forceNextBreak: boolean = false\n #pageHeight: number = 0\n #pageMarginTop: number = 0\n #pageMarginBottom: number = 0\n #size: number | undefined = undefined\n\n // Internal states\n #updateRequested: boolean = false\n #contentBoxHeight: number = 0\n\n // Rendering states\n #isHead: boolean = false\n #isTail: boolean = false\n #paddingTop: number = 0\n #paddingBottom: number = 0\n\n // Pending rendering states\n #isHeadPending: boolean = false\n #isTailPending: boolean = false\n #paddingTopPending: number = 0\n #paddingBottomPending: number = 0\n\n connectedCallback() {\n this.#parseDataAttributes()\n\n if (this.#isLeader()) {\n this.#isHeadPending = true\n }\n\n this.#render()\n\n // Get the initial content box height when the resize observer is not started yet. Notice that\n // `this.clientHeight` is an integer while the content box height can be a float, so this is not\n // accurate but should be good enough for the first render.\n this.#contentBoxHeight = this.clientHeight - this.#paddingTop - this.#paddingBottom\n\n observeElement(this)\n\n this.#requestUpdate()\n }\n\n disconnectedCallback() {\n unobserveElement(this)\n }\n\n attributeChangedCallback(_: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return\n this.#parseDataAttributes()\n this.#requestUpdate()\n }\n\n #parseDataAttributes() {\n this.#group = this.getAttribute('data-group') || ''\n this.#forceNextBreak = this.hasAttribute('data-break')\n this.#pageHeight = this.#parseFloatAttribute('data-h')\n this.#pageMarginTop = this.#parseFloatAttribute('data-mt')\n this.#pageMarginBottom = this.#parseFloatAttribute('data-mb')\n\n const sizeAttr = this.getAttribute('data-size')\n this.#size = sizeAttr ? Number.parseInt(sizeAttr, 10) : undefined\n }\n\n #parseFloatAttribute(name: string): number {\n const value = this.getAttribute(name)\n return value != null ? Number.parseFloat(value) : 0\n }\n\n #isLeader() {\n return this.#size != null\n }\n\n #render() {\n if (this.#paddingTop !== this.#paddingTopPending || this.#paddingBottom !== this.#paddingBottomPending) {\n Object.assign(this.style, {\n paddingTop: `${this.#paddingTop = this.#paddingTopPending}px`,\n paddingBottom: `${this.#paddingBottom = this.#paddingBottomPending}px`,\n })\n }\n if (this.#isHead !== this.#isHeadPending) {\n this.toggleAttribute('data-page-head', this.#isHead = this.#isHeadPending)\n }\n if (this.#isTail !== this.#isTailPending) {\n this.toggleAttribute('data-page-tail', this.#isTail = this.#isTailPending)\n }\n }\n\n setHeight(height: number) {\n // Avoid potential float number precision issues\n if (Math.abs(this.#contentBoxHeight - height) < 0.1) {\n return\n }\n this.#contentBoxHeight = height\n this.#requestUpdate()\n }\n\n /**\n * Schedules a batched page layout recalculation.\n *\n * Any chunk can call this method, but the actual layout work (#updateAll)\n * always runs on the leader chunk, because it needs to iterate over every\n * chunk in order to compute page breaks.\n *\n * Two nested microtasks are used to batch updates:\n *\n * Microtask 1 – Delegation: non-leader chunks forward the request to the\n * leader chunk, so multiple chunks changing in the same tick only trigger\n * one layout pass.\n *\n * Microtask 2 – Execution: the leader chunk defers #updateAll to a second\n * microtask so that any other attribute / resize changes that were queued\n * in the same tick (and forwarded during microtask 1) are already reflected\n * before the layout is recalculated.\n *\n * The #updateRequested flag acts as a deduplication guard so that rapid\n * successive calls (e.g. multiple attributes changing at once) result in at\n * most one scheduled pass per chunk.\n */\n #requestUpdate() {\n if (this.#updateRequested) {\n return\n }\n\n this.#updateRequested = true\n queueMicrotask(() => {\n if (!this.#isLeader()) {\n this.#updateRequested = false\n const leader = findLeaderChunk(this, this.#group)\n if (!leader) return\n leader.#requestUpdate()\n return\n }\n queueMicrotask(() => {\n this.#updateRequested = false\n this.#updateAll()\n })\n })\n }\n\n #updateAll() {\n if (!this.isConnected) {\n return\n }\n\n const elements = findAllChunks(this, this.#group)\n const count = elements.length\n if (count === 0) return\n\n const pageHeight = this.#pageHeight\n const pageMarginTop = this.#pageMarginTop\n const maxContentHeight = pageHeight - pageMarginTop - this.#pageMarginBottom\n\n let currentContentHeight = 0\n let forceNextBreak = false\n\n for (let i = 0; i < count; i++) {\n const element = elements[i]\n const h = element.#contentBoxHeight\n const isHead = forceNextBreak || i === 0 || (currentContentHeight + h > maxContentHeight)\n\n forceNextBreak = element.#forceNextBreak\n\n if (isHead && i > 0) {\n const prev = elements[i - 1]\n prev.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n prev.#isTailPending = true\n currentContentHeight = h\n } else {\n currentContentHeight += h\n }\n\n element.#paddingTopPending = isHead ? pageMarginTop : 0\n element.#paddingBottomPending = 0\n element.#isTailPending = false\n element.#isHeadPending = isHead\n }\n\n const last = elements[count - 1]\n last.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n last.#isTailPending = true\n\n for (const element of elements) {\n element.#render()\n }\n }\n}\n\nfunction handleResize(entries: ResizeObserverEntry[]) {\n for (const entry of entries) {\n const contentBoxHeight = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height\n const element = entry.target as PageChunkElement\n element.setHeight(contentBoxHeight)\n }\n}\n\nconst getResizeObserver = /* @__PURE__ */ once(() => {\n return new ResizeObserver(handleResize)\n})\n\nfunction observeElement(element: PageChunkElement) {\n getResizeObserver().observe(element)\n}\n\nfunction unobserveElement(element: PageChunkElement) {\n getResizeObserver().unobserve(element)\n}\n\nfunction findLeaderChunk(element: HTMLElement, group: string): PageChunkElement | null | undefined {\n const root = element.closest('.ProseMirror')\n return root?.querySelector<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"][data-size]`)\n}\n\nfunction findAllChunks(element: HTMLElement, group: string): PageChunkElement[] {\n const root = element.closest('.ProseMirror')\n const elements = root?.querySelectorAll<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"]`)\n return Array.from(elements || [])\n}\n","import { getId } from '@ocavue/utils'\nimport { definePlugin, type Extension } from '@prosekit/core'\nimport type { Node } from '@prosekit/pm/model'\nimport { Plugin, PluginKey } from '@prosekit/pm/state'\nimport { Decoration, DecorationSet } from '@prosekit/pm/view'\n\nimport { PAGE_CHUNK_TAG_NAME, registerPageChunkElement } from './page-element.ts'\n\n/**\n * @public\n */\nexport interface PageRenderingOptions {\n /**\n * The width of the page in px.\n *\n * @default 794 (Portrait A4 paper size in 96 DPI)\n */\n pageWidth?: number\n\n /**\n * The height of the page in px.\n *\n * @default 1123 (Portrait A4 paper size in 96 DPI)\n */\n pageHeight?: number\n\n /**\n * The top margin of the page in px.\n *\n * @default 70\n */\n marginTop?: number\n\n /**\n * The right margin of the page in px.\n *\n * @default 70\n */\n marginRight?: number\n\n /**\n * The bottom margin of the page in px.\n *\n * @default 70\n */\n marginBottom?: number\n\n /**\n * The left margin of the page in px.\n *\n * @default 70\n */\n marginLeft?: number\n}\n\n/**\n * @public\n */\nexport function definePageRendering(options: PageRenderingOptions = {}): PageRenderingExtension {\n return definePlugin(\n createPageRenderingPlugin(options),\n )\n}\n\n/**\n * @internal\n */\nexport type PageRenderingExtension = Extension\n\nfunction createPageRenderingPlugin(options: PageRenderingOptions): Plugin {\n const {\n pageWidth = 794,\n pageHeight = 1123,\n marginTop = 70,\n marginRight = 70,\n marginBottom = 70,\n marginLeft = 70,\n } = options\n\n type PluginState = [group: string, decoration: DecorationSet]\n\n const key = new PluginKey<PluginState>('prosekit-page-render')\n\n function createDecorationSet(doc: Node, group: string): DecorationSet {\n const decorations: Decoration[] = []\n const totalCount = doc.childCount\n\n doc.forEach((node, pos, index) => {\n const isPageBreak: boolean | undefined = node.type.spec.pageBreak\n\n decorations.push(Decoration.node(pos, pos + node.nodeSize, {\n 'nodeName': PAGE_CHUNK_TAG_NAME,\n 'data-group': group,\n 'data-break': isPageBreak ? 'true' : undefined,\n 'data-h': String(pageHeight),\n 'data-mt': String(marginTop),\n 'data-mb': String(marginBottom),\n 'data-size': index === 0 ? String(totalCount) : undefined,\n }))\n })\n\n return DecorationSet.create(doc, decorations)\n }\n\n return new Plugin<PluginState>({\n key,\n view: () => {\n registerPageChunkElement()\n return {}\n },\n state: {\n init: (_config, state): PluginState => {\n const group = `page-group-${getId()}`\n const decoration = createDecorationSet(state.doc, group)\n return [group, decoration]\n },\n apply: (tr, value, oldState, newState): PluginState => {\n if (!tr.docChanged) return value\n\n const [group, decoration] = value\n\n let needRecreate = oldState.doc.childCount !== newState.doc.childCount\n\n if (!needRecreate) {\n const count = oldState.doc.childCount\n for (let i = 0; i < count; i++) {\n const oldNode = oldState.doc.child(i)\n const newNode = newState.doc.child(i)\n if (oldNode.type !== newNode.type) {\n needRecreate = true\n break\n }\n }\n }\n\n if (!needRecreate) {\n const mapped = decoration.map(tr.mapping, tr.doc, {\n onRemove: () => {\n needRecreate = true\n },\n })\n if (!needRecreate) {\n return [group, mapped]\n }\n }\n\n return [group, createDecorationSet(newState.doc, group)]\n },\n },\n props: {\n decorations: (state) => {\n return key.getState(state)?.[1]\n },\n attributes: {\n style: [\n `--page-margin-right:${marginRight}px;`,\n `--page-margin-left:${marginLeft}px;`,\n `--page-width:${pageWidth}px;`,\n `--page-height:${pageHeight}px;`,\n ].join(''),\n },\n },\n })\n}\n"],"mappings":"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"}
|