@kerebron/extension-basic-editor 0.2.1 → 0.4.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 (197) hide show
  1. package/README.md +4 -2
  2. package/esm/editor/src/CoreEditor.d.ts +24 -9
  3. package/esm/editor/src/CoreEditor.d.ts.map +1 -1
  4. package/esm/editor/src/CoreEditor.js +125 -70
  5. package/esm/editor/src/DummyEditorView.d.ts +60 -0
  6. package/esm/editor/src/DummyEditorView.d.ts.map +1 -0
  7. package/esm/editor/src/DummyEditorView.js +277 -0
  8. package/esm/editor/src/Extension.d.ts +15 -10
  9. package/esm/editor/src/Extension.d.ts.map +1 -1
  10. package/esm/editor/src/Extension.js +23 -3
  11. package/esm/editor/src/ExtensionManager.d.ts +9 -9
  12. package/esm/editor/src/ExtensionManager.d.ts.map +1 -1
  13. package/esm/editor/src/ExtensionManager.js +81 -74
  14. package/esm/editor/src/Mark.d.ts +11 -6
  15. package/esm/editor/src/Mark.d.ts.map +1 -1
  16. package/esm/editor/src/Mark.js +19 -2
  17. package/esm/editor/src/Node.d.ts +18 -13
  18. package/esm/editor/src/Node.d.ts.map +1 -1
  19. package/esm/editor/src/Node.js +22 -5
  20. package/esm/editor/src/commands/CommandManager.d.ts +14 -11
  21. package/esm/editor/src/commands/CommandManager.d.ts.map +1 -1
  22. package/esm/editor/src/commands/CommandManager.js +64 -6
  23. package/esm/editor/src/commands/baseCommandFactories.d.ts +3 -0
  24. package/esm/editor/src/commands/baseCommandFactories.d.ts.map +1 -0
  25. package/esm/editor/src/commands/baseCommandFactories.js +836 -0
  26. package/esm/editor/src/commands/keyCommandFactories.d.ts +3 -0
  27. package/esm/editor/src/commands/keyCommandFactories.d.ts.map +1 -0
  28. package/esm/editor/src/commands/keyCommandFactories.js +10 -0
  29. package/esm/editor/src/commands/mod.d.ts +5 -47
  30. package/esm/editor/src/commands/mod.d.ts.map +1 -1
  31. package/esm/editor/src/commands/mod.js +14 -866
  32. package/esm/editor/src/commands/replaceCommandFactories.d.ts +3 -0
  33. package/esm/editor/src/commands/replaceCommandFactories.d.ts.map +1 -0
  34. package/esm/editor/src/commands/replaceCommandFactories.js +94 -0
  35. package/esm/editor/src/commands/types.d.ts +18 -0
  36. package/esm/editor/src/commands/types.d.ts.map +1 -0
  37. package/esm/editor/src/commands/types.js +1 -0
  38. package/esm/editor/src/mod.d.ts +3 -0
  39. package/esm/editor/src/mod.d.ts.map +1 -1
  40. package/esm/editor/src/mod.js +3 -0
  41. package/esm/editor/src/nodeToTreeString.d.ts +8 -2
  42. package/esm/editor/src/nodeToTreeString.d.ts.map +1 -1
  43. package/esm/editor/src/nodeToTreeString.js +47 -29
  44. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts +6 -0
  45. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts.map +1 -0
  46. package/esm/editor/src/plugins/TrackSelecionPlugin.js +24 -0
  47. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.js +2 -2
  48. package/esm/editor/src/plugins/keymap/keymap.d.ts +11 -0
  49. package/esm/editor/src/plugins/keymap/keymap.d.ts.map +1 -0
  50. package/esm/editor/src/plugins/keymap/keymap.js +125 -0
  51. package/esm/editor/src/plugins/keymap/mod.d.ts +2 -0
  52. package/esm/editor/src/plugins/keymap/mod.d.ts.map +1 -0
  53. package/esm/editor/src/plugins/keymap/mod.js +1 -0
  54. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts +4 -0
  55. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts.map +1 -0
  56. package/esm/editor/src/plugins/keymap/w3c-keyname.js +124 -0
  57. package/esm/editor/src/types.d.ts +30 -7
  58. package/esm/editor/src/types.d.ts.map +1 -1
  59. package/esm/editor/src/ui.d.ts +15 -0
  60. package/esm/editor/src/ui.d.ts.map +1 -0
  61. package/esm/editor/src/ui.js +16 -0
  62. package/esm/editor/src/utilities/SmartOutput.d.ts +41 -0
  63. package/esm/editor/src/utilities/SmartOutput.d.ts.map +1 -0
  64. package/esm/editor/src/utilities/SmartOutput.js +228 -0
  65. package/esm/editor/src/utilities/createNodeFromContent.d.ts +4 -3
  66. package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -1
  67. package/esm/editor/src/utilities/createNodeFromContent.js +4 -5
  68. package/esm/editor/src/utilities/getHtmlAttributes.d.ts +8 -3
  69. package/esm/editor/src/utilities/getHtmlAttributes.d.ts.map +1 -1
  70. package/esm/editor/src/utilities/getShadowRoot.d.ts +2 -0
  71. package/esm/editor/src/utilities/getShadowRoot.d.ts.map +1 -0
  72. package/esm/editor/src/utilities/getShadowRoot.js +16 -0
  73. package/esm/editor/src/utilities/mod.d.ts +3 -0
  74. package/esm/editor/src/utilities/mod.d.ts.map +1 -1
  75. package/esm/editor/src/utilities/mod.js +3 -0
  76. package/esm/editor/src/utilities/toRawTextResult.d.ts +3 -0
  77. package/esm/editor/src/utilities/toRawTextResult.d.ts.map +1 -0
  78. package/esm/editor/src/utilities/toRawTextResult.js +21 -0
  79. package/esm/extension-basic-editor/src/ExtensionBaseKeymap.d.ts +1 -2
  80. package/esm/extension-basic-editor/src/ExtensionBaseKeymap.d.ts.map +1 -1
  81. package/esm/extension-basic-editor/src/ExtensionBaseKeymap.js +40 -14
  82. package/esm/extension-basic-editor/src/ExtensionBasicCodeEditor.d.ts +11 -0
  83. package/esm/extension-basic-editor/src/ExtensionBasicCodeEditor.d.ts.map +1 -0
  84. package/esm/extension-basic-editor/src/ExtensionBasicCodeEditor.js +71 -0
  85. package/esm/extension-basic-editor/src/ExtensionBasicEditor.d.ts +23 -9
  86. package/esm/extension-basic-editor/src/ExtensionBasicEditor.d.ts.map +1 -1
  87. package/esm/extension-basic-editor/src/ExtensionBasicEditor.js +38 -8
  88. package/esm/extension-basic-editor/src/ExtensionDropcursor.d.ts +7 -0
  89. package/esm/extension-basic-editor/src/ExtensionDropcursor.d.ts.map +1 -1
  90. package/esm/extension-basic-editor/src/ExtensionDropcursor.js +211 -1
  91. package/esm/extension-basic-editor/src/ExtensionGapcursor.d.ts +21 -1
  92. package/esm/extension-basic-editor/src/ExtensionGapcursor.d.ts.map +1 -1
  93. package/esm/extension-basic-editor/src/ExtensionGapcursor.js +239 -1
  94. package/esm/extension-basic-editor/src/ExtensionHistory.d.ts +4 -3
  95. package/esm/extension-basic-editor/src/ExtensionHistory.d.ts.map +1 -1
  96. package/esm/extension-basic-editor/src/ExtensionHistory.js +29 -3
  97. package/esm/extension-basic-editor/src/ExtensionHtml.d.ts.map +1 -1
  98. package/esm/extension-basic-editor/src/ExtensionHtml.js +7 -4
  99. package/esm/extension-basic-editor/src/ExtensionMediaUpload.d.ts +24 -0
  100. package/esm/extension-basic-editor/src/ExtensionMediaUpload.d.ts.map +1 -0
  101. package/esm/extension-basic-editor/src/ExtensionMediaUpload.js +176 -0
  102. package/esm/extension-basic-editor/src/ExtensionSelection.d.ts +11 -0
  103. package/esm/extension-basic-editor/src/ExtensionSelection.d.ts.map +1 -0
  104. package/esm/extension-basic-editor/src/ExtensionSelection.js +237 -0
  105. package/esm/extension-basic-editor/src/MarkBookmark.d.ts.map +1 -1
  106. package/esm/extension-basic-editor/src/MarkChange.d.ts.map +1 -1
  107. package/esm/extension-basic-editor/src/MarkCode.d.ts +4 -7
  108. package/esm/extension-basic-editor/src/MarkCode.d.ts.map +1 -1
  109. package/esm/extension-basic-editor/src/MarkCode.js +2 -11
  110. package/esm/extension-basic-editor/src/MarkHighlight.d.ts +8 -0
  111. package/esm/extension-basic-editor/src/MarkHighlight.d.ts.map +1 -0
  112. package/esm/extension-basic-editor/src/MarkHighlight.js +43 -0
  113. package/esm/extension-basic-editor/src/MarkItalic.d.ts +4 -6
  114. package/esm/extension-basic-editor/src/MarkItalic.d.ts.map +1 -1
  115. package/esm/extension-basic-editor/src/MarkItalic.js +2 -11
  116. package/esm/extension-basic-editor/src/MarkLink.d.ts +1 -11
  117. package/esm/extension-basic-editor/src/MarkLink.d.ts.map +1 -1
  118. package/esm/extension-basic-editor/src/MarkLink.js +0 -32
  119. package/esm/extension-basic-editor/src/MarkStrike.d.ts +11 -0
  120. package/esm/extension-basic-editor/src/MarkStrike.d.ts.map +1 -0
  121. package/esm/extension-basic-editor/src/MarkStrike.js +39 -0
  122. package/esm/extension-basic-editor/src/MarkStrong.d.ts +4 -7
  123. package/esm/extension-basic-editor/src/MarkStrong.d.ts.map +1 -1
  124. package/esm/extension-basic-editor/src/MarkStrong.js +2 -11
  125. package/esm/extension-basic-editor/src/MarkTextColor.d.ts +8 -0
  126. package/esm/extension-basic-editor/src/MarkTextColor.d.ts.map +1 -0
  127. package/esm/extension-basic-editor/src/MarkTextColor.js +35 -0
  128. package/esm/extension-basic-editor/src/MarkUnderline.d.ts +3 -5
  129. package/esm/extension-basic-editor/src/MarkUnderline.d.ts.map +1 -1
  130. package/esm/extension-basic-editor/src/MarkUnderline.js +2 -11
  131. package/esm/extension-basic-editor/src/NodeAside.d.ts +0 -3
  132. package/esm/extension-basic-editor/src/NodeAside.d.ts.map +1 -1
  133. package/esm/extension-basic-editor/src/NodeAside.js +0 -8
  134. package/esm/extension-basic-editor/src/NodeBlockquote.d.ts +3 -6
  135. package/esm/extension-basic-editor/src/NodeBlockquote.d.ts.map +1 -1
  136. package/esm/extension-basic-editor/src/NodeBlockquote.js +2 -11
  137. package/esm/extension-basic-editor/src/NodeBulletList.d.ts +4 -7
  138. package/esm/extension-basic-editor/src/NodeBulletList.d.ts.map +1 -1
  139. package/esm/extension-basic-editor/src/NodeBulletList.js +2 -11
  140. package/esm/extension-basic-editor/src/NodeCodeBlock.d.ts +9 -0
  141. package/esm/extension-basic-editor/src/NodeCodeBlock.d.ts.map +1 -0
  142. package/esm/extension-basic-editor/src/NodeCodeBlock.js +58 -0
  143. package/esm/extension-basic-editor/src/NodeDefinitionDesc.d.ts +8 -0
  144. package/esm/extension-basic-editor/src/NodeDefinitionDesc.d.ts.map +1 -0
  145. package/esm/extension-basic-editor/src/NodeDefinitionDesc.js +29 -0
  146. package/esm/extension-basic-editor/src/NodeDefinitionList.d.ts +13 -0
  147. package/esm/extension-basic-editor/src/NodeDefinitionList.d.ts.map +1 -0
  148. package/esm/extension-basic-editor/src/NodeDefinitionList.js +41 -0
  149. package/esm/extension-basic-editor/src/NodeDefinitionTerm.d.ts +8 -0
  150. package/esm/extension-basic-editor/src/NodeDefinitionTerm.d.ts.map +1 -0
  151. package/esm/extension-basic-editor/src/NodeDefinitionTerm.js +29 -0
  152. package/esm/extension-basic-editor/src/NodeDocumentCode.d.ts +7 -0
  153. package/esm/extension-basic-editor/src/NodeDocumentCode.d.ts.map +1 -0
  154. package/esm/extension-basic-editor/src/NodeDocumentCode.js +37 -0
  155. package/esm/extension-basic-editor/src/NodeFrontmatter.d.ts +8 -0
  156. package/esm/extension-basic-editor/src/NodeFrontmatter.d.ts.map +1 -0
  157. package/esm/extension-basic-editor/src/NodeFrontmatter.js +29 -0
  158. package/esm/extension-basic-editor/src/NodeHardBreak.d.ts +5 -2
  159. package/esm/extension-basic-editor/src/NodeHardBreak.d.ts.map +1 -1
  160. package/esm/extension-basic-editor/src/NodeHardBreak.js +40 -53
  161. package/esm/extension-basic-editor/src/NodeHeading.d.ts +3 -14
  162. package/esm/extension-basic-editor/src/NodeHeading.d.ts.map +1 -1
  163. package/esm/extension-basic-editor/src/NodeHeading.js +2 -15
  164. package/esm/extension-basic-editor/src/NodeHorizontalRule.d.ts +4 -4
  165. package/esm/extension-basic-editor/src/NodeHorizontalRule.d.ts.map +1 -1
  166. package/esm/extension-basic-editor/src/NodeHorizontalRule.js +1 -2
  167. package/esm/extension-basic-editor/src/NodeListItem.d.ts +7 -5
  168. package/esm/extension-basic-editor/src/NodeListItem.d.ts.map +1 -1
  169. package/esm/extension-basic-editor/src/NodeListItem.js +10 -15
  170. package/esm/extension-basic-editor/src/NodeMath.d.ts +8 -0
  171. package/esm/extension-basic-editor/src/NodeMath.d.ts.map +1 -0
  172. package/esm/extension-basic-editor/src/NodeMath.js +112 -0
  173. package/esm/extension-basic-editor/src/NodeOrderedList.d.ts +3 -6
  174. package/esm/extension-basic-editor/src/NodeOrderedList.d.ts.map +1 -1
  175. package/esm/extension-basic-editor/src/NodeOrderedList.js +4 -14
  176. package/esm/extension-basic-editor/src/NodeParagraph.d.ts +2 -5
  177. package/esm/extension-basic-editor/src/NodeParagraph.d.ts.map +1 -1
  178. package/esm/extension-basic-editor/src/NodeParagraph.js +2 -11
  179. package/esm/extension-basic-editor/src/NodeTaskItem.d.ts +24 -0
  180. package/esm/extension-basic-editor/src/NodeTaskItem.d.ts.map +1 -0
  181. package/esm/extension-basic-editor/src/NodeTaskItem.js +153 -0
  182. package/esm/extension-basic-editor/src/NodeTaskList.d.ts +11 -0
  183. package/esm/extension-basic-editor/src/NodeTaskList.d.ts.map +1 -0
  184. package/esm/extension-basic-editor/src/NodeTaskList.js +38 -0
  185. package/esm/extension-basic-editor/src/NodeText.d.ts +0 -1
  186. package/esm/extension-basic-editor/src/NodeText.d.ts.map +1 -1
  187. package/esm/extension-basic-editor/src/NodeText.js +0 -6
  188. package/esm/extension-basic-editor/src/NodeVideo.d.ts +8 -0
  189. package/esm/extension-basic-editor/src/NodeVideo.d.ts.map +1 -0
  190. package/esm/extension-basic-editor/src/NodeVideo.js +58 -0
  191. package/esm/extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.d.ts +24 -0
  192. package/esm/extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.d.ts.map +1 -0
  193. package/esm/extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.js +35 -0
  194. package/esm/extension-basic-editor/src/remote-selection/remoteSelectionPlugin.d.ts +25 -0
  195. package/esm/extension-basic-editor/src/remote-selection/remoteSelectionPlugin.d.ts.map +1 -0
  196. package/esm/extension-basic-editor/src/remote-selection/remoteSelectionPlugin.js +96 -0
  197. package/package.json +29 -6
@@ -0,0 +1,153 @@
1
+ import { Node } from '../../editor/src/mod.js';
2
+ import { wrappingInputRule } from '../../editor/src/plugins/input-rules/mod.js';
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
+ constructor(config = {}) {
10
+ super(config);
11
+ Object.defineProperty(this, "config", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: config
16
+ });
17
+ Object.defineProperty(this, "name", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: 'task_item'
22
+ });
23
+ Object.defineProperty(this, "requires", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: ['doc']
28
+ });
29
+ }
30
+ getNodeSpec() {
31
+ return {
32
+ attrs: {
33
+ checked: {
34
+ default: false,
35
+ },
36
+ },
37
+ content: this.config.nested ? 'paragraph block*' : 'paragraph+',
38
+ parseDOM: [{
39
+ tag: 'li[data-checked]',
40
+ getAttrs(node) {
41
+ return {
42
+ checked: node.getAttribute('data-checked') === 'true',
43
+ };
44
+ },
45
+ }],
46
+ defining: true,
47
+ toDOM(node) {
48
+ return [
49
+ 'li',
50
+ {
51
+ 'data-type': this.name,
52
+ 'data-checked': node.attrs.checked,
53
+ },
54
+ [
55
+ 'label',
56
+ [
57
+ 'input',
58
+ {
59
+ type: 'checkbox',
60
+ checked: node.attrs.checked ? 'checked' : null,
61
+ },
62
+ ],
63
+ ['span'],
64
+ ],
65
+ ['div', 0],
66
+ ];
67
+ },
68
+ };
69
+ }
70
+ getCommandFactories(editor, type) {
71
+ return {
72
+ 'splitListItem': () => splitListItem(type),
73
+ 'liftListItem': () => liftListItem(type),
74
+ 'sinkListItem': () => sinkListItem(type),
75
+ };
76
+ }
77
+ getNodeView(editor) {
78
+ return (node, view, getPos) => {
79
+ const listItem = document.createElement('li');
80
+ const checkboxWrapper = document.createElement('label');
81
+ const checkboxStyler = document.createElement('span');
82
+ const checkbox = document.createElement('input');
83
+ const content = document.createElement('div');
84
+ checkboxWrapper.contentEditable = 'false';
85
+ checkbox.type = 'checkbox';
86
+ checkbox.addEventListener('mousedown', (event) => event.preventDefault());
87
+ checkbox.addEventListener('change', (event) => {
88
+ const isEditable = true; // TODO editor.isEditable
89
+ // if the editor isn’t editable and we don't have a handler for
90
+ // readonly checks we have to undo the latest change
91
+ if (!isEditable && !this.config.onReadOnlyChecked) {
92
+ checkbox.checked = !checkbox.checked;
93
+ return;
94
+ }
95
+ const { checked } = event.target;
96
+ if (isEditable && typeof getPos === 'function') {
97
+ editor
98
+ .chain()
99
+ .focus(undefined, { scrollIntoView: false })
100
+ .command(({ tr }) => {
101
+ const position = getPos();
102
+ if (typeof position !== 'number') {
103
+ return false;
104
+ }
105
+ const currentNode = tr.doc.nodeAt(position);
106
+ tr.setNodeMarkup(position, undefined, {
107
+ ...currentNode?.attrs,
108
+ checked,
109
+ });
110
+ return true;
111
+ })
112
+ .run();
113
+ }
114
+ if (!isEditable && this.config.onReadOnlyChecked) {
115
+ // Reset state if onReadOnlyChecked returns false
116
+ if (!this.config.onReadOnlyChecked(node, checked)) {
117
+ checkbox.checked = !checkbox.checked;
118
+ }
119
+ }
120
+ });
121
+ listItem.dataset.checked = node.attrs.checked;
122
+ checkbox.checked = node.attrs.checked;
123
+ checkboxWrapper.append(checkbox, checkboxStyler);
124
+ listItem.append(checkboxWrapper, content);
125
+ return {
126
+ dom: listItem,
127
+ contentDOM: content,
128
+ update: (updatedNode) => {
129
+ if (updatedNode.type.name !== this.type) {
130
+ return false;
131
+ }
132
+ listItem.dataset.checked = updatedNode.attrs.checked;
133
+ checkbox.checked = updatedNode.attrs.checked;
134
+ return true;
135
+ },
136
+ };
137
+ };
138
+ }
139
+ getKeyboardShortcuts() {
140
+ return {
141
+ 'Enter': 'splitListItem',
142
+ 'Tab': 'sinkListItem',
143
+ 'Shift-Tab': 'liftListItem',
144
+ };
145
+ }
146
+ getInputRules(type) {
147
+ return [
148
+ wrappingInputRule(inputRegex, type, (match) => ({
149
+ checked: match[match.length - 1] === 'x',
150
+ })),
151
+ ];
152
+ }
153
+ }
@@ -0,0 +1,11 @@
1
+ import type { NodeSpec, NodeType } from 'prosemirror-model';
2
+ import { type CoreEditor, Node } from '../../editor/src/mod.js';
3
+ import { type CommandFactories, type CommandShortcuts } from '../../editor/src/commands/mod.js';
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/extension-basic-editor/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,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,kCAAkC,CAAC;AAE1C,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,38 @@
1
+ import { Node } from '../../editor/src/mod.js';
2
+ export class NodeTaskList extends Node {
3
+ constructor() {
4
+ super(...arguments);
5
+ Object.defineProperty(this, "name", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: 'task_list'
10
+ });
11
+ Object.defineProperty(this, "requires", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: ['doc']
16
+ });
17
+ }
18
+ getNodeSpec() {
19
+ return {
20
+ content: 'list_item+',
21
+ group: 'block',
22
+ parseDOM: [{ tag: `ul[data-type="${this.name}"]` }],
23
+ toDOM() {
24
+ return ['ul', { 'data-type': this.name }, 0];
25
+ },
26
+ };
27
+ }
28
+ getCommandFactories(editor, type) {
29
+ return {
30
+ 'toggleTaskList': () => editor.commandFactories.wrapInList(type),
31
+ };
32
+ }
33
+ getKeyboardShortcuts() {
34
+ return {
35
+ 'Shift-Ctrl-9': 'toggleTaskList',
36
+ };
37
+ }
38
+ }
@@ -2,7 +2,6 @@ import { NodeSpec } from 'prosemirror-model';
2
2
  import { Node } from '../../editor/src/mod.js';
3
3
  export declare class NodeText extends Node {
4
4
  name: string;
5
- requires: string[];
6
5
  getNodeSpec(): NodeSpec;
7
6
  }
8
7
  //# sourceMappingURL=NodeText.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeText.d.ts","sourceRoot":"","sources":["../../../src/extension-basic-editor/src/NodeText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,qBAAa,QAAS,SAAQ,IAAI;IACvB,IAAI,SAAU;IACvB,QAAQ,WAAW;IAEV,WAAW,IAAI,QAAQ;CAKjC"}
1
+ {"version":3,"file":"NodeText.d.ts","sourceRoot":"","sources":["../../../src/extension-basic-editor/src/NodeText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,qBAAa,QAAS,SAAQ,IAAI;IACvB,IAAI,SAAU;IAEd,WAAW,IAAI,QAAQ;CAKjC"}
@@ -8,12 +8,6 @@ export class NodeText extends Node {
8
8
  writable: true,
9
9
  value: 'text'
10
10
  });
11
- Object.defineProperty(this, "requires", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: ['doc']
16
- });
17
11
  }
18
12
  getNodeSpec() {
19
13
  return {
@@ -0,0 +1,8 @@
1
+ import { type NodeSpec } from 'prosemirror-model';
2
+ import { Node } from '../../editor/src/mod.js';
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/extension-basic-editor/src/NodeVideo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,qBAAa,SAAU,SAAQ,IAAI;IACxB,IAAI,SAAW;IACxB,QAAQ,WAAW;IAEV,WAAW,IAAI,QAAQ;CAoCjC"}
@@ -0,0 +1,58 @@
1
+ import { Node } from '../../editor/src/mod.js';
2
+ export class NodeVideo extends Node {
3
+ constructor() {
4
+ super(...arguments);
5
+ Object.defineProperty(this, "name", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: 'video'
10
+ });
11
+ Object.defineProperty(this, "requires", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: ['doc']
16
+ });
17
+ }
18
+ getNodeSpec() {
19
+ return {
20
+ attrs: {
21
+ src: {},
22
+ title: { default: null },
23
+ controls: { default: true },
24
+ width: { default: null },
25
+ height: { default: null },
26
+ },
27
+ group: 'block',
28
+ draggable: true,
29
+ parseDOM: [
30
+ {
31
+ tag: 'video[src]',
32
+ getAttrs(dom) {
33
+ return {
34
+ src: dom.getAttribute('src'),
35
+ title: dom.getAttribute('title'),
36
+ controls: dom.hasAttribute('controls'),
37
+ width: dom.getAttribute('width'),
38
+ height: dom.getAttribute('height'),
39
+ };
40
+ },
41
+ },
42
+ ],
43
+ toDOM(node) {
44
+ const { src, title, controls, width, height } = node.attrs;
45
+ const attrs = { src };
46
+ if (title)
47
+ attrs.title = title;
48
+ if (controls)
49
+ attrs.controls = ''; // Boolean attribute - just needs to be present
50
+ if (width)
51
+ attrs.width = width;
52
+ if (height)
53
+ attrs.height = height;
54
+ return ['video', attrs];
55
+ },
56
+ };
57
+ }
58
+ }
@@ -0,0 +1,24 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { Extension } from '../../../editor/src/mod.js';
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/extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAmB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAIxE,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,35 @@
1
+ import { Extension } from '../../../editor/src/mod.js';
2
+ import { remoteSelectionPlugin } from './remoteSelectionPlugin.js';
3
+ export { remoteSelectionPluginKey } from './remoteSelectionPlugin.js';
4
+ export class ExtensionRemoteSelection extends Extension {
5
+ constructor() {
6
+ super(...arguments);
7
+ Object.defineProperty(this, "name", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: 'remote-selection'
12
+ });
13
+ Object.defineProperty(this, "remoteStates", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: []
18
+ });
19
+ }
20
+ getProseMirrorPlugins() {
21
+ return [
22
+ remoteSelectionPlugin(this, this.editor),
23
+ ];
24
+ }
25
+ getRemoteStates() {
26
+ return this.remoteStates;
27
+ }
28
+ setRemoteStates(states) {
29
+ this.remoteStates = states;
30
+ const event = new CustomEvent('remoteSelectionChange', {
31
+ detail: {},
32
+ });
33
+ this.editor.dispatchEvent(event);
34
+ }
35
+ }
@@ -0,0 +1,25 @@
1
+ import { Plugin, PluginKey } from 'prosemirror-state';
2
+ import { type DecorationAttrs } from 'prosemirror-view';
3
+ import type { CoreEditor } from '../../../editor/src/mod.js';
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/extension-basic-editor/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,4BAA4B,CAAC;AAE7D,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,96 @@
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
+ };
package/package.json CHANGED
@@ -1,12 +1,21 @@
1
1
  {
2
2
  "name": "@kerebron/extension-basic-editor",
3
- "version": "0.2.1",
3
+ "version": "0.4.1",
4
4
  "license": "MIT",
5
5
  "module": "./esm/extension-basic-editor/src/ExtensionBasicEditor.js",
6
6
  "exports": {
7
7
  ".": {
8
8
  "import": "./esm/extension-basic-editor/src/ExtensionBasicEditor.js"
9
9
  },
10
+ "./ExtensionBasicEditor": {
11
+ "import": "./esm/extension-basic-editor/src/ExtensionBasicEditor.js"
12
+ },
13
+ "./ExtensionBasicCodeEditor": {
14
+ "import": "./esm/extension-basic-editor/src/ExtensionBasicCodeEditor.js"
15
+ },
16
+ "./ExtensionSelection": {
17
+ "import": "./esm/extension-basic-editor/src/ExtensionSelection.js"
18
+ },
10
19
  "./ExtensionBaseKeymap": {
11
20
  "import": "./esm/extension-basic-editor/src/ExtensionBaseKeymap.js"
12
21
  },
@@ -19,9 +28,24 @@
19
28
  "./ExtensionGapcursor": {
20
29
  "import": "./esm/extension-basic-editor/src/ExtensionGapcursor.js"
21
30
  },
31
+ "./ExtensionMediaUpload": {
32
+ "import": "./esm/extension-basic-editor/src/ExtensionMediaUpload.js"
33
+ },
34
+ "./ExtensionRemoteSelection": {
35
+ "import": "./esm/extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.js"
36
+ },
37
+ "./ExtensionHtml": {
38
+ "import": "./esm/extension-basic-editor/src/ExtensionHtml.js"
39
+ },
22
40
  "./NodeDocument": {
23
41
  "import": "./esm/extension-basic-editor/src/NodeDocument.js"
24
42
  },
43
+ "./NodeDocumentCode": {
44
+ "import": "./esm/extension-basic-editor/src/NodeDocumentCode.js"
45
+ },
46
+ "./NodeCodeBlock": {
47
+ "import": "./esm/extension-basic-editor/src/NodeCodeBlock.js"
48
+ },
25
49
  "./NodeText": {
26
50
  "import": "./esm/extension-basic-editor/src/NodeText.js"
27
51
  },
@@ -46,6 +70,9 @@
46
70
  "./NodeImage": {
47
71
  "import": "./esm/extension-basic-editor/src/NodeImage.js"
48
72
  },
73
+ "./NodeVideo": {
74
+ "import": "./esm/extension-basic-editor/src/NodeVideo.js"
75
+ },
49
76
  "./NodeBlockquote": {
50
77
  "import": "./esm/extension-basic-editor/src/NodeBlockquote.js"
51
78
  },
@@ -73,12 +100,8 @@
73
100
  },
74
101
  "scripts": {},
75
102
  "dependencies": {
76
- "prosemirror-dropcursor": "1.8.1",
77
- "prosemirror-gapcursor": "1.3.2",
78
103
  "prosemirror-history": "1.4.1",
79
- "prosemirror-inputrules": "1.5.0",
80
- "prosemirror-keymap": "1.2.2",
81
- "prosemirror-model": "1.25.1",
104
+ "prosemirror-model": "1.25.3",
82
105
  "prosemirror-state": "1.4.3",
83
106
  "prosemirror-transform": "1.10.4",
84
107
  "prosemirror-view": "1.40.0"