@kerebron/extension-basic-editor 0.4.27 → 0.4.29

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 (242) hide show
  1. package/esm/ExtensionBaseKeymap.d.ts +7 -0
  2. package/esm/ExtensionBaseKeymap.d.ts.map +1 -0
  3. package/esm/ExtensionBaseKeymap.js +56 -0
  4. package/esm/ExtensionBaseKeymap.js.map +1 -0
  5. package/esm/ExtensionBasicCodeEditor.d.ts +11 -0
  6. package/esm/ExtensionBasicCodeEditor.d.ts.map +1 -0
  7. package/esm/ExtensionBasicCodeEditor.js +62 -0
  8. package/esm/ExtensionBasicCodeEditor.js.map +1 -0
  9. package/esm/ExtensionBasicEditor.d.ts +49 -0
  10. package/esm/ExtensionBasicEditor.d.ts.map +1 -0
  11. package/esm/ExtensionBasicEditor.js +95 -0
  12. package/esm/ExtensionBasicEditor.js.map +1 -0
  13. package/esm/ExtensionDropcursor.d.ts +19 -0
  14. package/esm/ExtensionDropcursor.d.ts.map +1 -0
  15. package/esm/ExtensionDropcursor.js +187 -0
  16. package/esm/ExtensionDropcursor.js.map +1 -0
  17. package/esm/ExtensionGapcursor.d.ts +32 -0
  18. package/esm/ExtensionGapcursor.d.ts.map +1 -0
  19. package/esm/ExtensionGapcursor.js +250 -0
  20. package/esm/ExtensionGapcursor.js.map +1 -0
  21. package/esm/ExtensionHistory.d.ts +14 -0
  22. package/esm/ExtensionHistory.d.ts.map +1 -0
  23. package/esm/ExtensionHistory.js +35 -0
  24. package/esm/ExtensionHistory.js.map +1 -0
  25. package/esm/ExtensionHtml.d.ts +15 -0
  26. package/esm/ExtensionHtml.d.ts.map +1 -0
  27. package/esm/ExtensionHtml.js +100 -0
  28. package/esm/ExtensionHtml.js.map +1 -0
  29. package/esm/ExtensionMediaUpload.d.ts +24 -0
  30. package/esm/ExtensionMediaUpload.d.ts.map +1 -0
  31. package/esm/ExtensionMediaUpload.js +168 -0
  32. package/esm/ExtensionMediaUpload.js.map +1 -0
  33. package/esm/ExtensionSelection.d.ts +11 -0
  34. package/esm/ExtensionSelection.d.ts.map +1 -0
  35. package/esm/ExtensionSelection.js +230 -0
  36. package/esm/ExtensionSelection.js.map +1 -0
  37. package/esm/ExtensionTextAlign.d.ts +11 -0
  38. package/esm/ExtensionTextAlign.d.ts.map +1 -0
  39. package/esm/ExtensionTextAlign.js +40 -0
  40. package/esm/ExtensionTextAlign.js.map +1 -0
  41. package/esm/MarkBookmark.d.ts +8 -0
  42. package/esm/MarkBookmark.d.ts.map +1 -0
  43. package/esm/MarkBookmark.js +17 -0
  44. package/esm/MarkBookmark.js.map +1 -0
  45. package/esm/MarkChange.d.ts +8 -0
  46. package/esm/MarkChange.d.ts.map +1 -0
  47. package/esm/MarkChange.js +14 -0
  48. package/esm/MarkChange.js.map +1 -0
  49. package/esm/MarkCode.d.ts +11 -0
  50. package/esm/MarkCode.d.ts.map +1 -0
  51. package/esm/MarkCode.js +24 -0
  52. package/esm/MarkCode.js.map +1 -0
  53. package/esm/MarkHighlight.d.ts +8 -0
  54. package/esm/MarkHighlight.d.ts.map +1 -0
  55. package/esm/MarkHighlight.js +36 -0
  56. package/esm/MarkHighlight.js.map +1 -0
  57. package/esm/MarkItalic.d.ts +11 -0
  58. package/esm/MarkItalic.d.ts.map +1 -0
  59. package/esm/MarkItalic.js +30 -0
  60. package/esm/MarkItalic.js.map +1 -0
  61. package/esm/MarkLink.d.ts +8 -0
  62. package/esm/MarkLink.d.ts.map +1 -0
  63. package/esm/MarkLink.js +30 -0
  64. package/esm/MarkLink.js.map +1 -0
  65. package/esm/MarkStrike.d.ts +11 -0
  66. package/esm/MarkStrike.d.ts.map +1 -0
  67. package/esm/MarkStrike.js +27 -0
  68. package/esm/MarkStrike.js.map +1 -0
  69. package/esm/MarkStrong.d.ts +11 -0
  70. package/esm/MarkStrong.d.ts.map +1 -0
  71. package/esm/MarkStrong.js +39 -0
  72. package/esm/MarkStrong.js.map +1 -0
  73. package/esm/MarkSubscript.d.ts +11 -0
  74. package/esm/MarkSubscript.d.ts.map +1 -0
  75. package/esm/MarkSubscript.js +31 -0
  76. package/esm/MarkSubscript.js.map +1 -0
  77. package/esm/MarkSuperscript.d.ts +11 -0
  78. package/esm/MarkSuperscript.d.ts.map +1 -0
  79. package/esm/MarkSuperscript.js +31 -0
  80. package/esm/MarkSuperscript.js.map +1 -0
  81. package/esm/MarkTextColor.d.ts +8 -0
  82. package/esm/MarkTextColor.d.ts.map +1 -0
  83. package/esm/MarkTextColor.js +28 -0
  84. package/esm/MarkTextColor.js.map +1 -0
  85. package/esm/MarkUnderline.d.ts +11 -0
  86. package/esm/MarkUnderline.d.ts.map +1 -0
  87. package/esm/MarkUnderline.js +34 -0
  88. package/esm/MarkUnderline.js.map +1 -0
  89. package/esm/NodeAside.d.ts +8 -0
  90. package/esm/NodeAside.d.ts.map +1 -0
  91. package/esm/NodeAside.js +17 -0
  92. package/esm/NodeAside.js.map +1 -0
  93. package/esm/NodeBlockquote.d.ts +13 -0
  94. package/esm/NodeBlockquote.d.ts.map +1 -0
  95. package/esm/NodeBlockquote.js +35 -0
  96. package/esm/NodeBlockquote.js.map +1 -0
  97. package/esm/NodeBookmark.d.ts +8 -0
  98. package/esm/NodeBookmark.d.ts.map +1 -0
  99. package/esm/NodeBookmark.js +20 -0
  100. package/esm/NodeBookmark.js.map +1 -0
  101. package/esm/NodeBulletList.d.ts +13 -0
  102. package/esm/NodeBulletList.d.ts.map +1 -0
  103. package/esm/NodeBulletList.js +35 -0
  104. package/esm/NodeBulletList.js.map +1 -0
  105. package/esm/NodeCodeBlock.d.ts +9 -0
  106. package/esm/NodeCodeBlock.d.ts.map +1 -0
  107. package/esm/NodeCodeBlock.js +51 -0
  108. package/esm/NodeCodeBlock.js.map +1 -0
  109. package/esm/NodeDefinitionDesc.d.ts +8 -0
  110. package/esm/NodeDefinitionDesc.d.ts.map +1 -0
  111. package/esm/NodeDefinitionDesc.js +17 -0
  112. package/esm/NodeDefinitionDesc.js.map +1 -0
  113. package/esm/NodeDefinitionList.d.ts +13 -0
  114. package/esm/NodeDefinitionList.d.ts.map +1 -0
  115. package/esm/NodeDefinitionList.js +29 -0
  116. package/esm/NodeDefinitionList.js.map +1 -0
  117. package/esm/NodeDefinitionTerm.d.ts +8 -0
  118. package/esm/NodeDefinitionTerm.d.ts.map +1 -0
  119. package/esm/NodeDefinitionTerm.js +17 -0
  120. package/esm/NodeDefinitionTerm.js.map +1 -0
  121. package/esm/NodeDocument.d.ts +7 -0
  122. package/esm/NodeDocument.d.ts.map +1 -0
  123. package/esm/NodeDocument.js +20 -0
  124. package/esm/NodeDocument.js.map +1 -0
  125. package/esm/NodeDocumentCode.d.ts +7 -0
  126. package/esm/NodeDocumentCode.d.ts.map +1 -0
  127. package/esm/NodeDocumentCode.js +30 -0
  128. package/esm/NodeDocumentCode.js.map +1 -0
  129. package/esm/NodeFrontmatter.d.ts +8 -0
  130. package/esm/NodeFrontmatter.d.ts.map +1 -0
  131. package/esm/NodeFrontmatter.js +17 -0
  132. package/esm/NodeFrontmatter.js.map +1 -0
  133. package/esm/NodeHardBreak.d.ts +14 -0
  134. package/esm/NodeHardBreak.d.ts.map +1 -0
  135. package/esm/NodeHardBreak.js +68 -0
  136. package/esm/NodeHardBreak.js.map +1 -0
  137. package/esm/NodeHeading.d.ts +13 -0
  138. package/esm/NodeHeading.d.ts.map +1 -0
  139. package/esm/NodeHeading.js +50 -0
  140. package/esm/NodeHeading.js.map +1 -0
  141. package/esm/NodeHorizontalRule.d.ts +11 -0
  142. package/esm/NodeHorizontalRule.d.ts.map +1 -0
  143. package/esm/NodeHorizontalRule.js +30 -0
  144. package/esm/NodeHorizontalRule.js.map +1 -0
  145. package/esm/NodeImage.d.ts +8 -0
  146. package/esm/NodeImage.d.ts.map +1 -0
  147. package/esm/NodeImage.js +34 -0
  148. package/esm/NodeImage.js.map +1 -0
  149. package/esm/NodeInlineShortCode.d.ts +11 -0
  150. package/esm/NodeInlineShortCode.d.ts.map +1 -0
  151. package/esm/NodeInlineShortCode.js +40 -0
  152. package/esm/NodeInlineShortCode.js.map +1 -0
  153. package/esm/NodeListItem.d.ts +14 -0
  154. package/esm/NodeListItem.d.ts.map +1 -0
  155. package/esm/NodeListItem.js +202 -0
  156. package/esm/NodeListItem.js.map +1 -0
  157. package/esm/NodeMath.d.ts +8 -0
  158. package/esm/NodeMath.d.ts.map +1 -0
  159. package/esm/NodeMath.js +100 -0
  160. package/esm/NodeMath.js.map +1 -0
  161. package/esm/NodeOrderedList.d.ts +23 -0
  162. package/esm/NodeOrderedList.d.ts.map +1 -0
  163. package/esm/NodeOrderedList.js +53 -0
  164. package/esm/NodeOrderedList.js.map +1 -0
  165. package/esm/NodeParagraph.d.ts +11 -0
  166. package/esm/NodeParagraph.d.ts.map +1 -0
  167. package/esm/NodeParagraph.js +45 -0
  168. package/esm/NodeParagraph.js.map +1 -0
  169. package/esm/NodeTaskItem.d.ts +24 -0
  170. package/esm/NodeTaskItem.d.ts.map +1 -0
  171. package/esm/NodeTaskItem.js +147 -0
  172. package/esm/NodeTaskItem.js.map +1 -0
  173. package/esm/NodeTaskList.d.ts +11 -0
  174. package/esm/NodeTaskList.d.ts.map +1 -0
  175. package/esm/NodeTaskList.js +26 -0
  176. package/esm/NodeTaskList.js.map +1 -0
  177. package/esm/NodeText.d.ts +7 -0
  178. package/esm/NodeText.d.ts.map +1 -0
  179. package/esm/NodeText.js +10 -0
  180. package/esm/NodeText.js.map +1 -0
  181. package/esm/NodeVideo.d.ts +8 -0
  182. package/esm/NodeVideo.d.ts.map +1 -0
  183. package/esm/NodeVideo.js +46 -0
  184. package/esm/NodeVideo.js.map +1 -0
  185. package/esm/package.json +3 -0
  186. package/esm/remote-selection/ExtensionRemoteSelection.d.ts +24 -0
  187. package/esm/remote-selection/ExtensionRemoteSelection.d.ts.map +1 -0
  188. package/esm/remote-selection/ExtensionRemoteSelection.js +23 -0
  189. package/esm/remote-selection/ExtensionRemoteSelection.js.map +1 -0
  190. package/esm/remote-selection/remoteSelectionPlugin.d.ts +25 -0
  191. package/esm/remote-selection/remoteSelectionPlugin.d.ts.map +1 -0
  192. package/esm/remote-selection/remoteSelectionPlugin.js +97 -0
  193. package/esm/remote-selection/remoteSelectionPlugin.js.map +1 -0
  194. package/package.json +6 -3
  195. package/src/ExtensionBaseKeymap.ts +64 -0
  196. package/src/ExtensionBasicCodeEditor.ts +82 -0
  197. package/src/ExtensionBasicEditor.ts +97 -0
  198. package/src/ExtensionDropcursor.ts +221 -0
  199. package/src/ExtensionGapcursor.ts +278 -0
  200. package/src/ExtensionHistory.ts +48 -0
  201. package/src/ExtensionHtml.ts +158 -0
  202. package/src/ExtensionMediaUpload.ts +258 -0
  203. package/src/ExtensionSelection.ts +379 -0
  204. package/src/ExtensionTextAlign.ts +50 -0
  205. package/src/MarkBookmark.ts +20 -0
  206. package/src/MarkChange.ts +17 -0
  207. package/src/MarkCode.ts +35 -0
  208. package/src/MarkHighlight.ts +38 -0
  209. package/src/MarkItalic.ts +41 -0
  210. package/src/MarkLink.ts +32 -0
  211. package/src/MarkStrike.ts +38 -0
  212. package/src/MarkStrong.ts +52 -0
  213. package/src/MarkSubscript.ts +42 -0
  214. package/src/MarkSuperscript.ts +42 -0
  215. package/src/MarkTextColor.ts +29 -0
  216. package/src/MarkUnderline.ts +47 -0
  217. package/src/NodeAside.ts +19 -0
  218. package/src/NodeBlockquote.ts +51 -0
  219. package/src/NodeBookmark.ts +23 -0
  220. package/src/NodeBulletList.ts +51 -0
  221. package/src/NodeCodeBlock.ts +60 -0
  222. package/src/NodeDefinitionDesc.ts +19 -0
  223. package/src/NodeDefinitionList.ts +46 -0
  224. package/src/NodeDefinitionTerm.ts +19 -0
  225. package/src/NodeDocument.ts +22 -0
  226. package/src/NodeDocumentCode.ts +33 -0
  227. package/src/NodeFrontmatter.ts +19 -0
  228. package/src/NodeHardBreak.ts +92 -0
  229. package/src/NodeHeading.ts +76 -0
  230. package/src/NodeHorizontalRule.ts +43 -0
  231. package/src/NodeImage.ts +36 -0
  232. package/src/NodeInlineShortCode.ts +55 -0
  233. package/src/NodeListItem.ts +320 -0
  234. package/src/NodeMath.ts +109 -0
  235. package/src/NodeOrderedList.ts +79 -0
  236. package/src/NodeParagraph.ts +60 -0
  237. package/src/NodeTaskItem.ts +190 -0
  238. package/src/NodeTaskList.ts +38 -0
  239. package/src/NodeText.ts +12 -0
  240. package/src/NodeVideo.ts +44 -0
  241. package/src/remote-selection/ExtensionRemoteSelection.ts +45 -0
  242. package/src/remote-selection/remoteSelectionPlugin.ts +157 -0
@@ -0,0 +1,147 @@
1
+ import { Node } from '@kerebron/editor';
2
+ import { wrappingInputRule } from '@kerebron/editor/plugins/input-rules';
3
+ import { liftListItem, sinkListItem, splitListItem, } from './NodeListItem.js';
4
+ /**
5
+ * Matches a task item to a - [ ] on input.
6
+ */
7
+ export const inputRegex = /^\s*(\[([( |x])?\])\s$/;
8
+ export class NodeTaskItem extends Node {
9
+ config;
10
+ name = 'task_item';
11
+ requires = ['doc'];
12
+ constructor(config = {}) {
13
+ super(config);
14
+ this.config = config;
15
+ }
16
+ getNodeSpec() {
17
+ return {
18
+ attrs: {
19
+ checked: {
20
+ default: false,
21
+ },
22
+ },
23
+ content: this.config.nested ? 'paragraph block*' : 'paragraph+',
24
+ parseDOM: [{
25
+ tag: 'li[data-checked]',
26
+ getAttrs(node) {
27
+ return {
28
+ checked: node.getAttribute('data-checked') === 'true',
29
+ };
30
+ },
31
+ }],
32
+ defining: true,
33
+ toDOM(node) {
34
+ return [
35
+ 'li',
36
+ {
37
+ 'data-type': this.name,
38
+ 'data-checked': node.attrs.checked,
39
+ },
40
+ [
41
+ 'label',
42
+ [
43
+ 'input',
44
+ {
45
+ type: 'checkbox',
46
+ checked: node.attrs.checked ? 'checked' : null,
47
+ },
48
+ ],
49
+ ['span'],
50
+ ],
51
+ ['div', 0],
52
+ ];
53
+ },
54
+ };
55
+ }
56
+ getCommandFactories(editor, type) {
57
+ return {
58
+ 'splitListItem': () => splitListItem(type),
59
+ 'liftListItem': () => liftListItem(type),
60
+ 'sinkListItem': () => sinkListItem(type),
61
+ };
62
+ }
63
+ getNodeView(editor) {
64
+ return (node, view, getPos) => {
65
+ const listItem = document.createElement('li');
66
+ const checkboxWrapper = document.createElement('label');
67
+ const checkboxStyler = document.createElement('span');
68
+ const checkbox = document.createElement('input');
69
+ const content = document.createElement('div');
70
+ // Style for inline checkbox and text
71
+ listItem.style.display = 'flex';
72
+ listItem.style.alignItems = 'flex-start';
73
+ listItem.style.gap = '0.5em';
74
+ checkboxWrapper.style.flexShrink = '0';
75
+ checkboxWrapper.style.marginTop = '0.25em';
76
+ content.style.flex = '1';
77
+ checkboxWrapper.contentEditable = 'false';
78
+ checkbox.type = 'checkbox';
79
+ checkbox.addEventListener('mousedown', (event) => event.preventDefault());
80
+ checkbox.addEventListener('change', (event) => {
81
+ const isEditable = true; // TODO editor.isEditable
82
+ // if the editor isn’t editable and we don't have a handler for
83
+ // readonly checks we have to undo the latest change
84
+ if (!isEditable && !this.config.onReadOnlyChecked) {
85
+ checkbox.checked = !checkbox.checked;
86
+ return;
87
+ }
88
+ const { checked } = event.target;
89
+ if (isEditable && typeof getPos === 'function') {
90
+ editor
91
+ .chain()
92
+ .focus(undefined, { scrollIntoView: false })
93
+ .command(({ tr }) => {
94
+ const position = getPos();
95
+ if (typeof position !== 'number') {
96
+ return false;
97
+ }
98
+ const currentNode = tr.doc.nodeAt(position);
99
+ tr.setNodeMarkup(position, undefined, {
100
+ ...currentNode?.attrs,
101
+ checked,
102
+ });
103
+ return true;
104
+ })
105
+ .run();
106
+ }
107
+ if (!isEditable && this.config.onReadOnlyChecked) {
108
+ // Reset state if onReadOnlyChecked returns false
109
+ if (!this.config.onReadOnlyChecked(node, checked)) {
110
+ checkbox.checked = !checkbox.checked;
111
+ }
112
+ }
113
+ });
114
+ listItem.dataset.checked = node.attrs.checked;
115
+ checkbox.checked = node.attrs.checked;
116
+ checkboxWrapper.append(checkbox, checkboxStyler);
117
+ listItem.append(checkboxWrapper, content);
118
+ return {
119
+ dom: listItem,
120
+ contentDOM: content,
121
+ update: (updatedNode) => {
122
+ if (updatedNode.type.name !== this.type) {
123
+ return false;
124
+ }
125
+ listItem.dataset.checked = updatedNode.attrs.checked;
126
+ checkbox.checked = updatedNode.attrs.checked;
127
+ return true;
128
+ },
129
+ };
130
+ };
131
+ }
132
+ getKeyboardShortcuts() {
133
+ return {
134
+ 'Enter': 'splitListItem',
135
+ 'Tab': 'sinkListItem',
136
+ 'Shift-Tab': 'liftListItem',
137
+ };
138
+ }
139
+ getInputRules(type) {
140
+ return [
141
+ wrappingInputRule(inputRegex, type, (match) => ({
142
+ checked: match[match.length - 1] === 'x',
143
+ })),
144
+ ];
145
+ }
146
+ }
147
+ //# sourceMappingURL=NodeTaskItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeTaskItem.js","sourceRoot":"","sources":["../src/NodeTaskItem.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAKzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAOnD,MAAM,OAAO,YAAa,SAAQ,IAAI;IAIE;IAH7B,IAAI,GAAG,WAAW,CAAC;IAC5B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC;IAEnB,YAAsC,SAAmC,EAAE;QACzE,KAAK,CAAC,MAAM,CAAC,CAAC;QADsB,WAAM,GAAN,MAAM,CAA+B;IAE3E,CAAC;IAEQ,WAAW;QAClB,OAAO;YACL,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP,OAAO,EAAE,KAAK;iBACf;aACF;YACD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY;YAC/D,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,kBAAkB;oBACvB,QAAQ,CAAC,IAAI;wBACX,OAAO;4BACL,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM;yBACtD,CAAC;oBACJ,CAAC;iBACF,CAAC;YACF,QAAQ,EAAE,IAAI;YACd,KAAK,CAAC,IAAI;gBACR,OAAO;oBACL,IAAI;oBACJ;wBACE,WAAW,EAAE,IAAI,CAAC,IAAI;wBACtB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBACnC;oBACD;wBACE,OAAO;wBACP;4BACE,OAAO;4BACP;gCACE,IAAI,EAAE,UAAU;gCAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;6BAC/C;yBACF;wBACD,CAAC,MAAM,CAAC;qBACT;oBACD,CAAC,KAAK,EAAE,CAAC,CAAC;iBACX,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAEQ,mBAAmB,CAC1B,MAAkB,EAClB,IAAc;QAEd,OAAO;YACL,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1C,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;YACxC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;SACzC,CAAC;IACJ,CAAC;IAEQ,WAAW,CAAC,MAAkB;QACrC,OAAO,CAAC,IAAY,EAAE,IAAgB,EAAE,MAAM,EAAE,EAAE;YAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAE9C,qCAAqC;YACrC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAChC,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC;YACzC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;YAC7B,eAAe,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;YACvC,eAAe,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;YAEzB,eAAe,CAAC,eAAe,GAAG,OAAO,CAAC;YAC1C,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC;YAC3B,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC1E,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,yBAAyB;gBAElD,+DAA+D;gBAC/D,oDAAoD;gBACpD,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBAClD,QAAQ,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAErC,OAAO;gBACT,CAAC;gBAED,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAa,CAAC;gBAExC,IAAI,UAAU,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC/C,MAAM;yBACH,KAAK,EAAE;yBACP,KAAK,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;yBAC3C,OAAO,CAAC,CAAC,EAAE,EAAE,EAAuB,EAAE,EAAE;wBACvC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;wBAE1B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BACjC,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,MAAM,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAE5C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE;4BACpC,GAAG,WAAW,EAAE,KAAK;4BACrB,OAAO;yBACR,CAAC,CAAC;wBAEH,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC;yBACD,GAAG,EAAE,CAAC;gBACX,CAAC;gBACD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACjD,iDAAiD;oBACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;wBAClD,QAAQ,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9C,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAEtC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACjD,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE1C,OAAO;gBACL,GAAG,EAAE,QAAQ;gBACb,UAAU,EAAE,OAAO;gBACnB,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE;oBACtB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBACxC,OAAO,KAAK,CAAC;oBACf,CAAC;oBAED,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;oBACrD,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;oBAE7C,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAEQ,oBAAoB;QAC3B,OAAO;YACL,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,cAAc;SAC5B,CAAC;IACJ,CAAC;IAEQ,aAAa,CAAC,IAAc;QACnC,OAAO;YACL,iBAAiB,CACf,UAAU,EACV,IAAI,EACJ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACV,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;aACzC,CAAC,CACH;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { NodeSpec, NodeType } from 'prosemirror-model';
2
+ import { type CoreEditor, Node } from '@kerebron/editor';
3
+ import { type CommandFactories, type CommandShortcuts } from '@kerebron/editor/commands';
4
+ export declare class NodeTaskList extends Node {
5
+ name: string;
6
+ requires: string[];
7
+ getNodeSpec(): NodeSpec;
8
+ getCommandFactories(editor: CoreEditor, type: NodeType): Partial<CommandFactories>;
9
+ getKeyboardShortcuts(): Partial<CommandShortcuts>;
10
+ }
11
+ //# sourceMappingURL=NodeTaskList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeTaskList.d.ts","sourceRoot":"","sources":["../src/NodeTaskList.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,KAAK,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAEnC,qBAAa,YAAa,SAAQ,IAAI;IAC3B,IAAI,SAAe;IAC5B,QAAQ,WAAW;IAEV,WAAW,IAAI,QAAQ;IAWvB,mBAAmB,CAC1B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC;IAMnB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAK3D"}
@@ -0,0 +1,26 @@
1
+ import { Node } from '@kerebron/editor';
2
+ export class NodeTaskList extends Node {
3
+ name = 'task_list';
4
+ requires = ['doc'];
5
+ getNodeSpec() {
6
+ return {
7
+ content: 'task_item+',
8
+ group: 'block',
9
+ parseDOM: [{ tag: `ul[data-type="${this.name}"]` }],
10
+ toDOM() {
11
+ return ['ul', { 'data-type': this.name }, 0];
12
+ },
13
+ };
14
+ }
15
+ getCommandFactories(editor, type) {
16
+ return {
17
+ 'toggleTaskList': () => editor.commandFactories.wrapInList(type),
18
+ };
19
+ }
20
+ getKeyboardShortcuts() {
21
+ return {
22
+ 'Shift-Ctrl-9': 'toggleTaskList',
23
+ };
24
+ }
25
+ }
26
+ //# sourceMappingURL=NodeTaskList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeTaskList.js","sourceRoot":"","sources":["../src/NodeTaskList.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAMzD,MAAM,OAAO,YAAa,SAAQ,IAAI;IAC3B,IAAI,GAAG,WAAW,CAAC;IAC5B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC;IAEV,WAAW;QAClB,OAAO;YACL,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,iBAAiB,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YACnD,KAAK;gBACH,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC;SACF,CAAC;IACJ,CAAC;IAEQ,mBAAmB,CAC1B,MAAkB,EAClB,IAAc;QAEd,OAAO;YACL,gBAAgB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;SACjE,CAAC;IACJ,CAAC;IAEQ,oBAAoB;QAC3B,OAAO;YACL,cAAc,EAAE,gBAAgB;SACjC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { NodeSpec } from 'prosemirror-model';
2
+ import { Node } from '@kerebron/editor';
3
+ export declare class NodeText extends Node {
4
+ name: string;
5
+ getNodeSpec(): NodeSpec;
6
+ }
7
+ //# sourceMappingURL=NodeText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeText.d.ts","sourceRoot":"","sources":["../src/NodeText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,qBAAa,QAAS,SAAQ,IAAI;IACvB,IAAI,SAAU;IAEd,WAAW,IAAI,QAAQ;CAKjC"}
@@ -0,0 +1,10 @@
1
+ import { Node } from '@kerebron/editor';
2
+ export class NodeText extends Node {
3
+ name = 'text';
4
+ getNodeSpec() {
5
+ return {
6
+ group: 'inline',
7
+ };
8
+ }
9
+ }
10
+ //# sourceMappingURL=NodeText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeText.js","sourceRoot":"","sources":["../src/NodeText.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,OAAO,QAAS,SAAQ,IAAI;IACvB,IAAI,GAAG,MAAM,CAAC;IAEd,WAAW;QAClB,OAAO;YACL,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { type NodeSpec } from 'prosemirror-model';
2
+ import { Node } from '@kerebron/editor';
3
+ export declare class NodeVideo extends Node {
4
+ name: string;
5
+ requires: string[];
6
+ getNodeSpec(): NodeSpec;
7
+ }
8
+ //# sourceMappingURL=NodeVideo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeVideo.d.ts","sourceRoot":"","sources":["../src/NodeVideo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,qBAAa,SAAU,SAAQ,IAAI;IACxB,IAAI,SAAW;IACxB,QAAQ,WAAW;IAEV,WAAW,IAAI,QAAQ;CAoCjC"}
@@ -0,0 +1,46 @@
1
+ import { Node } from '@kerebron/editor';
2
+ export class NodeVideo extends Node {
3
+ name = 'video';
4
+ requires = ['doc'];
5
+ getNodeSpec() {
6
+ return {
7
+ attrs: {
8
+ src: {},
9
+ title: { default: null },
10
+ controls: { default: true },
11
+ width: { default: null },
12
+ height: { default: null },
13
+ },
14
+ group: 'block',
15
+ draggable: true,
16
+ parseDOM: [
17
+ {
18
+ tag: 'video[src]',
19
+ getAttrs(dom) {
20
+ return {
21
+ src: dom.getAttribute('src'),
22
+ title: dom.getAttribute('title'),
23
+ controls: dom.hasAttribute('controls'),
24
+ width: dom.getAttribute('width'),
25
+ height: dom.getAttribute('height'),
26
+ };
27
+ },
28
+ },
29
+ ],
30
+ toDOM(node) {
31
+ const { src, title, controls, width, height } = node.attrs;
32
+ const attrs = { src };
33
+ if (title)
34
+ attrs.title = title;
35
+ if (controls)
36
+ attrs.controls = ''; // Boolean attribute - just needs to be present
37
+ if (width)
38
+ attrs.width = width;
39
+ if (height)
40
+ attrs.height = height;
41
+ return ['video', attrs];
42
+ },
43
+ };
44
+ }
45
+ }
46
+ //# sourceMappingURL=NodeVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeVideo.js","sourceRoot":"","sources":["../src/NodeVideo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,OAAO,SAAU,SAAQ,IAAI;IACxB,IAAI,GAAG,OAAO,CAAC;IACxB,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC;IAEV,WAAW;QAClB,OAAO;YACL,KAAK,EAAE;gBACL,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAC1B;YACD,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,YAAY;oBACjB,QAAQ,CAAC,GAAgB;wBACvB,OAAO;4BACL,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;4BAC5B,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;4BAChC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;4BACtC,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;4BAChC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;yBACnC,CAAC;oBACJ,CAAC;iBACF;aACF;YACD,KAAK,CAAC,IAAI;gBACR,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC3D,MAAM,KAAK,GAAQ,EAAE,GAAG,EAAE,CAAC;gBAC3B,IAAI,KAAK;oBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC/B,IAAI,QAAQ;oBAAE,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,+CAA+C;gBAClF,IAAI,KAAK;oBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC/B,IAAI,MAAM;oBAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBAClC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,24 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { Extension } from '@kerebron/editor';
3
+ type Color = string;
4
+ export interface SelectionState {
5
+ clientId: number;
6
+ user: {
7
+ name: string;
8
+ color: Color;
9
+ colorLight: Color;
10
+ };
11
+ cursor?: {
12
+ anchor: number;
13
+ head: number;
14
+ };
15
+ }
16
+ export { remoteSelectionPluginKey } from './remoteSelectionPlugin.js';
17
+ export declare class ExtensionRemoteSelection extends Extension {
18
+ name: string;
19
+ private remoteStates;
20
+ getProseMirrorPlugins(): Plugin[];
21
+ getRemoteStates(): SelectionState[];
22
+ setRemoteStates(states: SelectionState[]): void;
23
+ }
24
+ //# sourceMappingURL=ExtensionRemoteSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRemoteSelection.d.ts","sourceRoot":"","sources":["../../src/remote-selection/ExtensionRemoteSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAmB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI9D,KAAK,KAAK,GAAG,MAAM,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,KAAK,CAAC;KACnB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,qBAAa,wBAAyB,SAAQ,SAAS;IAC5C,IAAI,SAAsB;IAEnC,OAAO,CAAC,YAAY,CAAwB;IAEnC,qBAAqB,IAAI,MAAM,EAAE;IAM1C,eAAe,IAAI,cAAc,EAAE;IAInC,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE;CAOzC"}
@@ -0,0 +1,23 @@
1
+ import { Extension } from '@kerebron/editor';
2
+ import { remoteSelectionPlugin } from './remoteSelectionPlugin.js';
3
+ export { remoteSelectionPluginKey } from './remoteSelectionPlugin.js';
4
+ export class ExtensionRemoteSelection extends Extension {
5
+ name = 'remote-selection';
6
+ remoteStates = [];
7
+ getProseMirrorPlugins() {
8
+ return [
9
+ remoteSelectionPlugin(this, this.editor),
10
+ ];
11
+ }
12
+ getRemoteStates() {
13
+ return this.remoteStates;
14
+ }
15
+ setRemoteStates(states) {
16
+ this.remoteStates = states;
17
+ const event = new CustomEvent('remoteSelectionChange', {
18
+ detail: {},
19
+ });
20
+ this.editor.dispatchEvent(event);
21
+ }
22
+ }
23
+ //# sourceMappingURL=ExtensionRemoteSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRemoteSelection.js","sourceRoot":"","sources":["../../src/remote-selection/ExtensionRemoteSelection.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAiBnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IAC5C,IAAI,GAAG,kBAAkB,CAAC;IAE3B,YAAY,GAAqB,EAAE,CAAC;IAEnC,qBAAqB;QAC5B,OAAO;YACL,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,MAAwB;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,uBAAuB,EAAE;YACrD,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import { Plugin, PluginKey } from 'prosemirror-state';
2
+ import { type DecorationAttrs } from 'prosemirror-view';
3
+ import type { CoreEditor } from '@kerebron/editor';
4
+ import type { ExtensionRemoteSelection } from './ExtensionRemoteSelection.js';
5
+ export declare const remoteSelectionPluginKey: PluginKey<any>;
6
+ /**
7
+ * Default generator for a cursor element
8
+ */
9
+ export declare const defaultCursorBuilder: (user: any) => HTMLElement;
10
+ /**
11
+ * Default generator for the selection attributes
12
+ */
13
+ export declare const defaultSelectionBuilder: (user: any) => DecorationAttrs;
14
+ export declare const createDecorations: (state: any, extension: ExtensionRemoteSelection, createCursor: (user: {
15
+ name: string;
16
+ color: string;
17
+ }, clientId: number) => Element, createSelection: (user: {
18
+ name: string;
19
+ color: string;
20
+ }, clientId: number) => DecorationAttrs) => any;
21
+ export declare const remoteSelectionPlugin: (extension: ExtensionRemoteSelection, editor: CoreEditor, { cursorBuilder, selectionBuilder, }?: {
22
+ cursorBuilder?: (user: any, clientId: number) => HTMLElement;
23
+ selectionBuilder?: (user: any, clientId: number) => DecorationAttrs;
24
+ }) => Plugin<any>;
25
+ //# sourceMappingURL=remoteSelectionPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remoteSelectionPlugin.d.ts","sourceRoot":"","sources":["../../src/remote-selection/remoteSelectionPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,eAAO,MAAM,wBAAwB,gBAAoC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,MAAM,GAAG,KAAG,WAahD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,MAAM,GAAG,KAAG,eAKnD,CAAC;AAIF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,GAAG,EACV,WAAW,wBAAwB,EACnC,cAAc,CACZ,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,EAAE,MAAM,KACb,OAAO,EACZ,iBAAiB,CACf,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,EAAE,MAAM,KACb,eAAe,KACnB,GAwDF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,WAAW,wBAAwB,EACnC,QAAQ,UAAU,EAClB,uCAGG;IACD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,WAAW,CAAC;IAC7D,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,eAAe,CAAC;CAChE,gBAsCP,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { Decoration, DecorationSet } from 'prosemirror-view';
2
+ import { Plugin, PluginKey } from 'prosemirror-state';
3
+ export const remoteSelectionPluginKey = new PluginKey('remote-selection');
4
+ /**
5
+ * Default generator for a cursor element
6
+ */
7
+ export const defaultCursorBuilder = (user) => {
8
+ const cursor = document.createElement('span');
9
+ cursor.classList.add('kb-yjs__cursor');
10
+ cursor.setAttribute('style', `border-color: ${user.color};`);
11
+ const userDiv = document.createElement('div');
12
+ userDiv.setAttribute('style', `background-color: ${user.color}`);
13
+ userDiv.insertBefore(document.createTextNode(user.name), null);
14
+ const nonbreakingSpace1 = document.createTextNode('\u2060');
15
+ const nonbreakingSpace2 = document.createTextNode('\u2060');
16
+ cursor.insertBefore(nonbreakingSpace1, null);
17
+ cursor.insertBefore(userDiv, null);
18
+ cursor.insertBefore(nonbreakingSpace2, null);
19
+ return cursor;
20
+ };
21
+ /**
22
+ * Default generator for the selection attributes
23
+ */
24
+ export const defaultSelectionBuilder = (user) => {
25
+ return {
26
+ style: `background-color: ${user.color}70`,
27
+ class: 'kb-yjs__selection',
28
+ };
29
+ };
30
+ const rxValidColor = /^#[0-9a-fA-F]{6}$/;
31
+ export const createDecorations = (state, extension, createCursor, createSelection) => {
32
+ const decorations = [];
33
+ const remoteStates = extension.getRemoteStates();
34
+ if (remoteStates.length === 0) {
35
+ return DecorationSet.create(state.doc, []);
36
+ }
37
+ for (const remoteState of remoteStates) {
38
+ if (remoteState.cursor != null) {
39
+ const user = remoteState.user || {};
40
+ if (user.color == null) {
41
+ user.color = '#ffa500';
42
+ }
43
+ else if (!rxValidColor.test(user.color)) {
44
+ // We only support 6-digit RGB colors in y-prosemirror
45
+ console.warn('A user uses an unsupported color format', user);
46
+ }
47
+ if (user.name == null) {
48
+ user.name = `User: ${remoteState.clientId}`;
49
+ }
50
+ const cursor = remoteState.cursor;
51
+ let anchor = cursor.anchor || null;
52
+ let head = cursor.head || null;
53
+ if (anchor !== null && head !== null) {
54
+ const maxsize = Math.max(state.doc.content.size - 1, 0);
55
+ anchor = Math.min(anchor, maxsize);
56
+ head = Math.min(head, maxsize);
57
+ decorations.push(Decoration.widget(head, () => createCursor(user, remoteState.clientId), {
58
+ key: remoteState.clientId + '',
59
+ side: 10,
60
+ }));
61
+ const from = Math.min(anchor, head);
62
+ const to = Math.max(anchor, head);
63
+ decorations.push(Decoration.inline(from, to, createSelection(user, remoteState.clientId), {
64
+ inclusiveEnd: true,
65
+ inclusiveStart: false,
66
+ }));
67
+ }
68
+ }
69
+ }
70
+ return DecorationSet.create(state.doc, decorations);
71
+ };
72
+ export const remoteSelectionPlugin = (extension, editor, { cursorBuilder = defaultCursorBuilder, selectionBuilder = defaultSelectionBuilder, } = {}) => {
73
+ return new Plugin({
74
+ key: remoteSelectionPluginKey,
75
+ state: {
76
+ init(_, state) {
77
+ return createDecorations(state, extension, cursorBuilder, selectionBuilder);
78
+ },
79
+ apply(tr, prevState, _oldState, newState) {
80
+ const remoteCursorState = tr.getMeta(remoteSelectionPluginKey);
81
+ // TODO validate: isChangeOrigin
82
+ // const state = remoteSelectionPluginKey.getState(newState);
83
+ if ((remoteCursorState?.isChangeOrigin) ||
84
+ (remoteCursorState?.remotePositionUpdated)) {
85
+ return createDecorations(newState, extension, cursorBuilder, selectionBuilder);
86
+ }
87
+ return prevState.map(tr.mapping, tr.doc);
88
+ },
89
+ },
90
+ props: {
91
+ decorations: (state) => {
92
+ return remoteSelectionPluginKey.getState(state);
93
+ },
94
+ },
95
+ });
96
+ };
97
+ //# sourceMappingURL=remoteSelectionPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remoteSelectionPlugin.js","sourceRoot":"","sources":["../../src/remote-selection/remoteSelectionPlugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerebron/extension-basic-editor",
3
- "version": "0.4.27",
3
+ "version": "0.4.29",
4
4
  "license": "MIT",
5
5
  "module": "./esm/ExtensionBasicEditor.js",
6
6
  "exports": {
@@ -111,9 +111,12 @@
111
111
  }
112
112
  },
113
113
  "scripts": {},
114
- "files": [],
114
+ "files": [
115
+ "esm",
116
+ "src"
117
+ ],
115
118
  "dependencies": {
116
- "@kerebron/editor": "0.4.27",
119
+ "@kerebron/editor": "0.4.29",
117
120
  "prosemirror-history": "1.4.1",
118
121
  "prosemirror-model": "1.25.3",
119
122
  "prosemirror-state": "1.4.3",
@@ -0,0 +1,64 @@
1
+ import { Extension } from '@kerebron/editor';
2
+ import { type CommandShortcuts } from '@kerebron/editor/commands';
3
+
4
+ /// A basic keymap containing bindings not specific to any schema.
5
+ /// Binds the following keys (when multiple commands are listed, they
6
+ /// are chained with [`chainCommands`](#commands.chainCommands)):
7
+ ///
8
+ /// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`
9
+ /// * **Mod-Enter** to `exitCode`
10
+ /// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`
11
+ /// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`
12
+ /// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`
13
+ /// * **Mod-a** to `selectAll`
14
+ const pcBaseKeymap: { [key: string]: string } = {
15
+ 'Mod-Enter': 'exitCode',
16
+ 'Backspace': 'backspace',
17
+ 'Mod-Backspace': 'backspace',
18
+ 'Shift-Backspace': 'backspace',
19
+ 'Delete': 'del',
20
+ 'Mod-Delete': 'del',
21
+ 'Mod-a': 'selectAll',
22
+ };
23
+
24
+ /// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,
25
+ /// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and
26
+ /// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like
27
+ /// Ctrl-Delete.
28
+ const macBaseKeymap: { [key: string]: string } = {
29
+ ...pcBaseKeymap,
30
+ 'Ctrl-h': pcBaseKeymap['Backspace'],
31
+ 'Alt-Backspace': pcBaseKeymap['Mod-Backspace'],
32
+ 'Ctrl-d': pcBaseKeymap['Delete'],
33
+ 'Ctrl-Alt-Backspace': pcBaseKeymap['Mod-Delete'],
34
+ 'Alt-Delete': pcBaseKeymap['Mod-Delete'],
35
+ 'Alt-d': pcBaseKeymap['Mod-Delete'],
36
+ 'Ctrl-a': 'selectTextblockStart',
37
+ 'Ctrl-e': 'selectTextblockEnd',
38
+ };
39
+
40
+ const mac = /(Mac|iPhone|iPod|iPad)/i.test(navigator?.platform);
41
+
42
+ const baseKeymap: { [key: string]: string } = mac
43
+ ? macBaseKeymap
44
+ : pcBaseKeymap;
45
+
46
+ export class ExtensionBaseKeymap extends Extension {
47
+ name = 'base-keymap';
48
+
49
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
50
+ const shortcuts: CommandShortcuts = {
51
+ 'Enter': 'enter',
52
+ 'Alt-ArrowUp': 'joinUp',
53
+ 'Alt-ArrowDown': 'joinDown',
54
+ 'Mod-BracketLeft': 'lift',
55
+ 'Escape': 'selectParentNode',
56
+ };
57
+
58
+ for (const key in baseKeymap) {
59
+ shortcuts[key] = baseKeymap[key];
60
+ }
61
+
62
+ return shortcuts;
63
+ }
64
+ }