@primeui/texteditor-core 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +1 -0
  3. package/dist/chunk-22B454VC.mjs +83 -0
  4. package/dist/chunk-22B454VC.mjs.map +1 -0
  5. package/dist/chunk-3RKMABZR.mjs +320 -0
  6. package/dist/chunk-3RKMABZR.mjs.map +1 -0
  7. package/dist/chunk-6GY64GPU.mjs +18 -0
  8. package/dist/chunk-6GY64GPU.mjs.map +1 -0
  9. package/dist/chunk-6YDCG63C.mjs +833 -0
  10. package/dist/chunk-6YDCG63C.mjs.map +1 -0
  11. package/dist/chunk-6ZN5XRH2.mjs +45 -0
  12. package/dist/chunk-6ZN5XRH2.mjs.map +1 -0
  13. package/dist/chunk-72T5I4O4.mjs +76 -0
  14. package/dist/chunk-72T5I4O4.mjs.map +1 -0
  15. package/dist/chunk-7QCHSEN2.mjs +16 -0
  16. package/dist/chunk-7QCHSEN2.mjs.map +1 -0
  17. package/dist/chunk-AJOKUIQD.mjs +33 -0
  18. package/dist/chunk-AJOKUIQD.mjs.map +1 -0
  19. package/dist/chunk-AUTGNC2Q.mjs +197 -0
  20. package/dist/chunk-AUTGNC2Q.mjs.map +1 -0
  21. package/dist/chunk-CRAB2MFE.mjs +19 -0
  22. package/dist/chunk-CRAB2MFE.mjs.map +1 -0
  23. package/dist/chunk-DXPG5XMX.mjs +18 -0
  24. package/dist/chunk-DXPG5XMX.mjs.map +1 -0
  25. package/dist/chunk-E2KXUP3F.mjs +9 -0
  26. package/dist/chunk-E2KXUP3F.mjs.map +1 -0
  27. package/dist/chunk-EA2YI7LA.mjs +23 -0
  28. package/dist/chunk-EA2YI7LA.mjs.map +1 -0
  29. package/dist/chunk-F7BJWPT6.mjs +401 -0
  30. package/dist/chunk-F7BJWPT6.mjs.map +1 -0
  31. package/dist/chunk-FFCQLWS5.mjs +32 -0
  32. package/dist/chunk-FFCQLWS5.mjs.map +1 -0
  33. package/dist/chunk-GG56GLXC.mjs +42 -0
  34. package/dist/chunk-GG56GLXC.mjs.map +1 -0
  35. package/dist/chunk-GGPBV4BM.mjs +37 -0
  36. package/dist/chunk-GGPBV4BM.mjs.map +1 -0
  37. package/dist/chunk-H3RFOYCT.mjs +27 -0
  38. package/dist/chunk-H3RFOYCT.mjs.map +1 -0
  39. package/dist/chunk-IUQKSDKG.mjs +23 -0
  40. package/dist/chunk-IUQKSDKG.mjs.map +1 -0
  41. package/dist/chunk-J5LGTIGS.mjs +9 -0
  42. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  43. package/dist/chunk-KNZAMA6H.mjs +198 -0
  44. package/dist/chunk-KNZAMA6H.mjs.map +1 -0
  45. package/dist/chunk-MNKMKFLQ.mjs +27 -0
  46. package/dist/chunk-MNKMKFLQ.mjs.map +1 -0
  47. package/dist/chunk-MWT5PK3Z.mjs +52 -0
  48. package/dist/chunk-MWT5PK3Z.mjs.map +1 -0
  49. package/dist/chunk-NWRVBNBW.mjs +65 -0
  50. package/dist/chunk-NWRVBNBW.mjs.map +1 -0
  51. package/dist/chunk-OGEMGWLR.mjs +180 -0
  52. package/dist/chunk-OGEMGWLR.mjs.map +1 -0
  53. package/dist/chunk-PRFYR67X.mjs +60 -0
  54. package/dist/chunk-PRFYR67X.mjs.map +1 -0
  55. package/dist/chunk-PT2O4RV7.mjs +143 -0
  56. package/dist/chunk-PT2O4RV7.mjs.map +1 -0
  57. package/dist/chunk-PT5V6UYE.mjs +10 -0
  58. package/dist/chunk-PT5V6UYE.mjs.map +1 -0
  59. package/dist/chunk-RH45QRSV.mjs +26 -0
  60. package/dist/chunk-RH45QRSV.mjs.map +1 -0
  61. package/dist/chunk-RQ2HHNI6.mjs +55 -0
  62. package/dist/chunk-RQ2HHNI6.mjs.map +1 -0
  63. package/dist/chunk-TB7ZSSR2.mjs +6 -0
  64. package/dist/chunk-TB7ZSSR2.mjs.map +1 -0
  65. package/dist/chunk-TBQVZVKA.mjs +1891 -0
  66. package/dist/chunk-TBQVZVKA.mjs.map +1 -0
  67. package/dist/chunk-VWGQMUPD.mjs +182 -0
  68. package/dist/chunk-VWGQMUPD.mjs.map +1 -0
  69. package/dist/chunk-XKY2VYPW.mjs +26 -0
  70. package/dist/chunk-XKY2VYPW.mjs.map +1 -0
  71. package/dist/chunk-XSVIGDQR.mjs +22 -0
  72. package/dist/chunk-XSVIGDQR.mjs.map +1 -0
  73. package/dist/chunk-YHMP6AN3.mjs +231 -0
  74. package/dist/chunk-YHMP6AN3.mjs.map +1 -0
  75. package/dist/commands/index.d.mts +13 -0
  76. package/dist/commands/index.mjs +13 -0
  77. package/dist/commands/index.mjs.map +1 -0
  78. package/dist/createTextEditor.d.mts +7 -0
  79. package/dist/createTextEditor.mjs +31 -0
  80. package/dist/createTextEditor.mjs.map +1 -0
  81. package/dist/index.d.mts +17 -0
  82. package/dist/index.mjs +45 -0
  83. package/dist/index.mjs.map +1 -0
  84. package/dist/plugins/columnWidthPin.d.mts +5 -0
  85. package/dist/plugins/columnWidthPin.mjs +4 -0
  86. package/dist/plugins/columnWidthPin.mjs.map +1 -0
  87. package/dist/plugins/contextToolbar.d.mts +9 -0
  88. package/dist/plugins/contextToolbar.mjs +5 -0
  89. package/dist/plugins/contextToolbar.mjs.map +1 -0
  90. package/dist/plugins/defineTextEditorPlugin.d.mts +20 -0
  91. package/dist/plugins/defineTextEditorPlugin.mjs +4 -0
  92. package/dist/plugins/defineTextEditorPlugin.mjs.map +1 -0
  93. package/dist/plugins/inputRules.d.mts +14 -0
  94. package/dist/plugins/inputRules.mjs +8 -0
  95. package/dist/plugins/inputRules.mjs.map +1 -0
  96. package/dist/plugins/keymap.d.mts +16 -0
  97. package/dist/plugins/keymap.mjs +6 -0
  98. package/dist/plugins/keymap.mjs.map +1 -0
  99. package/dist/plugins/mention.d.mts +24 -0
  100. package/dist/plugins/mention.mjs +5 -0
  101. package/dist/plugins/mention.mjs.map +1 -0
  102. package/dist/plugins/mentionController.d.mts +16 -0
  103. package/dist/plugins/mentionController.mjs +4 -0
  104. package/dist/plugins/mentionController.mjs.map +1 -0
  105. package/dist/plugins/placeholder.d.mts +9 -0
  106. package/dist/plugins/placeholder.mjs +5 -0
  107. package/dist/plugins/placeholder.mjs.map +1 -0
  108. package/dist/plugins/registry.d.mts +7 -0
  109. package/dist/plugins/registry.mjs +4 -0
  110. package/dist/plugins/registry.mjs.map +1 -0
  111. package/dist/plugins/selectionHighlight.d.mts +14 -0
  112. package/dist/plugins/selectionHighlight.mjs +5 -0
  113. package/dist/plugins/selectionHighlight.mjs.map +1 -0
  114. package/dist/plugins/slashCommands.d.mts +28 -0
  115. package/dist/plugins/slashCommands.mjs +5 -0
  116. package/dist/plugins/slashCommands.mjs.map +1 -0
  117. package/dist/plugins/tableOverlay.d.mts +15 -0
  118. package/dist/plugins/tableOverlay.mjs +6 -0
  119. package/dist/plugins/tableOverlay.mjs.map +1 -0
  120. package/dist/plugins/trailingNode.d.mts +6 -0
  121. package/dist/plugins/trailingNode.mjs +4 -0
  122. package/dist/plugins/trailingNode.mjs.map +1 -0
  123. package/dist/position-DbkbTrFL.d.mts +50 -0
  124. package/dist/schema/index.d.mts +89 -0
  125. package/dist/schema/index.mjs +8 -0
  126. package/dist/schema/index.mjs.map +1 -0
  127. package/dist/serialization/index.d.mts +8 -0
  128. package/dist/serialization/index.mjs +5 -0
  129. package/dist/serialization/index.mjs.map +1 -0
  130. package/dist/texteditor.classes.d.mts +34 -0
  131. package/dist/texteditor.classes.mjs +4 -0
  132. package/dist/texteditor.classes.mjs.map +1 -0
  133. package/dist/texteditor.constants.d.mts +36 -0
  134. package/dist/texteditor.constants.mjs +4 -0
  135. package/dist/texteditor.constants.mjs.map +1 -0
  136. package/dist/texteditor.props.d.mts +5 -0
  137. package/dist/texteditor.props.mjs +4 -0
  138. package/dist/texteditor.props.mjs.map +1 -0
  139. package/dist/texteditor.refs.d.mts +5 -0
  140. package/dist/texteditor.refs.mjs +4 -0
  141. package/dist/texteditor.refs.mjs.map +1 -0
  142. package/dist/texteditor.state.d.mts +5 -0
  143. package/dist/texteditor.state.mjs +4 -0
  144. package/dist/texteditor.state.mjs.map +1 -0
  145. package/dist/ui/focus.d.mts +5 -0
  146. package/dist/ui/focus.mjs +4 -0
  147. package/dist/ui/focus.mjs.map +1 -0
  148. package/dist/ui/index.d.mts +6 -0
  149. package/dist/ui/index.mjs +9 -0
  150. package/dist/ui/index.mjs.map +1 -0
  151. package/dist/ui/keyboard.d.mts +4 -0
  152. package/dist/ui/keyboard.mjs +4 -0
  153. package/dist/ui/keyboard.mjs.map +1 -0
  154. package/dist/ui/menu.d.mts +10 -0
  155. package/dist/ui/menu.mjs +4 -0
  156. package/dist/ui/menu.mjs.map +1 -0
  157. package/dist/ui/positioning.d.mts +30 -0
  158. package/dist/ui/positioning.mjs +5 -0
  159. package/dist/ui/positioning.mjs.map +1 -0
  160. package/dist/ui/scroll.d.mts +6 -0
  161. package/dist/ui/scroll.mjs +4 -0
  162. package/dist/ui/scroll.mjs.map +1 -0
  163. package/dist/utils/index.d.mts +18 -0
  164. package/dist/utils/index.mjs +18 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/package.json +73 -0
@@ -0,0 +1,182 @@
1
+ import { isNodeActive, getParentNodeOfType } from './chunk-72T5I4O4.mjs';
2
+ import { setBlockType, wrapIn } from 'prosemirror-commands';
3
+ import { wrapInList, liftListItem } from 'prosemirror-schema-list';
4
+ import { Fragment } from 'prosemirror-model';
5
+ import { liftTarget } from 'prosemirror-transform';
6
+ import { TextSelection } from 'prosemirror-state';
7
+
8
+ function currentListItemType(view, schema) {
9
+ const { $from } = view.state.selection;
10
+ for (let depth = $from.depth; depth > 0; depth--) {
11
+ const type = $from.node(depth).type;
12
+ if (type === schema.nodes.list_item || type === schema.nodes.check_list_item) return type;
13
+ }
14
+ return null;
15
+ }
16
+ function wrapInListNormalized(view, schema, listType) {
17
+ if (wrapInList(listType)(view.state, view.dispatch)) return;
18
+ if (setBlockType(schema.nodes.paragraph)(view.state, view.dispatch)) {
19
+ wrapInList(listType)(view.state, view.dispatch);
20
+ }
21
+ }
22
+ function wrapInBlockquoteNormalized(view, schema) {
23
+ if (wrapIn(schema.nodes.blockquote)(view.state, view.dispatch)) return;
24
+ const itemType = currentListItemType(view, schema);
25
+ if (itemType && liftListItem(itemType)(view.state, view.dispatch)) {
26
+ wrapIn(schema.nodes.blockquote)(view.state, view.dispatch);
27
+ }
28
+ }
29
+ function setTextAlign(view, alignment) {
30
+ const { from, to } = view.state.selection;
31
+ const tr = view.state.tr;
32
+ view.state.doc.nodesBetween(from, to, (node, pos) => {
33
+ if (node.type.spec.attrs?.textAlign !== void 0) {
34
+ tr.setNodeMarkup(pos, null, { ...node.attrs, textAlign: alignment === "left" ? null : alignment });
35
+ }
36
+ });
37
+ if (tr.docChanged) {
38
+ view.dispatch(tr);
39
+ view.focus();
40
+ }
41
+ }
42
+ function clearTypographyMarks(tr, schema, from, to) {
43
+ const textStyle = schema.marks.textStyle;
44
+ if (!textStyle) return tr;
45
+ tr.doc.nodesBetween(from, to, (node, pos) => {
46
+ if (!node.isText) return;
47
+ const mark = textStyle.isInSet(node.marks);
48
+ if (!mark || mark.attrs.fontSize == null && mark.attrs.fontFamily == null) return;
49
+ const start = Math.max(pos, from);
50
+ const end = Math.min(pos + node.nodeSize, to);
51
+ const next = { ...mark.attrs, fontSize: null, fontFamily: null };
52
+ tr.removeMark(start, end, textStyle);
53
+ if (Object.values(next).some((v) => v != null)) tr.addMark(start, end, textStyle.create(next));
54
+ });
55
+ return tr;
56
+ }
57
+ function toggleBlockType(view, nodeType, attrs) {
58
+ const { state } = view;
59
+ const isActive = isNodeActive(state, nodeType, attrs);
60
+ if (isActive) {
61
+ setBlockType(state.schema.nodes.paragraph)(state, view.dispatch);
62
+ view.focus();
63
+ return;
64
+ }
65
+ setBlockType(nodeType, attrs)(state, (tr) => {
66
+ if (nodeType === state.schema.nodes.heading) {
67
+ const { $from, $to } = tr.selection;
68
+ const from = $from.start();
69
+ const to = $to.end();
70
+ clearTypographyMarks(tr, state.schema, from, to);
71
+ }
72
+ view.dispatch(tr);
73
+ });
74
+ view.focus();
75
+ }
76
+ function blockTextWithNewlines(node, schema) {
77
+ let out = "";
78
+ node.content.forEach((child) => {
79
+ if (child.type === schema.nodes.hard_break) out += "\n";
80
+ else if (child.isText) out += child.text ?? "";
81
+ });
82
+ return out;
83
+ }
84
+ function inlineFromCodeText(text, schema) {
85
+ const parts = text.split("\n");
86
+ const nodes = [];
87
+ parts.forEach((line, i) => {
88
+ if (i > 0) nodes.push(schema.nodes.hard_break.create());
89
+ if (line) nodes.push(schema.text(line));
90
+ });
91
+ return Fragment.fromArray(nodes);
92
+ }
93
+ function toggleCodeBlock(view, schema) {
94
+ const { state } = view;
95
+ const codeBlock = schema.nodes.code_block;
96
+ const paragraph = schema.nodes.paragraph;
97
+ const { from, to, $from } = state.selection;
98
+ let blockPos = -1;
99
+ let block = $from.parent.type === codeBlock ? $from.parent : null;
100
+ if (block) {
101
+ blockPos = $from.before();
102
+ } else {
103
+ state.doc.nodesBetween(from, to, (node, pos) => {
104
+ if (block) return false;
105
+ if (node.type === codeBlock) {
106
+ block = node;
107
+ blockPos = pos;
108
+ }
109
+ return false;
110
+ });
111
+ }
112
+ if (block && blockPos >= 0) {
113
+ const code = block;
114
+ const para = paragraph.create(null, inlineFromCodeText(code.textContent, schema));
115
+ const tr2 = state.tr.replaceWith(blockPos, blockPos + code.nodeSize, para);
116
+ const caret2 = Math.min(blockPos + 1 + $from.parentOffset, blockPos + 1 + para.content.size);
117
+ tr2.setSelection(TextSelection.create(tr2.doc, caret2));
118
+ view.dispatch(tr2.scrollIntoView());
119
+ view.focus();
120
+ return;
121
+ }
122
+ const range = $from.blockRange(state.selection.$to);
123
+ if (!range) return;
124
+ const lines = [];
125
+ const caretIndex = $from.index(range.depth);
126
+ let caretOffset = 0;
127
+ for (let i = range.startIndex; i < range.endIndex; i++) {
128
+ const child = range.parent.child(i);
129
+ if (i < caretIndex) caretOffset += blockTextWithNewlines(child, schema).length + 1;
130
+ else if (i === caretIndex) caretOffset += $from.parentOffset;
131
+ lines.push(blockTextWithNewlines(child, schema));
132
+ }
133
+ const joined = lines.join("\n");
134
+ const newBlock = codeBlock.create(null, joined ? schema.text(joined) : void 0);
135
+ const tr = state.tr.replaceWith(range.start, range.end, newBlock);
136
+ const caret = Math.min(range.start + 1 + caretOffset, range.start + 1 + joined.length);
137
+ tr.setSelection(TextSelection.create(tr.doc, caret));
138
+ view.dispatch(tr.scrollIntoView());
139
+ view.focus();
140
+ }
141
+ function liftWholeNode(view, nodeType) {
142
+ const { state } = view;
143
+ const found = getParentNodeOfType(state, nodeType);
144
+ if (!found) return;
145
+ const inner = found.pos + 1;
146
+ const $start = state.doc.resolve(inner);
147
+ const $end = state.doc.resolve(found.pos + found.node.nodeSize - 1);
148
+ const range = $start.blockRange($end);
149
+ if (!range) return;
150
+ const target = liftTarget(range);
151
+ if (target == null) return;
152
+ view.dispatch(state.tr.lift(range, target).scrollIntoView());
153
+ }
154
+ function toggleBlockquote(view, schema) {
155
+ if (isNodeActive(view.state, schema.nodes.blockquote)) {
156
+ liftWholeNode(view, schema.nodes.blockquote);
157
+ } else {
158
+ wrapInBlockquoteNormalized(view, schema);
159
+ }
160
+ view.focus();
161
+ }
162
+ function createBlockCommands(view, schema) {
163
+ return {
164
+ heading: (level) => toggleBlockType(view, schema.nodes.heading, { level }),
165
+ paragraph: () => {
166
+ setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);
167
+ view.focus();
168
+ },
169
+ codeBlock: () => toggleCodeBlock(view, schema),
170
+ blockquote: () => toggleBlockquote(view, schema),
171
+ insertHorizontalRule: () => {
172
+ const tr = view.state.tr.replaceSelectionWith(schema.nodes.horizontal_rule.create());
173
+ view.dispatch(tr.scrollIntoView());
174
+ view.focus();
175
+ },
176
+ textAlign: (alignment) => setTextAlign(view, alignment)
177
+ };
178
+ }
179
+
180
+ export { clearTypographyMarks, createBlockCommands, wrapInBlockquoteNormalized, wrapInListNormalized };
181
+ //# sourceMappingURL=chunk-VWGQMUPD.mjs.map
182
+ //# sourceMappingURL=chunk-VWGQMUPD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/normalize.ts","../src/commands/blocks.ts"],"names":["setBlockType","tr","caret"],"mappings":";;;;;;;AAMA,SAAS,mBAAA,CAAoB,MAAkB,MAAA,EAAiC;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA,CAAM,SAAA;AAE7B,EAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAC9C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA;AAE/B,IAAA,IAAI,IAAA,KAAS,OAAO,KAAA,CAAM,SAAA,IAAa,SAAS,MAAA,CAAO,KAAA,CAAM,iBAAiB,OAAO,IAAA;AAAA,EACzF;AAEA,EAAA,OAAO,IAAA;AACX;AAIO,SAAS,oBAAA,CAAqB,IAAA,EAAkB,MAAA,EAAgB,QAAA,EAA0B;AAC7F,EAAA,IAAI,WAAW,QAAQ,CAAA,CAAE,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AAErD,EAAA,IAAI,YAAA,CAAa,OAAO,KAAA,CAAM,SAAS,EAAE,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjE,IAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,EAClD;AACJ;AAIO,SAAS,0BAAA,CAA2B,MAAkB,MAAA,EAAsB;AAC/E,EAAA,IAAI,MAAA,CAAO,OAAO,KAAA,CAAM,UAAU,EAAE,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AAEhE,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AAEjD,EAAA,IAAI,QAAA,IAAY,aAAa,QAAQ,CAAA,CAAE,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC/D,IAAA,MAAA,CAAO,OAAO,KAAA,CAAM,UAAU,EAAE,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,EAC7D;AACJ;AC7BA,SAAS,YAAA,CAAa,MAAkB,SAAA,EAAmB;AACvD,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,KAAK,KAAA,CAAM,SAAA;AAChC,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,EAAA;AAEtB,EAAA,IAAA,CAAK,MAAM,GAAA,CAAI,YAAA,CAAa,MAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AACjD,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,cAAc,MAAA,EAAW;AAC/C,MAAA,EAAA,CAAG,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,SAAA,EAAW,SAAA,KAAc,MAAA,GAAS,IAAA,GAAO,SAAA,EAAW,CAAA;AAAA,IACrG;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,IAAI,GAAG,UAAA,EAAY;AACf,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACf;AACJ;AAIO,SAAS,oBAAA,CAAqB,EAAA,EAAiB,MAAA,EAAgB,IAAA,EAAc,EAAA,EAAY;AAC5F,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,SAAA;AAE/B,EAAA,IAAI,CAAC,WAAW,OAAO,EAAA;AAEvB,EAAA,EAAA,CAAG,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AACzC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAEzC,IAAA,IAAI,CAAC,QAAS,IAAA,CAAK,KAAA,CAAM,YAAY,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,IAAA,EAAO;AAE7E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,EAAE,CAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,OAAO,QAAA,EAAU,IAAA,EAAM,YAAY,IAAA,EAAK;AAE/D,IAAA,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,GAAA,EAAK,SAAS,CAAA;AAEnC,IAAA,IAAI,OAAO,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,IAAK,IAAI,CAAA,KAAM,OAAA,CAAQ,KAAA,EAAO,KAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACjG,CAAC,CAAA;AAED,EAAA,OAAO,EAAA;AACX;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAkB,QAAA,EAAoB,KAAA,EAAiC;AAC5F,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,QAAA,EAAU,KAAK,CAAA;AAEpD,EAAA,IAAI,QAAA,EAAU;AACV,IAAAA,YAAAA,CAAa,MAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,CAAE,KAAA,EAAO,KAAK,QAAQ,CAAA;AAC/D,IAAA,IAAA,CAAK,KAAA,EAAM;AAEX,IAAA;AAAA,EACJ;AAEA,EAAAA,aAAa,QAAA,EAAU,KAAK,CAAA,CAAE,KAAA,EAAO,CAAC,EAAA,KAAO;AACzC,IAAA,IAAI,QAAA,KAAa,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS;AACzC,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAM;AACzB,MAAA,MAAM,EAAA,GAAK,IAAI,GAAA,EAAI;AAEnB,MAAA,oBAAA,CAAqB,EAAA,EAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,KAAA,EAAM;AACf;AAMA,SAAS,qBAAA,CAAsB,MAAc,MAAA,EAAwB;AACjE,EAAA,IAAI,GAAA,GAAM,EAAA;AAEV,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC5B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,CAAO,KAAA,CAAM,YAAY,GAAA,IAAO,IAAA;AAAA,SAAA,IAC1C,KAAA,CAAM,MAAA,EAAQ,GAAA,IAAO,KAAA,CAAM,IAAA,IAAQ,EAAA;AAAA,EAChD,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACX;AAIA,SAAS,kBAAA,CAAmB,MAAc,MAAA,EAA0B;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACvB,IAAA,IAAI,CAAA,GAAI,GAAG,KAAA,CAAM,IAAA,CAAK,OAAO,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA;AACtD,IAAA,IAAI,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC1C,CAAC,CAAA;AAED,EAAA,OAAO,QAAA,CAAS,UAAU,KAAK,CAAA;AACnC;AAEA,SAAS,eAAA,CAAgB,MAAkB,MAAA,EAAgB;AACvD,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,UAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,SAAA;AAC/B,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,KAAU,KAAA,CAAM,SAAA;AAIlC,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,QAAuB,KAAA,CAAM,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,MAAM,MAAA,GAAS,IAAA;AAE5E,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,QAAA,GAAW,MAAM,MAAA,EAAO;AAAA,EAC5B,CAAA,MAAO;AACH,IAAA,KAAA,CAAM,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AAC5C,MAAA,IAAI,OAAO,OAAO,KAAA;AAElB,MAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AACzB,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,QAAA,GAAW,GAAA;AAAA,MACf;AAEA,MAAA,OAAO,KAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAEA,EAAA,IAAI,KAAA,IAAS,YAAY,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA,EAAM,mBAAmB,IAAA,CAAK,WAAA,EAAa,MAAM,CAAC,CAAA;AAChF,IAAA,MAAMC,GAAAA,GAAK,MAAM,EAAA,CAAG,WAAA,CAAY,UAAU,QAAA,GAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AACxE,IAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,CAAA,GAAI,KAAA,CAAM,YAAA,EAAc,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAE1F,IAAAD,IAAG,YAAA,CAAa,aAAA,CAAc,OAAOA,GAAAA,CAAG,GAAA,EAAKC,MAAK,CAAC,CAAA;AACnD,IAAA,IAAA,CAAK,QAAA,CAASD,GAAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,IAAA,IAAA,CAAK,KAAA,EAAM;AAEX,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAU,GAAG,CAAA;AAElD,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC1C,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,UAAA,EAAY,CAAA,GAAI,KAAA,CAAM,UAAU,CAAA,EAAA,EAAK;AACpD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAElC,IAAA,IAAI,IAAI,UAAA,EAAY,WAAA,IAAe,sBAAsB,KAAA,EAAO,MAAM,EAAE,MAAA,GAAS,CAAA;AAAA,SAAA,IACxE,CAAA,KAAM,UAAA,EAAY,WAAA,IAAe,KAAA,CAAM,YAAA;AAEhD,IAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,IAAA,EAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,MAAS,CAAA;AAChF,EAAA,MAAM,EAAA,GAAK,MAAM,EAAA,CAAG,WAAA,CAAY,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,WAAA,EAAa,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,MAAA,CAAO,MAAM,CAAA;AAErF,EAAA,EAAA,CAAG,aAAa,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,KAAK,CAAC,CAAA;AACnD,EAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,EAAA,IAAA,CAAK,KAAA,EAAM;AACf;AAOA,SAAS,aAAA,CAAc,MAAkB,QAAA,EAAoB;AACzD,EAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,EAAO,QAAQ,CAAA;AAEjD,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,GAAM,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAEpC,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAE/B,EAAA,IAAI,UAAU,IAAA,EAAM;AAEpB,EAAA,IAAA,CAAK,QAAA,CAAS,MAAM,EAAA,CAAG,IAAA,CAAK,OAAO,MAAM,CAAA,CAAE,gBAAgB,CAAA;AAC/D;AAEA,SAAS,gBAAA,CAAiB,MAAkB,MAAA,EAAgB;AACxD,EAAA,IAAI,aAAa,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAG;AACnD,IAAA,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,EAC/C,CAAA,MAAO;AAGH,IAAA,0BAAA,CAA2B,MAAM,MAAM,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAA,CAAK,KAAA,EAAM;AACf;AAEO,SAAS,mBAAA,CAAoB,MAAkB,MAAA,EAAgB;AAClE,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,CAAC,KAAA,KAAkB,eAAA,CAAgB,IAAA,EAAM,OAAO,KAAA,CAAM,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA;AAAA,IACjF,WAAW,MAAM;AACb,MAAAD,YAAAA,CAAa,OAAO,KAAA,CAAM,SAAS,EAAE,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ,CAAA;AAC9D,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,IACA,SAAA,EAAW,MAAM,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC7C,UAAA,EAAY,MAAM,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC/C,sBAAsB,MAAM;AACxB,MAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,EAAA,CAAG,qBAAqB,MAAA,CAAO,KAAA,CAAM,eAAA,CAAgB,MAAA,EAAQ,CAAA;AAEnF,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAA;AACjC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,SAAA,KAAsB,YAAA,CAAa,MAAM,SAAS;AAAA,GAClE;AACJ","file":"chunk-VWGQMUPD.mjs","sourcesContent":["import type { EditorView } from 'prosemirror-view';\nimport type { NodeType, Schema } from 'prosemirror-model';\nimport { setBlockType, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\n\n// The list_item type wrapping the caret, if any (plain or check list).\nfunction currentListItemType(view: EditorView, schema: Schema): NodeType | null {\n const { $from } = view.state.selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const type = $from.node(depth).type;\n\n if (type === schema.nodes.list_item || type === schema.nodes.check_list_item) return type;\n }\n\n return null;\n}\n\n// Wrap the current block in a list, normalizing first when the block can't be\n// wrapped directly (headings, code blocks): convert to a paragraph, then wrap.\nexport function wrapInListNormalized(view: EditorView, schema: Schema, listType: NodeType): void {\n if (wrapInList(listType)(view.state, view.dispatch)) return;\n\n if (setBlockType(schema.nodes.paragraph)(view.state, view.dispatch)) {\n wrapInList(listType)(view.state, view.dispatch);\n }\n}\n\n// Wrap the current block in a blockquote. When the caret is inside a list item\n// (where a blockquote can't be a direct child), lift the item out first.\nexport function wrapInBlockquoteNormalized(view: EditorView, schema: Schema): void {\n if (wrapIn(schema.nodes.blockquote)(view.state, view.dispatch)) return;\n\n const itemType = currentListItemType(view, schema);\n\n if (itemType && liftListItem(itemType)(view.state, view.dispatch)) {\n wrapIn(schema.nodes.blockquote)(view.state, view.dispatch);\n }\n}\n","import type { EditorView } from 'prosemirror-view';\nimport type { Node as PMNode, NodeType, Schema } from 'prosemirror-model';\nimport { Fragment } from 'prosemirror-model';\nimport { liftTarget } from 'prosemirror-transform';\nimport { TextSelection, type Transaction } from 'prosemirror-state';\nimport { setBlockType } from 'prosemirror-commands';\nimport { getParentNodeOfType, isNodeActive } from '../state/selection';\nimport { wrapInBlockquoteNormalized } from './normalize';\n\nfunction setTextAlign(view: EditorView, alignment: string) {\n const { from, to } = view.state.selection;\n const tr = view.state.tr;\n\n view.state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.spec.attrs?.textAlign !== undefined) {\n tr.setNodeMarkup(pos, null, { ...node.attrs, textAlign: alignment === 'left' ? null : alignment });\n }\n });\n\n if (tr.docChanged) {\n view.dispatch(tr);\n view.focus();\n }\n}\n\n// Strip explicit font-size/font-family from a range so a heading owns its own\n// typography (a heading is a semantic level, not a manual point size).\nexport function clearTypographyMarks(tr: Transaction, schema: Schema, from: number, to: number) {\n const textStyle = schema.marks.textStyle;\n\n if (!textStyle) return tr;\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n\n const mark = textStyle.isInSet(node.marks);\n\n if (!mark || (mark.attrs.fontSize == null && mark.attrs.fontFamily == null)) return;\n\n const start = Math.max(pos, from);\n const end = Math.min(pos + node.nodeSize, to);\n const next = { ...mark.attrs, fontSize: null, fontFamily: null };\n\n tr.removeMark(start, end, textStyle);\n\n if (Object.values(next).some((v) => v != null)) tr.addMark(start, end, textStyle.create(next));\n });\n\n return tr;\n}\n\nfunction toggleBlockType(view: EditorView, nodeType: NodeType, attrs?: Record<string, unknown>) {\n const { state } = view;\n const isActive = isNodeActive(state, nodeType, attrs);\n\n if (isActive) {\n setBlockType(state.schema.nodes.paragraph)(state, view.dispatch);\n view.focus();\n\n return;\n }\n\n setBlockType(nodeType, attrs)(state, (tr) => {\n if (nodeType === state.schema.nodes.heading) {\n const { $from, $to } = tr.selection;\n const from = $from.start();\n const to = $to.end();\n\n clearTypographyMarks(tr, state.schema, from, to);\n }\n\n view.dispatch(tr);\n });\n view.focus();\n}\n\n// Toggle code block, preserving lines: join blocks on enter, split newlines on leave.\n// A paragraph's text, with hard breaks rendered as newlines — so a paragraph\n// (which stores line breaks as <br>) round-trips cleanly to a code block (which\n// stores them as \"\\n\" in a single text node).\nfunction blockTextWithNewlines(node: PMNode, schema: Schema): string {\n let out = '';\n\n node.content.forEach((child) => {\n if (child.type === schema.nodes.hard_break) out += '\\n';\n else if (child.isText) out += child.text ?? '';\n });\n\n return out;\n}\n\n// Build inline content for a paragraph from code text, turning each \"\\n\" into a\n// hard break so multi-line code stays one block when converted back.\nfunction inlineFromCodeText(text: string, schema: Schema): Fragment {\n const parts = text.split('\\n');\n const nodes: PMNode[] = [];\n\n parts.forEach((line, i) => {\n if (i > 0) nodes.push(schema.nodes.hard_break.create());\n if (line) nodes.push(schema.text(line));\n });\n\n return Fragment.fromArray(nodes);\n}\n\nfunction toggleCodeBlock(view: EditorView, schema: Schema) {\n const { state } = view;\n const codeBlock = schema.nodes.code_block;\n const paragraph = schema.nodes.paragraph;\n const { from, to, $from } = state.selection;\n\n // Leave: the selection touches a code block -> convert it to ONE paragraph,\n // preserving line breaks as hard breaks (so it can round-trip back).\n let blockPos = -1;\n let block: PMNode | null = $from.parent.type === codeBlock ? $from.parent : null;\n\n if (block) {\n blockPos = $from.before();\n } else {\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (block) return false;\n\n if (node.type === codeBlock) {\n block = node;\n blockPos = pos;\n }\n\n return false;\n });\n }\n\n if (block && blockPos >= 0) {\n const code = block as PMNode;\n const para = paragraph.create(null, inlineFromCodeText(code.textContent, schema));\n const tr = state.tr.replaceWith(blockPos, blockPos + code.nodeSize, para);\n const caret = Math.min(blockPos + 1 + $from.parentOffset, blockPos + 1 + para.content.size);\n\n tr.setSelection(TextSelection.create(tr.doc, caret));\n view.dispatch(tr.scrollIntoView());\n view.focus();\n\n return;\n }\n\n const range = $from.blockRange(state.selection.$to);\n\n if (!range) return;\n\n const lines: string[] = [];\n const caretIndex = $from.index(range.depth);\n let caretOffset = 0;\n\n for (let i = range.startIndex; i < range.endIndex; i++) {\n const child = range.parent.child(i);\n\n if (i < caretIndex) caretOffset += blockTextWithNewlines(child, schema).length + 1;\n else if (i === caretIndex) caretOffset += $from.parentOffset;\n\n lines.push(blockTextWithNewlines(child, schema));\n }\n\n const joined = lines.join('\\n');\n const newBlock = codeBlock.create(null, joined ? schema.text(joined) : undefined);\n const tr = state.tr.replaceWith(range.start, range.end, newBlock);\n const caret = Math.min(range.start + 1 + caretOffset, range.start + 1 + joined.length);\n\n tr.setSelection(TextSelection.create(tr.doc, caret));\n view.dispatch(tr.scrollIntoView());\n view.focus();\n}\n\n// Lift the WHOLE wrapping node out, not just the block the caret sits in.\n// prosemirror's `lift` only lifts the selected block range, so a collapsed\n// caret in one paragraph of a multi-paragraph blockquote would leave the\n// remaining paragraphs trapped in a leftover wrapper. Lifting the wrapper's\n// full content range unwraps every child together (matching Tiptap).\nfunction liftWholeNode(view: EditorView, nodeType: NodeType) {\n const { state } = view;\n const found = getParentNodeOfType(state, nodeType);\n\n if (!found) return;\n\n const inner = found.pos + 1;\n const $start = state.doc.resolve(inner);\n const $end = state.doc.resolve(found.pos + found.node!.nodeSize - 1);\n const range = $start.blockRange($end);\n\n if (!range) return;\n\n const target = liftTarget(range);\n\n if (target == null) return;\n\n view.dispatch(state.tr.lift(range, target).scrollIntoView());\n}\n\nfunction toggleBlockquote(view: EditorView, schema: Schema) {\n if (isNodeActive(view.state, schema.nodes.blockquote)) {\n liftWholeNode(view, schema.nodes.blockquote);\n } else {\n // wrapIn fails when the caret sits inside a list item; the normalizer\n // lifts the item out of its list first, then wraps.\n wrapInBlockquoteNormalized(view, schema);\n }\n\n view.focus();\n}\n\nexport function createBlockCommands(view: EditorView, schema: Schema) {\n return {\n heading: (level: number) => toggleBlockType(view, schema.nodes.heading, { level }),\n paragraph: () => {\n setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);\n view.focus();\n },\n codeBlock: () => toggleCodeBlock(view, schema),\n blockquote: () => toggleBlockquote(view, schema),\n insertHorizontalRule: () => {\n const tr = view.state.tr.replaceSelectionWith(schema.nodes.horizontal_rule.create());\n\n view.dispatch(tr.scrollIntoView());\n view.focus();\n },\n textAlign: (alignment: string) => setTextAlign(view, alignment)\n };\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { definePlugin } from '@primeui/core';
2
+
3
+ // src/plugins/defineTextEditorPlugin.ts
4
+ function defineTextEditorPlugin(name, install, opts) {
5
+ const plugin = definePlugin(name, (ctx) => {
6
+ const api = {
7
+ getSelectedText: () => ctx.getSelectedText(),
8
+ replaceSelection: (content, asHtml) => ctx.replaceSelection(content, asHtml),
9
+ getEditorElement: () => ctx.getEditorElement(),
10
+ getView: () => ctx.getView(),
11
+ getState: () => ctx.getState(),
12
+ registerProseMirrorPlugin: (plugin2) => ctx.registerProseMirrorPlugin(plugin2),
13
+ runCommand: (command) => ctx.runCommand(command),
14
+ options: ctx.options,
15
+ onUnmounted: ctx.onUnmounted
16
+ };
17
+ return install(api);
18
+ });
19
+ if (opts?.schema) plugin.schema = opts.schema;
20
+ if (opts?.prosemirrorPlugins) plugin.prosemirrorPlugins = opts.prosemirrorPlugins;
21
+ return plugin;
22
+ }
23
+
24
+ export { defineTextEditorPlugin };
25
+ //# sourceMappingURL=chunk-XKY2VYPW.mjs.map
26
+ //# sourceMappingURL=chunk-XKY2VYPW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/defineTextEditorPlugin.ts"],"names":["plugin"],"mappings":";;;AAoBO,SAAS,sBAAA,CAA2C,IAAA,EAAc,OAAA,EAAiF,IAAA,EAAgD;AACtM,EAAA,MAAM,MAAA,GAAS,YAAA,CAAmE,IAAA,EAAM,CAAC,GAAA,KAAQ;AAC7F,IAAA,MAAM,GAAA,GAAyC;AAAA,MAC3C,eAAA,EAAiB,MAAM,GAAA,CAAI,eAAA,EAAgB;AAAA,MAC3C,kBAAkB,CAAC,OAAA,EAAiB,WAAqB,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAAA,MAC7F,gBAAA,EAAkB,MAAM,GAAA,CAAI,gBAAA,EAAiB;AAAA,MAC7C,OAAA,EAAS,MAAM,GAAA,CAAI,OAAA,EAAQ;AAAA,MAC3B,QAAA,EAAU,MAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MAC7B,yBAAA,EAA2B,CAACA,OAAAA,KAAW,GAAA,CAAI,0BAA0BA,OAAM,CAAA;AAAA,MAC3E,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,WAAW,OAAO,CAAA;AAAA,MAC/C,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,aAAa,GAAA,CAAI;AAAA,KACrB;AAEA,IAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,IAAI,IAAA,EAAM,MAAA,EAAS,MAAA,CAAwC,SAAS,IAAA,CAAK,MAAA;AACzE,EAAA,IAAI,IAAA,EAAM,kBAAA,EAAqB,MAAA,CAAkG,qBAAqB,IAAA,CAAK,kBAAA;AAE3J,EAAA,OAAO,MAAA;AACX","file":"chunk-XKY2VYPW.mjs","sourcesContent":["import { definePlugin } from '@primeui/core';\nimport type { TextEditorInstance, TextEditorPluginContext, TextEditorPluginExpose } from '@primeui/texteditor-types';\nimport type { Plugin as PMPlugin } from 'prosemirror-state';\nimport type { Schema } from 'prosemirror-model';\nimport type { SchemaExtension } from '../schema';\n\nexport interface TextEditorPluginDefineOptions<TOptions = unknown> {\n /** Nodes/marks contributed to the per-instance schema. */\n schema?: SchemaExtension;\n /**\n * ProseMirror plugins added to the INITIAL editor state (e.g. Yjs ySyncPlugin\n * for collaboration). Receives the assembled schema and the plugin's own\n * options, so config-dependent plugins (provider URL, awareness, limits) can\n * be built here rather than via the install-time registerProseMirrorPlugin.\n */\n prosemirrorPlugins?: (schema: Schema, options?: TOptions) => PMPlugin[];\n}\n\n// Defines a TextEditor plugin. `opts.schema` contributes nodes/marks; `opts.prosemirrorPlugins`\n// contributes ProseMirror plugins to the initial state (required for collaboration/Yjs).\nexport function defineTextEditorPlugin<TOptions = unknown>(name: string, install: (context: TextEditorPluginContext<TOptions>) => TextEditorPluginExpose, opts?: TextEditorPluginDefineOptions<TOptions>) {\n const plugin = definePlugin<TOptions, TextEditorPluginExpose, TextEditorInstance>(name, (ctx) => {\n const api: TextEditorPluginContext<TOptions> = {\n getSelectedText: () => ctx.getSelectedText(),\n replaceSelection: (content: string, asHtml?: boolean) => ctx.replaceSelection(content, asHtml),\n getEditorElement: () => ctx.getEditorElement(),\n getView: () => ctx.getView(),\n getState: () => ctx.getState(),\n registerProseMirrorPlugin: (plugin) => ctx.registerProseMirrorPlugin(plugin),\n runCommand: (command) => ctx.runCommand(command),\n options: ctx.options,\n onUnmounted: ctx.onUnmounted\n };\n\n return install(api);\n });\n\n if (opts?.schema) (plugin as { schema?: SchemaExtension }).schema = opts.schema;\n if (opts?.prosemirrorPlugins) (plugin as { prosemirrorPlugins?: TextEditorPluginDefineOptions<TOptions>['prosemirrorPlugins'] }).prosemirrorPlugins = opts.prosemirrorPlugins;\n\n return plugin;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ // src/ui/focus.ts
2
+ function isClickOutside(target, popoverEl, triggerEl, submenuSelector) {
3
+ if (popoverEl?.contains(target)) return false;
4
+ if (triggerEl?.contains(target)) return false;
5
+ const el = target;
6
+ if (el.closest?.(submenuSelector)) return false;
7
+ return true;
8
+ }
9
+ function isMouseLeavingBlockArea(relatedTarget, blockClassName) {
10
+ if (!relatedTarget) return true;
11
+ return !relatedTarget.closest(`.${blockClassName}`);
12
+ }
13
+ function setRovingTabindex(items, activeEl) {
14
+ const active = activeEl && items.includes(activeEl) ? activeEl : items[0] ?? null;
15
+ for (const item of items) {
16
+ item.setAttribute("tabindex", item === active ? "0" : "-1");
17
+ }
18
+ }
19
+
20
+ export { isClickOutside, isMouseLeavingBlockArea, setRovingTabindex };
21
+ //# sourceMappingURL=chunk-XSVIGDQR.mjs.map
22
+ //# sourceMappingURL=chunk-XSVIGDQR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/focus.ts"],"names":[],"mappings":";AAAO,SAAS,cAAA,CAAe,MAAA,EAAc,SAAA,EAA+B,SAAA,EAA+B,eAAA,EAAkC;AACzI,EAAA,IAAI,SAAA,EAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,SAAA,EAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AAExC,EAAA,MAAM,EAAA,GAAK,MAAA;AAEX,EAAA,IAAI,EAAA,CAAG,OAAA,GAAU,eAAe,CAAA,EAAG,OAAO,KAAA;AAE1C,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,uBAAA,CAAwB,eAA+B,cAAA,EAAiC;AACpG,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,EAAA,OAAO,CAAC,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAA,EAAI,cAAc,CAAA,CAAE,CAAA;AACtD;AAEO,SAAS,iBAAA,CAAkB,OAAsB,QAAA,EAAoC;AACxF,EAAA,MAAM,MAAA,GAAS,YAAY,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAY,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAE9E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,IAAA,KAAS,MAAA,GAAS,MAAM,IAAI,CAAA;AAAA,EAC9D;AACJ","file":"chunk-XSVIGDQR.mjs","sourcesContent":["export function isClickOutside(target: Node, popoverEl: HTMLElement | null, triggerEl: HTMLElement | null, submenuSelector: string): boolean {\n if (popoverEl?.contains(target)) return false;\n if (triggerEl?.contains(target)) return false;\n\n const el = target as Element;\n\n if (el.closest?.(submenuSelector)) return false;\n\n return true;\n}\n\nexport function isMouseLeavingBlockArea(relatedTarget: Element | null, blockClassName: string): boolean {\n if (!relatedTarget) return true;\n\n return !relatedTarget.closest(`.${blockClassName}`);\n}\n\nexport function setRovingTabindex(items: HTMLElement[], activeEl: HTMLElement | null): void {\n const active = activeEl && items.includes(activeEl) ? activeEl : (items[0] ?? null);\n\n for (const item of items) {\n item.setAttribute('tabindex', item === active ? '0' : '-1');\n }\n}\n"]}
@@ -0,0 +1,231 @@
1
+ import { DEFAULT_HIGHLIGHT_COLOR } from './chunk-TB7ZSSR2.mjs';
2
+ import { isNodeActive } from './chunk-72T5I4O4.mjs';
3
+ import { keymap } from 'prosemirror-keymap';
4
+ export { keymap } from 'prosemirror-keymap';
5
+ import { redo, undo } from 'prosemirror-history';
6
+ import { selectAll, setBlockType, toggleMark, lift, wrapIn } from 'prosemirror-commands';
7
+ export { baseKeymap } from 'prosemirror-commands';
8
+ import { liftListItem, wrapInList, sinkListItem, splitListItem } from 'prosemirror-schema-list';
9
+ import { goToNextCell } from 'prosemirror-tables';
10
+ import { AllSelection, TextSelection } from 'prosemirror-state';
11
+
12
+ function toggleHeadingCmd(schema, level) {
13
+ return (state, dispatch) => {
14
+ const active = isNodeActive(state, schema.nodes.heading, { level });
15
+ return active ? setBlockType(schema.nodes.paragraph)(state, dispatch) : setBlockType(schema.nodes.heading, { level })(state, dispatch);
16
+ };
17
+ }
18
+ function toggleListCmd(schema, listType) {
19
+ return (state, dispatch) => {
20
+ if (isNodeActive(state, listType)) {
21
+ return liftListItem(schema.nodes.list_item)(state, dispatch) || liftListItem(schema.nodes.check_list_item)(state, dispatch);
22
+ }
23
+ return wrapInList(listType)(state, dispatch);
24
+ };
25
+ }
26
+ function toggleBlockquoteCmd(schema) {
27
+ return (state, dispatch) => isNodeActive(state, schema.nodes.blockquote) ? lift(state, dispatch) : wrapIn(schema.nodes.blockquote)(state, dispatch);
28
+ }
29
+ function toggleCodeBlockCmd(schema) {
30
+ return (state, dispatch) => {
31
+ const active = isNodeActive(state, schema.nodes.code_block);
32
+ return setBlockType(active ? schema.nodes.paragraph : schema.nodes.code_block)(state, dispatch);
33
+ };
34
+ }
35
+ function toggleHighlightCmd(schema) {
36
+ return (state, dispatch) => {
37
+ const textStyle = schema.marks.textStyle;
38
+ if (!textStyle || state.selection.empty) return false;
39
+ const { from, to } = state.selection;
40
+ let active = false;
41
+ state.doc.nodesBetween(from, to, (node) => {
42
+ const mark = textStyle.isInSet(node.marks);
43
+ if (mark?.attrs.backgroundColor) active = true;
44
+ });
45
+ if (dispatch) {
46
+ const tr = state.tr;
47
+ state.doc.nodesBetween(from, to, (node, pos) => {
48
+ if (!node.isText) return;
49
+ const mark = textStyle.isInSet(node.marks);
50
+ const next = { ...mark?.attrs ?? {}, backgroundColor: active ? null : DEFAULT_HIGHLIGHT_COLOR };
51
+ const start = Math.max(pos, from);
52
+ const end = Math.min(pos + node.nodeSize, to);
53
+ tr.removeMark(start, end, textStyle);
54
+ if (Object.values(next).some((v) => v != null)) tr.addMark(start, end, textStyle.create(next));
55
+ });
56
+ dispatch(tr);
57
+ }
58
+ return true;
59
+ };
60
+ }
61
+ function setAlignCmd(alignment) {
62
+ return (state, dispatch) => {
63
+ const { from, to } = state.selection;
64
+ const tr = state.tr;
65
+ let changed = false;
66
+ state.doc.nodesBetween(from, to, (node, pos) => {
67
+ if (node.type.spec.attrs?.textAlign !== void 0) {
68
+ tr.setNodeMarkup(pos, null, { ...node.attrs, textAlign: alignment });
69
+ changed = true;
70
+ }
71
+ });
72
+ if (!changed) return false;
73
+ if (dispatch) dispatch(tr);
74
+ return true;
75
+ };
76
+ }
77
+ function forAnyListItem(schema, fn) {
78
+ const listItemCmd = fn(schema.nodes.list_item);
79
+ const checkListItemCmd = fn(schema.nodes.check_list_item);
80
+ return (state, dispatch) => listItemCmd(state, dispatch) || checkListItemCmd(state, dispatch);
81
+ }
82
+ function isUploadPlaceholder(schema, node) {
83
+ return !!node && (node.type === schema.nodes.image_upload_placeholder || node.type === schema.nodes.document_upload_placeholder);
84
+ }
85
+ function deleteAdjacentPlaceholder(schema, dir) {
86
+ return (state, dispatch) => {
87
+ const { $from, empty } = state.selection;
88
+ if (!empty) return false;
89
+ const target = dir < 0 ? $from.nodeBefore : $from.nodeAfter;
90
+ const atBoundary = dir < 0 ? $from.parentOffset === 0 : $from.parentOffset === $from.parent.content.size;
91
+ let pos = -1;
92
+ if (isUploadPlaceholder(schema, target)) {
93
+ pos = dir < 0 ? $from.pos - target.nodeSize : $from.pos;
94
+ } else if (atBoundary) {
95
+ const side = dir < 0 ? $from.before() - 1 : $from.after();
96
+ const node = side >= 0 ? state.doc.nodeAt(side) : null;
97
+ if (isUploadPlaceholder(schema, node)) pos = side;
98
+ }
99
+ if (pos < 0) return false;
100
+ if (dispatch) {
101
+ const node = state.doc.nodeAt(pos);
102
+ dispatch(state.tr.delete(pos, pos + node.nodeSize).scrollIntoView());
103
+ }
104
+ return true;
105
+ };
106
+ }
107
+ function listItemBackspace(schema) {
108
+ const listItemTypes = [schema.nodes.list_item, schema.nodes.check_list_item];
109
+ return (state, dispatch) => {
110
+ const { $from, empty } = state.selection;
111
+ if (!empty) return false;
112
+ let listItemDepth = -1;
113
+ for (let depth = $from.depth; depth > 0; depth--) {
114
+ if (listItemTypes.includes($from.node(depth).type)) {
115
+ listItemDepth = depth;
116
+ break;
117
+ }
118
+ }
119
+ if (listItemDepth === -1) return false;
120
+ const listItem = $from.node(listItemDepth);
121
+ if ($from.parentOffset !== 0) return false;
122
+ if ($from.index(listItemDepth) !== 0) return false;
123
+ const listDepth = listItemDepth - 1;
124
+ const list = $from.node(listDepth);
125
+ const indexInList = $from.index(listDepth);
126
+ const isItemEmpty = listItem.textContent.length === 0;
127
+ if (indexInList > 0) {
128
+ if (dispatch) {
129
+ const itemStart = $from.before(listItemDepth);
130
+ const itemEnd = $from.after(listItemDepth);
131
+ const prevItem = list.child(indexInList - 1);
132
+ const prevItemStart = itemStart - prevItem.nodeSize;
133
+ let lastChildOffset = 0;
134
+ prevItem.forEach((child, offset) => {
135
+ lastChildOffset = offset + child.nodeSize;
136
+ });
137
+ const joinPos = prevItemStart + 1 + lastChildOffset - 1;
138
+ const tr = state.tr;
139
+ const firstBlock = listItem.firstChild;
140
+ const firstInline = firstBlock?.content;
141
+ const trailingBlocks = [];
142
+ listItem.forEach((child, _o, i) => {
143
+ if (i > 0) trailingBlocks.push(child);
144
+ });
145
+ tr.delete(itemStart, itemEnd);
146
+ if (trailingBlocks.length > 0) {
147
+ let at = joinPos + 1;
148
+ for (const block of trailingBlocks) {
149
+ tr.insert(at, block);
150
+ at += block.nodeSize;
151
+ }
152
+ }
153
+ if (firstInline && firstInline.size > 0) {
154
+ tr.insert(joinPos, firstInline);
155
+ }
156
+ dispatch(tr.scrollIntoView());
157
+ }
158
+ return true;
159
+ }
160
+ if (isItemEmpty && list.childCount === 1) {
161
+ if (dispatch) {
162
+ const listStart = $from.before(listDepth);
163
+ const listEnd = $from.after(listDepth);
164
+ dispatch(state.tr.replaceWith(listStart, listEnd, schema.nodes.paragraph.create()).scrollIntoView());
165
+ }
166
+ return true;
167
+ }
168
+ return forAnyListItem(schema, liftListItem)(state, dispatch);
169
+ };
170
+ }
171
+ function blockSelectAll() {
172
+ return (state, dispatch) => {
173
+ if (state.selection instanceof AllSelection) return false;
174
+ const { $from } = state.selection;
175
+ const depth = $from.depth;
176
+ const blockStart = $from.start(depth);
177
+ const blockEnd = $from.end(depth);
178
+ const { from, to } = state.selection;
179
+ if (from === blockStart && to === blockEnd) {
180
+ return selectAll(state, dispatch);
181
+ }
182
+ if (dispatch) {
183
+ dispatch(state.tr.setSelection(TextSelection.create(state.doc, blockStart, blockEnd)));
184
+ }
185
+ return true;
186
+ };
187
+ }
188
+ function createEditorKeymap(schema, options) {
189
+ const bindings = {
190
+ "Mod-b": toggleMark(schema.marks.bold),
191
+ "Mod-i": toggleMark(schema.marks.italic),
192
+ "Mod-u": toggleMark(schema.marks.underline),
193
+ "Mod-Shift-s": toggleMark(schema.marks.strikethrough),
194
+ "Mod-e": toggleMark(schema.marks.code),
195
+ "Mod-Shift-h": toggleHighlightCmd(schema),
196
+ "Mod-,": toggleMark(schema.marks.subscript),
197
+ "Mod-.": toggleMark(schema.marks.superscript),
198
+ "Mod-z": undo,
199
+ "Mod-y": redo,
200
+ "Mod-Shift-z": redo,
201
+ "Mod-Alt-0": setBlockType(schema.nodes.paragraph),
202
+ "Mod-Alt-1": toggleHeadingCmd(schema, 1),
203
+ "Mod-Alt-2": toggleHeadingCmd(schema, 2),
204
+ "Mod-Alt-3": toggleHeadingCmd(schema, 3),
205
+ "Mod-Alt-4": toggleHeadingCmd(schema, 4),
206
+ "Mod-Alt-5": toggleHeadingCmd(schema, 5),
207
+ "Mod-Alt-6": toggleHeadingCmd(schema, 6),
208
+ "Mod-Shift-7": toggleListCmd(schema, schema.nodes.ordered_list),
209
+ "Mod-Shift-8": toggleListCmd(schema, schema.nodes.bullet_list),
210
+ "Mod-Shift-9": toggleListCmd(schema, schema.nodes.check_list),
211
+ "Mod-Shift-b": toggleBlockquoteCmd(schema),
212
+ "Mod-Alt-c": toggleCodeBlockCmd(schema),
213
+ "Mod-Shift-l": setAlignCmd(null),
214
+ "Mod-Shift-e": setAlignCmd("center"),
215
+ "Mod-Shift-r": setAlignCmd("right"),
216
+ "Mod-Shift-j": setAlignCmd("justify"),
217
+ Enter: forAnyListItem(schema, splitListItem),
218
+ Backspace: (state, dispatch) => deleteAdjacentPlaceholder(schema, -1)(state, dispatch) || listItemBackspace(schema)(state, dispatch),
219
+ Delete: deleteAdjacentPlaceholder(schema, 1),
220
+ Tab: (state, dispatch) => goToNextCell(1)(state, dispatch) || forAnyListItem(schema, sinkListItem)(state, dispatch),
221
+ "Shift-Tab": (state, dispatch) => goToNextCell(-1)(state, dispatch) || forAnyListItem(schema, liftListItem)(state, dispatch)
222
+ };
223
+ if (options?.blockMode) {
224
+ bindings["Mod-a"] = blockSelectAll();
225
+ }
226
+ return keymap(bindings);
227
+ }
228
+
229
+ export { blockSelectAll, createEditorKeymap };
230
+ //# sourceMappingURL=chunk-YHMP6AN3.mjs.map
231
+ //# sourceMappingURL=chunk-YHMP6AN3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/keymap.ts"],"names":[],"mappings":"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","file":"chunk-YHMP6AN3.mjs","sourcesContent":["import { keymap } from 'prosemirror-keymap';\nimport { undo, redo } from 'prosemirror-history';\nimport { toggleMark, selectAll, baseKeymap, setBlockType, wrapIn, lift } from 'prosemirror-commands';\nimport type { Command } from 'prosemirror-state';\nimport { splitListItem, liftListItem, sinkListItem, wrapInList } from 'prosemirror-schema-list';\nimport { goToNextCell } from 'prosemirror-tables';\nimport { TextSelection, AllSelection } from 'prosemirror-state';\nimport type { Node as PMNode, NodeType, Schema } from 'prosemirror-model';\nimport { isNodeActive } from '../state/selection';\nimport { DEFAULT_HIGHLIGHT_COLOR } from '../commands/constants';\n\n// Heading <-> paragraph toggle by level (same level toggles off, different switches).\nfunction toggleHeadingCmd(schema: Schema, level: number): Command {\n return (state, dispatch) => {\n const active = isNodeActive(state, schema.nodes.heading, { level });\n\n return active ? setBlockType(schema.nodes.paragraph)(state, dispatch) : setBlockType(schema.nodes.heading, { level })(state, dispatch);\n };\n}\n\n// Toggle a list on/off: wrap when not active, lift when already in that list.\nfunction toggleListCmd(schema: Schema, listType: NodeType): Command {\n return (state, dispatch) => {\n if (isNodeActive(state, listType)) {\n return liftListItem(schema.nodes.list_item)(state, dispatch) || liftListItem(schema.nodes.check_list_item)(state, dispatch);\n }\n\n return wrapInList(listType)(state, dispatch);\n };\n}\n\nfunction toggleBlockquoteCmd(schema: Schema): Command {\n return (state, dispatch) => (isNodeActive(state, schema.nodes.blockquote) ? lift(state, dispatch) : wrapIn(schema.nodes.blockquote)(state, dispatch));\n}\n\nfunction toggleCodeBlockCmd(schema: Schema): Command {\n return (state, dispatch) => {\n const active = isNodeActive(state, schema.nodes.code_block);\n\n return setBlockType(active ? schema.nodes.paragraph : schema.nodes.code_block)(state, dispatch);\n };\n}\n\n// Toggle a default highlight (textStyle backgroundColor) over the selection.\nfunction toggleHighlightCmd(schema: Schema): Command {\n return (state, dispatch) => {\n const textStyle = schema.marks.textStyle;\n\n if (!textStyle || state.selection.empty) return false;\n\n const { from, to } = state.selection;\n let active = false;\n\n state.doc.nodesBetween(from, to, (node) => {\n const mark = textStyle.isInSet(node.marks);\n\n if (mark?.attrs.backgroundColor) active = true;\n });\n\n if (dispatch) {\n const tr = state.tr;\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n\n const mark = textStyle.isInSet(node.marks);\n const next = { ...(mark?.attrs ?? {}), backgroundColor: active ? null : DEFAULT_HIGHLIGHT_COLOR };\n const start = Math.max(pos, from);\n const end = Math.min(pos + node.nodeSize, to);\n\n tr.removeMark(start, end, textStyle);\n\n if (Object.values(next).some((v) => v != null)) tr.addMark(start, end, textStyle.create(next));\n });\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nfunction setAlignCmd(alignment: string | null): Command {\n return (state, dispatch) => {\n const { from, to } = state.selection;\n const tr = state.tr;\n let changed = false;\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.spec.attrs?.textAlign !== undefined) {\n tr.setNodeMarkup(pos, null, { ...node.attrs, textAlign: alignment });\n changed = true;\n }\n });\n\n if (!changed) return false;\n if (dispatch) dispatch(tr);\n\n return true;\n };\n}\n\nfunction forAnyListItem(schema: Schema, fn: (nodeType: NodeType) => Command): Command {\n const listItemCmd = fn(schema.nodes.list_item);\n const checkListItemCmd = fn(schema.nodes.check_list_item);\n\n return (state, dispatch) => listItemCmd(state, dispatch) || checkListItemCmd(state, dispatch);\n}\n\nfunction isUploadPlaceholder(schema: Schema, node: PMNode | null): boolean {\n return !!node && (node.type === schema.nodes.image_upload_placeholder || node.type === schema.nodes.document_upload_placeholder);\n}\n\n// Upload placeholders are non-selectable atoms (they own a dismiss control), so\n// they can't be selected and deleted normally. Let Backspace/Delete remove the\n// placeholder adjacent to a collapsed caret, matching normal node deletion.\nfunction deleteAdjacentPlaceholder(schema: Schema, dir: -1 | 1): Command {\n return (state, dispatch) => {\n const { $from, empty } = state.selection;\n\n if (!empty) return false;\n\n const target = dir < 0 ? $from.nodeBefore : $from.nodeAfter;\n const atBoundary = dir < 0 ? $from.parentOffset === 0 : $from.parentOffset === $from.parent.content.size;\n\n // Same-block sibling (e.g. inline) — only act when truly adjacent.\n let pos = -1;\n\n if (isUploadPlaceholder(schema, target)) {\n pos = dir < 0 ? $from.pos - target!.nodeSize : $from.pos;\n } else if (atBoundary) {\n const side = dir < 0 ? $from.before() - 1 : $from.after();\n const node = side >= 0 ? state.doc.nodeAt(side) : null;\n\n if (isUploadPlaceholder(schema, node)) pos = side;\n }\n\n if (pos < 0) return false;\n\n if (dispatch) {\n const node = state.doc.nodeAt(pos)!;\n\n dispatch(state.tr.delete(pos, pos + node.nodeSize).scrollIntoView());\n }\n\n return true;\n };\n}\n\n/**\n * Backspace on an empty list item: delete it and move cursor to end of previous item.\n * If cursor is at start of first list item, lift it out of the list.\n */\nfunction listItemBackspace(schema: Schema): Command {\n const listItemTypes = [schema.nodes.list_item, schema.nodes.check_list_item];\n\n return (state, dispatch) => {\n const { $from, empty } = state.selection;\n\n if (!empty) return false;\n\n // Find the list item we're in\n let listItemDepth = -1;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n if (listItemTypes.includes($from.node(depth).type)) {\n listItemDepth = depth;\n break;\n }\n }\n\n if (listItemDepth === -1) return false;\n\n // Check if cursor is at the very start of the list item's content.\n // Structure is <li><p>text</p></li>, so cursor at start of text\n // is at $from.start(listItemDepth) + 1 (inside the <p>).\n // We check: parentOffset is 0 (start of paragraph) AND\n // the paragraph is the first child of the list item.\n const listItem = $from.node(listItemDepth);\n\n if ($from.parentOffset !== 0) return false;\n\n // Ensure we're in the first child of the list item\n if ($from.index(listItemDepth) !== 0) return false;\n\n const listDepth = listItemDepth - 1;\n const list = $from.node(listDepth);\n const indexInList = $from.index(listDepth);\n const isItemEmpty = listItem.textContent.length === 0;\n\n if (indexInList > 0) {\n // Merge this item into the previous one, preserving all of its blocks.\n if (dispatch) {\n const itemStart = $from.before(listItemDepth);\n const itemEnd = $from.after(listItemDepth);\n\n const prevItem = list.child(indexInList - 1);\n const prevItemStart = itemStart - prevItem.nodeSize;\n let lastChildOffset = 0;\n\n prevItem.forEach((child, offset) => {\n lastChildOffset = offset + child.nodeSize;\n });\n\n const joinPos = prevItemStart + 1 + lastChildOffset - 1;\n\n const tr = state.tr;\n const firstBlock = listItem.firstChild;\n const firstInline = firstBlock?.content;\n const trailingBlocks: PMNode[] = [];\n\n listItem.forEach((child, _o, i) => {\n if (i > 0) trailingBlocks.push(child);\n });\n\n tr.delete(itemStart, itemEnd);\n\n if (trailingBlocks.length > 0) {\n let at = joinPos + 1;\n\n for (const block of trailingBlocks) {\n tr.insert(at, block);\n at += block.nodeSize;\n }\n }\n\n if (firstInline && firstInline.size > 0) {\n tr.insert(joinPos, firstInline);\n }\n\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n if (isItemEmpty && list.childCount === 1) {\n // Empty first and only item: replace entire list with empty paragraph\n if (dispatch) {\n const listStart = $from.before(listDepth);\n const listEnd = $from.after(listDepth);\n\n dispatch(state.tr.replaceWith(listStart, listEnd, schema.nodes.paragraph.create()).scrollIntoView());\n }\n\n return true;\n }\n\n // First item: lift out of list\n return forAnyListItem(schema, liftListItem)(state, dispatch);\n };\n}\n\n/**\n * Notion-like select: first Mod-a selects current block, second Mod-a selects all.\n */\nfunction blockSelectAll(): Command {\n return (state, dispatch) => {\n if (state.selection instanceof AllSelection) return false;\n\n const { $from } = state.selection;\n const depth = $from.depth; // the textblock the caret is in\n const blockStart = $from.start(depth);\n const blockEnd = $from.end(depth);\n const { from, to } = state.selection;\n\n if (from === blockStart && to === blockEnd) {\n return selectAll(state, dispatch);\n }\n\n if (dispatch) {\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, blockStart, blockEnd)));\n }\n\n return true;\n };\n}\n\ninterface EditorKeymapOptions {\n blockMode?: boolean;\n}\n\nexport function createEditorKeymap(schema: Schema, options?: EditorKeymapOptions) {\n const bindings: Record<string, Command> = {\n 'Mod-b': toggleMark(schema.marks.bold),\n 'Mod-i': toggleMark(schema.marks.italic),\n 'Mod-u': toggleMark(schema.marks.underline),\n 'Mod-Shift-s': toggleMark(schema.marks.strikethrough),\n 'Mod-e': toggleMark(schema.marks.code),\n 'Mod-Shift-h': toggleHighlightCmd(schema),\n 'Mod-,': toggleMark(schema.marks.subscript),\n 'Mod-.': toggleMark(schema.marks.superscript),\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Mod-Shift-z': redo,\n 'Mod-Alt-0': setBlockType(schema.nodes.paragraph),\n 'Mod-Alt-1': toggleHeadingCmd(schema, 1),\n 'Mod-Alt-2': toggleHeadingCmd(schema, 2),\n 'Mod-Alt-3': toggleHeadingCmd(schema, 3),\n 'Mod-Alt-4': toggleHeadingCmd(schema, 4),\n 'Mod-Alt-5': toggleHeadingCmd(schema, 5),\n 'Mod-Alt-6': toggleHeadingCmd(schema, 6),\n 'Mod-Shift-7': toggleListCmd(schema, schema.nodes.ordered_list),\n 'Mod-Shift-8': toggleListCmd(schema, schema.nodes.bullet_list),\n 'Mod-Shift-9': toggleListCmd(schema, schema.nodes.check_list),\n 'Mod-Shift-b': toggleBlockquoteCmd(schema),\n 'Mod-Alt-c': toggleCodeBlockCmd(schema),\n 'Mod-Shift-l': setAlignCmd(null),\n 'Mod-Shift-e': setAlignCmd('center'),\n 'Mod-Shift-r': setAlignCmd('right'),\n 'Mod-Shift-j': setAlignCmd('justify'),\n Enter: forAnyListItem(schema, splitListItem),\n Backspace: (state, dispatch) => deleteAdjacentPlaceholder(schema, -1)(state, dispatch) || listItemBackspace(schema)(state, dispatch),\n Delete: deleteAdjacentPlaceholder(schema, 1),\n Tab: (state, dispatch) => goToNextCell(1)(state, dispatch) || forAnyListItem(schema, sinkListItem)(state, dispatch),\n 'Shift-Tab': (state, dispatch) => goToNextCell(-1)(state, dispatch) || forAnyListItem(schema, liftListItem)(state, dispatch)\n };\n\n if (options?.blockMode) {\n bindings['Mod-a'] = blockSelectAll();\n }\n\n return keymap(bindings);\n}\n\nexport { baseKeymap, keymap, blockSelectAll };\n"]}
@@ -0,0 +1,13 @@
1
+ import { EditorView } from 'prosemirror-view';
2
+ import { Schema } from 'prosemirror-model';
3
+ import { TextEditorCommands } from '@primeui/texteditor-types';
4
+
5
+ declare function createCommands(view: EditorView, schema: Schema, callbacks?: {
6
+ onUploadImages?: () => void;
7
+ onUploadDocuments?: () => void;
8
+ }, options?: {
9
+ defaultCellWidth?: number;
10
+ highlightColor?: string | null;
11
+ }): TextEditorCommands;
12
+
13
+ export { createCommands };
@@ -0,0 +1,13 @@
1
+ export { createCommands } from '../chunk-6YDCG63C.mjs';
2
+ import '../chunk-VWGQMUPD.mjs';
3
+ import '../chunk-TB7ZSSR2.mjs';
4
+ import '../chunk-72T5I4O4.mjs';
5
+ import '../chunk-RQ2HHNI6.mjs';
6
+ import '../chunk-6ZN5XRH2.mjs';
7
+ import '../chunk-F7BJWPT6.mjs';
8
+ import '../chunk-7QCHSEN2.mjs';
9
+ import '../chunk-MNKMKFLQ.mjs';
10
+ import '../chunk-GG56GLXC.mjs';
11
+ import '../chunk-J5LGTIGS.mjs';
12
+ //# sourceMappingURL=index.mjs.map
13
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,7 @@
1
+ import * as _primeui_core_types_api from '@primeui/core/types/api';
2
+ import * as _primeui_texteditor_types from '@primeui/texteditor-types';
3
+ import { TextEditorInstance } from '@primeui/texteditor-types';
4
+
5
+ declare const createTextEditor: (context?: _primeui_core_types_api.Context<_primeui_texteditor_types.TextEditorRefs, _primeui_texteditor_types.TextEditorProps, _primeui_texteditor_types.TextEditorState, _primeui_texteditor_types.TextEditorEmits>) => TextEditorInstance;
6
+
7
+ export { createTextEditor };
@@ -0,0 +1,31 @@
1
+ export { createTextEditor } from './chunk-TBQVZVKA.mjs';
2
+ import './chunk-PT2O4RV7.mjs';
3
+ import './chunk-YHMP6AN3.mjs';
4
+ import './chunk-OGEMGWLR.mjs';
5
+ import './chunk-IUQKSDKG.mjs';
6
+ import './chunk-MWT5PK3Z.mjs';
7
+ import './chunk-EA2YI7LA.mjs';
8
+ import './chunk-3RKMABZR.mjs';
9
+ import './chunk-KNZAMA6H.mjs';
10
+ import './chunk-6GY64GPU.mjs';
11
+ import './chunk-NWRVBNBW.mjs';
12
+ import './chunk-GGPBV4BM.mjs';
13
+ import './chunk-AJOKUIQD.mjs';
14
+ import './chunk-E2KXUP3F.mjs';
15
+ import './chunk-PT5V6UYE.mjs';
16
+ import './chunk-22B454VC.mjs';
17
+ import './chunk-PRFYR67X.mjs';
18
+ import './chunk-AUTGNC2Q.mjs';
19
+ import './chunk-6YDCG63C.mjs';
20
+ import './chunk-VWGQMUPD.mjs';
21
+ import './chunk-TB7ZSSR2.mjs';
22
+ import './chunk-72T5I4O4.mjs';
23
+ import './chunk-RQ2HHNI6.mjs';
24
+ import './chunk-6ZN5XRH2.mjs';
25
+ import './chunk-F7BJWPT6.mjs';
26
+ import './chunk-7QCHSEN2.mjs';
27
+ import './chunk-MNKMKFLQ.mjs';
28
+ import './chunk-GG56GLXC.mjs';
29
+ import './chunk-J5LGTIGS.mjs';
30
+ //# sourceMappingURL=createTextEditor.mjs.map
31
+ //# sourceMappingURL=createTextEditor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"createTextEditor.mjs"}