@krainovsd/markdown-editor 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +21 -1
  2. package/lib/cjs/index-Byjf17iv.js +501 -0
  3. package/lib/cjs/index-Byjf17iv.js.map +1 -0
  4. package/lib/cjs/index-lPo-3QDL.js +1374 -0
  5. package/lib/cjs/index-lPo-3QDL.js.map +1 -0
  6. package/lib/cjs/index.js +15 -0
  7. package/lib/cjs/index.js.map +1 -0
  8. package/lib/esm/extensions/compartments/index.js +8 -0
  9. package/lib/esm/extensions/compartments/index.js.map +1 -0
  10. package/lib/esm/extensions/init-extensions.js +45 -0
  11. package/lib/esm/extensions/init-extensions.js.map +1 -0
  12. package/lib/esm/extensions/keymaps/init-key-map.js +91 -0
  13. package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -0
  14. package/lib/esm/extensions/listeners/get-change-event.js +14 -0
  15. package/lib/esm/extensions/listeners/get-change-event.js.map +1 -0
  16. package/lib/esm/extensions/listeners/get-focus-event.js +16 -0
  17. package/lib/esm/extensions/listeners/get-focus-event.js.map +1 -0
  18. package/lib/esm/extensions/listeners/init-listeners.js +9 -0
  19. package/lib/esm/extensions/listeners/init-listeners.js.map +1 -0
  20. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js +6 -0
  21. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js.map +1 -0
  22. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js +99 -0
  23. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js.map +1 -0
  24. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js +25 -0
  25. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js.map +1 -0
  26. package/lib/esm/extensions/markdown/bold/bold-constants.js +5 -0
  27. package/lib/esm/extensions/markdown/bold/bold-constants.js.map +1 -0
  28. package/lib/esm/extensions/markdown/bold/bold-decoration.js +41 -0
  29. package/lib/esm/extensions/markdown/bold/bold-decoration.js.map +1 -0
  30. package/lib/esm/extensions/markdown/code/code-constants.js +6 -0
  31. package/lib/esm/extensions/markdown/code/code-constants.js.map +1 -0
  32. package/lib/esm/extensions/markdown/code/code-decoration.js +109 -0
  33. package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -0
  34. package/lib/esm/extensions/markdown/code/code-widget.js +83 -0
  35. package/lib/esm/extensions/markdown/code/code-widget.js.map +1 -0
  36. package/lib/esm/extensions/markdown/header/header-constants.js +6 -0
  37. package/lib/esm/extensions/markdown/header/header-constants.js.map +1 -0
  38. package/lib/esm/extensions/markdown/header/header-decoration.js +64 -0
  39. package/lib/esm/extensions/markdown/header/header-decoration.js.map +1 -0
  40. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js +4 -0
  41. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js.map +1 -0
  42. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js +31 -0
  43. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js.map +1 -0
  44. package/lib/esm/extensions/markdown/image/image-constants.js +8 -0
  45. package/lib/esm/extensions/markdown/image/image-constants.js.map +1 -0
  46. package/lib/esm/extensions/markdown/image/image-decoration.js +75 -0
  47. package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -0
  48. package/lib/esm/extensions/markdown/image/image-widget.js +184 -0
  49. package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -0
  50. package/lib/esm/extensions/markdown/index.js +2 -0
  51. package/lib/esm/extensions/markdown/index.js.map +1 -0
  52. package/lib/esm/extensions/markdown/init-markdown.js +18 -0
  53. package/lib/esm/extensions/markdown/init-markdown.js.map +1 -0
  54. package/lib/esm/extensions/markdown/italic/italic-constants.js +5 -0
  55. package/lib/esm/extensions/markdown/italic/italic-constants.js.map +1 -0
  56. package/lib/esm/extensions/markdown/italic/italic-decoration.js +77 -0
  57. package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -0
  58. package/lib/esm/extensions/markdown/link/auto-link-decoration.js +24 -0
  59. package/lib/esm/extensions/markdown/link/auto-link-decoration.js.map +1 -0
  60. package/lib/esm/extensions/markdown/link/link-constants.js +10 -0
  61. package/lib/esm/extensions/markdown/link/link-constants.js.map +1 -0
  62. package/lib/esm/extensions/markdown/link/link-decoration.js +51 -0
  63. package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -0
  64. package/lib/esm/extensions/markdown/link/link-label-decoration.js +22 -0
  65. package/lib/esm/extensions/markdown/link/link-label-decoration.js.map +1 -0
  66. package/lib/esm/extensions/markdown/link/link-widget.js +144 -0
  67. package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -0
  68. package/lib/esm/extensions/markdown/list/list-constants.js +7 -0
  69. package/lib/esm/extensions/markdown/list/list-constants.js.map +1 -0
  70. package/lib/esm/extensions/markdown/list/list-decoration.js +38 -0
  71. package/lib/esm/extensions/markdown/list/list-decoration.js.map +1 -0
  72. package/lib/esm/extensions/markdown/list/list-widget.js +33 -0
  73. package/lib/esm/extensions/markdown/list/list-widget.js.map +1 -0
  74. package/lib/esm/extensions/markdown/markdown-decoration.js +105 -0
  75. package/lib/esm/extensions/markdown/markdown-decoration.js.map +1 -0
  76. package/lib/esm/extensions/markdown/markdown-parser.js +6 -0
  77. package/lib/esm/extensions/markdown/markdown-parser.js.map +1 -0
  78. package/lib/esm/extensions/markdown/mention/mention-constants.js +6 -0
  79. package/lib/esm/extensions/markdown/mention/mention-constants.js.map +1 -0
  80. package/lib/esm/extensions/markdown/mention/mention-decoration.js +37 -0
  81. package/lib/esm/extensions/markdown/mention/mention-decoration.js.map +1 -0
  82. package/lib/esm/extensions/markdown/mention/mention-parser.js +25 -0
  83. package/lib/esm/extensions/markdown/mention/mention-parser.js.map +1 -0
  84. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js +4 -0
  85. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js.map +1 -0
  86. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js +32 -0
  87. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js.map +1 -0
  88. package/lib/esm/extensions/markdown/styles.module.scss.js +8 -0
  89. package/lib/esm/extensions/markdown/styles.module.scss.js.map +1 -0
  90. package/lib/esm/extensions/markdown/todo/todo-constants.js +6 -0
  91. package/lib/esm/extensions/markdown/todo/todo-constants.js.map +1 -0
  92. package/lib/esm/extensions/markdown/todo/todo-decoration.js +35 -0
  93. package/lib/esm/extensions/markdown/todo/todo-decoration.js.map +1 -0
  94. package/lib/esm/extensions/markdown/todo/todo-widget.js +51 -0
  95. package/lib/esm/extensions/markdown/todo/todo-widget.js.map +1 -0
  96. package/lib/esm/extensions/settings/init-settings.js +19 -0
  97. package/lib/esm/extensions/settings/init-settings.js.map +1 -0
  98. package/lib/esm/extensions/theme/init-theme.js +15 -0
  99. package/lib/esm/extensions/theme/init-theme.js.map +1 -0
  100. package/lib/esm/extensions/theme/theme-constants.js +17 -0
  101. package/lib/esm/extensions/theme/theme-constants.js.map +1 -0
  102. package/lib/esm/extensions/theme/themes/get-dark-theme.js +40 -0
  103. package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -0
  104. package/lib/esm/extensions/theme/themes/get-highlight-template.js +35 -0
  105. package/lib/esm/extensions/theme/themes/get-highlight-template.js.map +1 -0
  106. package/lib/esm/extensions/theme/themes/get-light-theme.js +40 -0
  107. package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -0
  108. package/lib/esm/extensions/theme/themes/get-theme-template.js +69 -0
  109. package/lib/esm/extensions/theme/themes/get-theme-template.js.map +1 -0
  110. package/lib/esm/index.js +1 -1
  111. package/lib/esm/index.js.map +1 -1
  112. package/lib/esm/lib/utils/copy-to-clipboard.js +35 -0
  113. package/lib/esm/lib/utils/copy-to-clipboard.js.map +1 -0
  114. package/lib/esm/lib/utils/get-decoration.js +24 -0
  115. package/lib/esm/lib/utils/get-decoration.js.map +1 -0
  116. package/lib/esm/lib/utils/is-in-range.js +8 -0
  117. package/lib/esm/lib/utils/is-in-range.js.map +1 -0
  118. package/lib/esm/lib/utils/is-range-overlap.js +6 -0
  119. package/lib/esm/lib/utils/is-range-overlap.js.map +1 -0
  120. package/lib/esm/lib/utils/tick.js +22 -0
  121. package/lib/esm/lib/utils/tick.js.map +1 -0
  122. package/lib/esm/module/Editor/Editor.js +91 -0
  123. package/lib/esm/module/Editor/Editor.js.map +1 -0
  124. package/lib/esm/module/Editor/lib/init-editor-provider.js +32 -0
  125. package/lib/esm/module/Editor/lib/init-editor-provider.js.map +1 -0
  126. package/lib/esm/module/Editor/lib/init-editor-state.js +18 -0
  127. package/lib/esm/module/Editor/lib/init-editor-state.js.map +1 -0
  128. package/lib/esm/module/Editor/lib/init-editor.js +27 -0
  129. package/lib/esm/module/Editor/lib/init-editor.js.map +1 -0
  130. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +29 -0
  131. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  132. package/lib/index.d.ts +137 -0
  133. package/package.json +32 -24
  134. package/lib/cjs/bundle.cjs +0 -2
  135. package/lib/cjs/bundle.cjs.map +0 -1
  136. package/tmp/app/helpers/common-test.d.ts +0 -1
  137. package/tmp/app/helpers/full-example.d.ts +0 -1
  138. package/tmp/app/helpers/index.d.ts +0 -5
  139. package/tmp/app/helpers/random-color.d.ts +0 -1
  140. package/tmp/app/helpers/random-string.d.ts +0 -1
  141. package/tmp/app/helpers/stress-test.d.ts +0 -1
  142. package/tmp/app/index.d.ts +0 -1
  143. package/tmp/extensions/compartments/index.d.ts +0 -4
  144. package/tmp/extensions/index.d.ts +0 -8
  145. package/tmp/extensions/init-extensions.d.ts +0 -14
  146. package/tmp/extensions/keymaps/bold-keymap.d.ts +0 -2
  147. package/tmp/extensions/keymaps/index.d.ts +0 -1
  148. package/tmp/extensions/keymaps/init-key-map.d.ts +0 -9
  149. package/tmp/extensions/keymaps/italic-key-map.d.ts +0 -2
  150. package/tmp/extensions/keymaps/line-through-key-map.d.ts +0 -2
  151. package/tmp/extensions/keymaps/underline-key-map.d.ts +0 -2
  152. package/tmp/extensions/listeners/get-change-event.d.ts +0 -6
  153. package/tmp/extensions/listeners/get-focus-event.d.ts +0 -8
  154. package/tmp/extensions/listeners/index.d.ts +0 -3
  155. package/tmp/extensions/listeners/init-listeners.d.ts +0 -4
  156. package/tmp/extensions/markdown/blockquote/blockquote-constants.d.ts +0 -3
  157. package/tmp/extensions/markdown/blockquote/blockquote-decoration.d.ts +0 -2
  158. package/tmp/extensions/markdown/blockquote/blockquote-widget.d.ts +0 -6
  159. package/tmp/extensions/markdown/blockquote/index.d.ts +0 -1
  160. package/tmp/extensions/markdown/bold/bold-constants.d.ts +0 -2
  161. package/tmp/extensions/markdown/bold/bold-decoration.d.ts +0 -2
  162. package/tmp/extensions/markdown/bold/index.d.ts +0 -1
  163. package/tmp/extensions/markdown/code/code-constants.d.ts +0 -3
  164. package/tmp/extensions/markdown/code/code-decoration.d.ts +0 -2
  165. package/tmp/extensions/markdown/code/code-widget.d.ts +0 -13
  166. package/tmp/extensions/markdown/code/index.d.ts +0 -1
  167. package/tmp/extensions/markdown/header/header-constants.d.ts +0 -3
  168. package/tmp/extensions/markdown/header/header-decoration.d.ts +0 -2
  169. package/tmp/extensions/markdown/header/index.d.ts +0 -1
  170. package/tmp/extensions/markdown/horizontal/horizontal-constants.d.ts +0 -1
  171. package/tmp/extensions/markdown/horizontal/horizontal-decoration.d.ts +0 -2
  172. package/tmp/extensions/markdown/horizontal/index.d.ts +0 -1
  173. package/tmp/extensions/markdown/image/image-constants.d.ts +0 -5
  174. package/tmp/extensions/markdown/image/image-decoration.d.ts +0 -2
  175. package/tmp/extensions/markdown/image/image-widget.d.ts +0 -15
  176. package/tmp/extensions/markdown/image/index.d.ts +0 -1
  177. package/tmp/extensions/markdown/index.d.ts +0 -2
  178. package/tmp/extensions/markdown/init-markdown.d.ts +0 -3
  179. package/tmp/extensions/markdown/italic/index.d.ts +0 -1
  180. package/tmp/extensions/markdown/italic/italic-constants.d.ts +0 -2
  181. package/tmp/extensions/markdown/italic/italic-decoration.d.ts +0 -2
  182. package/tmp/extensions/markdown/link/auto-link-decoration.d.ts +0 -2
  183. package/tmp/extensions/markdown/link/index.d.ts +0 -2
  184. package/tmp/extensions/markdown/link/link-constants.d.ts +0 -7
  185. package/tmp/extensions/markdown/link/link-decoration.d.ts +0 -2
  186. package/tmp/extensions/markdown/link/link-label-decoration.d.ts +0 -2
  187. package/tmp/extensions/markdown/link/link-widget.d.ts +0 -17
  188. package/tmp/extensions/markdown/list/index.d.ts +0 -1
  189. package/tmp/extensions/markdown/list/list-constants.d.ts +0 -4
  190. package/tmp/extensions/markdown/list/list-decoration.d.ts +0 -2
  191. package/tmp/extensions/markdown/list/list-widget.d.ts +0 -7
  192. package/tmp/extensions/markdown/markdown-decoration.d.ts +0 -5
  193. package/tmp/extensions/markdown/markdown-types.d.ts +0 -24
  194. package/tmp/extensions/markdown/mention/index.d.ts +0 -1
  195. package/tmp/extensions/markdown/mention/mention-constants.d.ts +0 -3
  196. package/tmp/extensions/markdown/mention/mention-decoration.d.ts +0 -2
  197. package/tmp/extensions/markdown/mention/mention-parser.d.ts +0 -2
  198. package/tmp/extensions/markdown/strike-through/index.d.ts +0 -1
  199. package/tmp/extensions/markdown/strike-through/strike-through-constants.d.ts +0 -1
  200. package/tmp/extensions/markdown/strike-through/strike-through-decoration.d.ts +0 -2
  201. package/tmp/extensions/markdown/todo/index.d.ts +0 -1
  202. package/tmp/extensions/markdown/todo/todo-constants.d.ts +0 -3
  203. package/tmp/extensions/markdown/todo/todo-decoration.d.ts +0 -2
  204. package/tmp/extensions/markdown/todo/todo-widget.d.ts +0 -11
  205. package/tmp/extensions/settings/index.d.ts +0 -1
  206. package/tmp/extensions/settings/init-settings.d.ts +0 -6
  207. package/tmp/extensions/theme/index.d.ts +0 -4
  208. package/tmp/extensions/theme/init-theme.d.ts +0 -3
  209. package/tmp/extensions/theme/theme-constants.d.ts +0 -14
  210. package/tmp/extensions/theme/theme-types.d.ts +0 -36
  211. package/tmp/extensions/theme/themes/get-dark-theme.d.ts +0 -2
  212. package/tmp/extensions/theme/themes/get-highlight-template.d.ts +0 -6
  213. package/tmp/extensions/theme/themes/get-light-theme.d.ts +0 -2
  214. package/tmp/extensions/theme/themes/get-theme-template.d.ts +0 -2
  215. package/tmp/extensions/theme/themes/index.d.ts +0 -2
  216. package/tmp/index.d.ts +0 -3
  217. package/tmp/lib/index.d.ts +0 -1
  218. package/tmp/lib/utils/copy-to-clipboard.d.ts +0 -1
  219. package/tmp/lib/utils/get-decoration.d.ts +0 -26
  220. package/tmp/lib/utils/index.d.ts +0 -5
  221. package/tmp/lib/utils/is-in-range.d.ts +0 -2
  222. package/tmp/lib/utils/is-range-overlap.d.ts +0 -1
  223. package/tmp/lib/utils/tick.d.ts +0 -10
  224. package/tmp/module/Editor/Editor.d.ts +0 -17
  225. package/tmp/module/Editor/Editor.types.d.ts +0 -13
  226. package/tmp/module/Editor/index.d.ts +0 -3
  227. package/tmp/module/Editor/lib/index.d.ts +0 -1
  228. package/tmp/module/Editor/lib/init-editor-provider.d.ts +0 -10
  229. package/tmp/module/Editor/lib/init-editor-state.d.ts +0 -7
  230. package/tmp/module/Editor/lib/init-editor.d.ts +0 -7
  231. package/tmp/module/index.d.ts +0 -1
@@ -0,0 +1,35 @@
1
+ function copyToClipboard(content) {
2
+ if (navigator.clipboard && window.isSecureContext) {
3
+ return navigator.clipboard.writeText(content);
4
+ }
5
+ return fallbackCopyTextToClipboard(content);
6
+ }
7
+ function fallbackCopyTextToClipboard(content) {
8
+ const textArea = document.createElement("textarea");
9
+ textArea.value = content;
10
+ textArea.style.top = "0";
11
+ textArea.style.left = "0";
12
+ textArea.style.opacity = "0";
13
+ textArea.style.position = "fixed";
14
+ document.body.appendChild(textArea);
15
+ textArea.focus();
16
+ textArea.select();
17
+ return new Promise((resolve, reject) => {
18
+ try {
19
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
20
+ if (document.execCommand("copy"))
21
+ resolve();
22
+ else
23
+ reject();
24
+ }
25
+ catch {
26
+ reject();
27
+ }
28
+ finally {
29
+ document.body.removeChild(textArea);
30
+ }
31
+ });
32
+ }
33
+
34
+ export { copyToClipboard };
35
+ //# sourceMappingURL=copy-to-clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-to-clipboard.js","sources":["../../../../src/lib/utils/copy-to-clipboard.ts"],"sourcesContent":["export function copyToClipboard(content: string): Promise<void> {\n if (navigator.clipboard && window.isSecureContext) {\n return navigator.clipboard.writeText(content);\n }\n\n return fallbackCopyTextToClipboard(content);\n}\n\nfunction fallbackCopyTextToClipboard(content: string) {\n const textArea = document.createElement(\"textarea\");\n textArea.value = content;\n\n textArea.style.top = \"0\";\n textArea.style.left = \"0\";\n textArea.style.opacity = \"0\";\n textArea.style.position = \"fixed\";\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n return new Promise<void>((resolve, reject) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n if (document.execCommand(\"copy\")) resolve();\n else reject();\n } catch {\n reject();\n } finally {\n document.body.removeChild(textArea);\n }\n });\n}\n"],"names":[],"mappings":"AAAM,SAAU,eAAe,CAAC,OAAe,EAAA;IAC7C,IAAI,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE;QACjD,OAAO,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;;AAG/C,IAAA,OAAO,2BAA2B,CAAC,OAAO,CAAC;AAC7C;AAEA,SAAS,2BAA2B,CAAC,OAAe,EAAA;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,IAAA,QAAQ,CAAC,KAAK,GAAG,OAAO;AAExB,IAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACxB,IAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AACzB,IAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC5B,IAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAEjC,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE;IAChB,QAAQ,CAAC,MAAM,EAAE;IAEjB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AAC3C,QAAA,IAAI;;AAEF,YAAA,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAAE,gBAAA,OAAO,EAAE;;AACtC,gBAAA,MAAM,EAAE;;AACb,QAAA,MAAM;AACN,YAAA,MAAM,EAAE;;gBACA;AACR,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;;AAEvC,KAAC,CAAC;AACJ;;;;"}
@@ -0,0 +1,24 @@
1
+ import { Decoration } from '@codemirror/view';
2
+
3
+ function getLineDecoration({ style, range }) {
4
+ return Decoration.line({
5
+ class: style,
6
+ }).range(range[0], range[1]);
7
+ }
8
+ function getMarkDecoration({ range, style }) {
9
+ return Decoration.mark({
10
+ class: style,
11
+ }).range(range[0], range[1]);
12
+ }
13
+ function getHideDecoration({ range }) {
14
+ return Decoration.replace({}).range(range[0], range[1]);
15
+ }
16
+ function getReplaceDecoration({ range, widget }) {
17
+ return Decoration.replace({ widget }).range(range[0], range[1]);
18
+ }
19
+ function getWidgetDecorationOptions({ widget, range }) {
20
+ return Decoration.widget({ widget, side: 1 }).range(range[0], range[1]);
21
+ }
22
+
23
+ export { getHideDecoration, getLineDecoration, getMarkDecoration, getReplaceDecoration, getWidgetDecorationOptions };
24
+ //# sourceMappingURL=get-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-decoration.js","sources":["../../../../src/lib/utils/get-decoration.ts"],"sourcesContent":["import { Decoration, type WidgetType } from \"@codemirror/view\";\n\ntype GetLineDecorationOptions = {\n style: string;\n range: [number, number?];\n};\nexport function getLineDecoration({ style, range }: GetLineDecorationOptions) {\n return Decoration.line({\n class: style,\n }).range(range[0], range[1]);\n}\n\ntype GetMarkDecorationOptions = {\n style: string;\n range: [number, number];\n};\nexport function getMarkDecoration({ range, style }: GetMarkDecorationOptions) {\n return Decoration.mark({\n class: style,\n }).range(range[0], range[1]);\n}\n\ntype GetHideDecorationOptions = {\n range: [number, number];\n};\nexport function getHideDecoration({ range }: GetHideDecorationOptions) {\n return Decoration.replace({}).range(range[0], range[1]);\n}\n\ntype GetReplaceDecorationOptions = {\n range: [number, number?];\n widget: WidgetType;\n};\nexport function getReplaceDecoration({ range, widget }: GetReplaceDecorationOptions) {\n return Decoration.replace({ widget }).range(range[0], range[1]);\n}\n\ntype GetWidgetDecorationOptions = {\n widget: WidgetType;\n range: [number, number?];\n};\nexport function getWidgetDecorationOptions({ widget, range }: GetWidgetDecorationOptions) {\n return Decoration.widget({ widget, side: 1 }).range(range[0], range[1]);\n}\n"],"names":[],"mappings":";;SAMgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAA4B,EAAA;IAC1E,OAAO,UAAU,CAAC,IAAI,CAAC;AACrB,QAAA,KAAK,EAAE,KAAK;AACb,KAAA,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9B;SAMgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAA4B,EAAA;IAC1E,OAAO,UAAU,CAAC,IAAI,CAAC;AACrB,QAAA,KAAK,EAAE,KAAK;AACb,KAAA,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9B;AAKgB,SAAA,iBAAiB,CAAC,EAAE,KAAK,EAA4B,EAAA;AACnE,IAAA,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD;SAMgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,EAA+B,EAAA;IACjF,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACjE;SAMgB,0BAA0B,CAAC,EAAE,MAAM,EAAE,KAAK,EAA8B,EAAA;IACtF,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACzE;;;;"}
@@ -0,0 +1,8 @@
1
+ import { isRangeOverlap } from './is-range-overlap.js';
2
+
3
+ function isInRange(ranges, text) {
4
+ return ranges.some((range) => isRangeOverlap([range.from, range.to], text));
5
+ }
6
+
7
+ export { isInRange };
8
+ //# sourceMappingURL=is-in-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-in-range.js","sources":["../../../../src/lib/utils/is-in-range.ts"],"sourcesContent":["import type { SelectionRange } from \"@codemirror/state\";\nimport { isRangeOverlap } from \"./is-range-overlap\";\n\nexport function isInRange(ranges: readonly SelectionRange[], text: [number, number]) {\n return ranges.some((range) => isRangeOverlap([range.from, range.to], text));\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,SAAS,CAAC,MAAiC,EAAE,IAAsB,EAAA;IACjF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7E;;;;"}
@@ -0,0 +1,6 @@
1
+ function isRangeOverlap(range, text) {
2
+ return range[0] <= text[1] && text[0] <= range[1];
3
+ }
4
+
5
+ export { isRangeOverlap };
6
+ //# sourceMappingURL=is-range-overlap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-range-overlap.js","sources":["../../../../src/lib/utils/is-range-overlap.ts"],"sourcesContent":["export function isRangeOverlap(range: [number, number], text: [number, number]) {\n return range[0] <= text[1] && text[0] <= range[1];\n}\n"],"names":[],"mappings":"AAAgB,SAAA,cAAc,CAAC,KAAuB,EAAE,IAAsB,EAAA;AAC5E,IAAA,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AACnD;;;;"}
@@ -0,0 +1,22 @@
1
+ function tick({ deep = 1, maxDeep = 1, delay = 0, recursiveCondition, delayGetter, type = "macro", }) {
2
+ return new Promise((resolve) => {
3
+ if (type === "micro") {
4
+ if (deep >= maxDeep || !recursiveCondition || recursiveCondition())
5
+ resolve(1);
6
+ else
7
+ void tick({ deep: deep + 1, maxDeep, delay, recursiveCondition, type, delayGetter }).then(() => resolve(1));
8
+ }
9
+ if (type === "macro") {
10
+ const currentDelay = delayGetter ? delayGetter(deep) : delay;
11
+ setTimeout(() => {
12
+ if (deep >= maxDeep || !recursiveCondition || recursiveCondition())
13
+ resolve(1);
14
+ else
15
+ void tick({ deep: deep + 1, maxDeep, delay, recursiveCondition, type, delayGetter }).then(() => resolve(1));
16
+ }, currentDelay);
17
+ }
18
+ });
19
+ }
20
+
21
+ export { tick };
22
+ //# sourceMappingURL=tick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.js","sources":["../../../../src/lib/utils/tick.ts"],"sourcesContent":["type TickOptions = {\n type?: \"micro\" | \"macro\";\n delay?: number;\n deep?: number;\n maxDeep?: number;\n recursiveCondition?: () => boolean;\n delayGetter?: (deep: number) => number;\n};\n\nexport function tick({\n deep = 1,\n maxDeep = 1,\n delay = 0,\n recursiveCondition,\n delayGetter,\n type = \"macro\",\n}: TickOptions) {\n return new Promise((resolve) => {\n if (type === \"micro\") {\n if (deep >= maxDeep || !recursiveCondition || recursiveCondition()) resolve(1);\n else\n void tick({ deep: deep + 1, maxDeep, delay, recursiveCondition, type, delayGetter }).then(\n () => resolve(1),\n );\n }\n if (type === \"macro\") {\n const currentDelay = delayGetter ? delayGetter(deep) : delay;\n\n setTimeout(() => {\n if (deep >= maxDeep || !recursiveCondition || recursiveCondition()) resolve(1);\n else\n void tick({ deep: deep + 1, maxDeep, delay, recursiveCondition, type, delayGetter }).then(\n () => resolve(1),\n );\n }, currentDelay);\n }\n });\n}\n"],"names":[],"mappings":"AASM,SAAU,IAAI,CAAC,EACnB,IAAI,GAAG,CAAC,EACR,OAAO,GAAG,CAAC,EACX,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,WAAW,EACX,IAAI,GAAG,OAAO,GACF,EAAA;AACZ,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,EAAE;gBAAE,OAAO,CAAC,CAAC,CAAC;;AAE5E,gBAAA,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CACvF,MAAM,OAAO,CAAC,CAAC,CAAC,CACjB;;AAEL,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK;YAE5D,UAAU,CAAC,MAAK;gBACd,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,EAAE;oBAAE,OAAO,CAAC,CAAC,CAAC;;AAE5E,oBAAA,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CACvF,MAAM,OAAO,CAAC,CAAC,CAAC,CACjB;aACJ,EAAE,YAAY,CAAC;;AAEpB,KAAC,CAAC;AACJ;;;;"}
@@ -0,0 +1,91 @@
1
+ import { EditorView, drawSelection } from '@codemirror/view';
2
+ import { ReadonlyCompartment, ThemeCompartment, VimModeCompartment } from '../../extensions/compartments/index.js';
3
+ import '@codemirror/commands';
4
+ import { getDarkTheme } from '../../extensions/theme/themes/get-dark-theme.js';
5
+ import { getLightTheme } from '../../extensions/theme/themes/get-light-theme.js';
6
+ import { initEditor } from './lib/init-editor.js';
7
+
8
+ class Editor {
9
+ view;
10
+ provider;
11
+ arguments;
12
+ constructor(options) {
13
+ void initEditor(options).then((editor) => {
14
+ this.view = editor.view;
15
+ this.provider = editor.provider;
16
+ });
17
+ this.arguments = options;
18
+ }
19
+ focus = () => {
20
+ if (!this.view)
21
+ return;
22
+ this.view.focus();
23
+ };
24
+ getContent = () => {
25
+ if (!this.view)
26
+ return;
27
+ return this.view.state.doc.toString();
28
+ };
29
+ setContent = (content, position) => {
30
+ if (!this.view)
31
+ return;
32
+ if (position == undefined) {
33
+ const cursor = this.view.state.selection.main.head;
34
+ position = cursor;
35
+ }
36
+ const transaction = this.view.state.update({
37
+ changes: {
38
+ from: position,
39
+ insert: content,
40
+ },
41
+ });
42
+ this.view.dispatch(transaction);
43
+ };
44
+ setReadonly = (readonly) => {
45
+ if (!this.view)
46
+ return;
47
+ this.view.dispatch({
48
+ effects: ReadonlyCompartment.reconfigure(EditorView.editable.of(!readonly)),
49
+ });
50
+ };
51
+ setTheme = (theme) => {
52
+ if (!this.view)
53
+ return;
54
+ this.view.dispatch({
55
+ effects: ThemeCompartment.reconfigure(theme === "dark"
56
+ ? getDarkTheme({
57
+ dark: this.arguments.dark,
58
+ light: this.arguments.light,
59
+ theme,
60
+ })
61
+ : getLightTheme({
62
+ dark: this.arguments.dark,
63
+ light: this.arguments.light,
64
+ theme,
65
+ })),
66
+ });
67
+ };
68
+ setVimMode = async (mode) => {
69
+ if (!this.view)
70
+ return;
71
+ const { vim } = await import('@replit/codemirror-vim');
72
+ this.view.dispatch({
73
+ effects: VimModeCompartment.reconfigure(mode ? [vim({ status: true }), drawSelection()] : []),
74
+ });
75
+ };
76
+ setUserProvider = (name = "Anonymous", color = "#000000") => {
77
+ if (!this.provider)
78
+ return;
79
+ this.provider.awareness.setLocalStateField("user", { name, color });
80
+ };
81
+ destroy = () => {
82
+ if (!this.view)
83
+ return;
84
+ this.view.destroy();
85
+ if (this.provider)
86
+ this.provider.destroy();
87
+ };
88
+ }
89
+
90
+ export { Editor };
91
+ //# sourceMappingURL=Editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.js","sources":["../../../../src/module/Editor/Editor.ts"],"sourcesContent":["import { EditorView, drawSelection } from \"@codemirror/view\";\nimport type { WebsocketProvider } from \"y-websocket\";\nimport {\n type EditorTheme,\n ReadonlyCompartment,\n ThemeCompartment,\n VimModeCompartment,\n getDarkTheme,\n getLightTheme,\n} from \"@/extensions\";\nimport { type EditorArguments } from \"./Editor.types\";\nimport { initEditor } from \"./lib\";\n\nexport class Editor {\n view: EditorView | undefined;\n\n provider: WebsocketProvider | undefined;\n\n arguments: EditorArguments;\n\n constructor(options: EditorArguments) {\n void initEditor(options).then((editor) => {\n this.view = editor.view;\n this.provider = editor.provider;\n });\n\n this.arguments = options;\n }\n\n focus = () => {\n if (!this.view) return;\n\n this.view.focus();\n };\n\n getContent = () => {\n if (!this.view) return;\n\n return this.view.state.doc.toString();\n };\n\n setContent = (content: string, position?: number) => {\n if (!this.view) return;\n\n if (position == undefined) {\n const cursor = this.view.state.selection.main.head;\n position = cursor;\n }\n\n const transaction = this.view.state.update({\n changes: {\n from: position,\n insert: content,\n },\n });\n this.view.dispatch(transaction);\n };\n\n setReadonly = (readonly: boolean) => {\n if (!this.view) return;\n\n this.view.dispatch({\n effects: ReadonlyCompartment.reconfigure(EditorView.editable.of(!readonly)),\n });\n };\n\n setTheme = (theme?: EditorTheme) => {\n if (!this.view) return;\n\n this.view.dispatch({\n effects: ThemeCompartment.reconfigure(\n theme === \"dark\"\n ? getDarkTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n })\n : getLightTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n }),\n ),\n });\n };\n\n setVimMode = async (mode: boolean) => {\n if (!this.view) return;\n\n const { vim } = await import(\"@replit/codemirror-vim\");\n\n this.view.dispatch({\n effects: VimModeCompartment.reconfigure(mode ? [vim({ status: true }), drawSelection()] : []),\n });\n };\n\n setUserProvider = (name: string = \"Anonymous\", color: string = \"#000000\") => {\n if (!this.provider) return;\n\n this.provider.awareness.setLocalStateField(\"user\", { name, color });\n };\n\n destroy = () => {\n if (!this.view) return;\n\n this.view.destroy();\n if (this.provider) this.provider.destroy();\n };\n}\n\nexport type EditorInterface = typeof Editor;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ async function initEditorProvider({ roomId, url, userName = "Anonymous", userColor, initialText, onStartProvider, }) {
2
+ const { Doc } = await import('yjs');
3
+ const { WebsocketProvider } = await import('y-websocket');
4
+ const multiCursorDocument = new Doc();
5
+ const multiCursorText = multiCursorDocument.getText(roomId);
6
+ if (!userColor || !userColor.startsWith("#")) {
7
+ // eslint-disable-next-line no-console
8
+ console.warn("user color must be hex!");
9
+ userColor = "#30bced";
10
+ }
11
+ const userColorLight = `${userColor.substring(0, 7)}33`;
12
+ const provider = new WebsocketProvider(url, roomId, multiCursorDocument);
13
+ provider.awareness.setLocalStateField("user", {
14
+ name: userName,
15
+ color: userColor,
16
+ colorLight: userColorLight,
17
+ });
18
+ if (onStartProvider)
19
+ provider.on("status", (event) => {
20
+ onStartProvider(event?.status);
21
+ });
22
+ if (provider && multiCursorText)
23
+ provider.on("sync", (isSynced) => {
24
+ if (isSynced && !multiCursorText.length && initialText) {
25
+ multiCursorText.insert(0, initialText);
26
+ }
27
+ });
28
+ return { provider, multiCursorText };
29
+ }
30
+
31
+ export { initEditorProvider };
32
+ //# sourceMappingURL=init-editor-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-editor-provider.js","sources":["../../../../../src/module/Editor/lib/init-editor-provider.ts"],"sourcesContent":["import type { MultiCursorOptions } from \"../Editor.types\";\n\ntype InitEditorProviderOptions = {\n initialText?: string;\n} & MultiCursorOptions;\n\nexport async function initEditorProvider({\n roomId,\n url,\n userName = \"Anonymous\",\n userColor,\n initialText,\n onStartProvider,\n}: InitEditorProviderOptions) {\n const { Doc } = await import(\"yjs\");\n const { WebsocketProvider } = await import(\"y-websocket\");\n\n const multiCursorDocument = new Doc();\n const multiCursorText = multiCursorDocument.getText(roomId);\n\n if (!userColor || !userColor.startsWith(\"#\")) {\n // eslint-disable-next-line no-console\n console.warn(\"user color must be hex!\");\n userColor = \"#30bced\";\n }\n const userColorLight = `${userColor.substring(0, 7)}33`;\n\n const provider = new WebsocketProvider(url, roomId, multiCursorDocument);\n provider.awareness.setLocalStateField(\"user\", {\n name: userName,\n color: userColor,\n colorLight: userColorLight,\n });\n\n if (onStartProvider)\n provider.on(\"status\", (event: { status: string }) => {\n onStartProvider(event?.status);\n });\n\n if (provider && multiCursorText)\n provider.on(\"sync\", (isSynced: boolean) => {\n if (isSynced && !multiCursorText.length && initialText) {\n multiCursorText.insert(0, initialText);\n }\n });\n\n return { provider, multiCursorText };\n}\n"],"names":[],"mappings":"AAMO,eAAe,kBAAkB,CAAC,EACvC,MAAM,EACN,GAAG,EACH,QAAQ,GAAG,WAAW,EACtB,SAAS,EACT,WAAW,EACX,eAAe,GACW,EAAA;IAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,KAAK,CAAC;IACnC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,OAAO,aAAa,CAAC;AAEzD,IAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAE;IACrC,MAAM,eAAe,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;IAE3D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;;AAE5C,QAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACvC,SAAS,GAAG,SAAS;;AAEvB,IAAA,MAAM,cAAc,GAAG,CAAG,EAAA,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,EAAA,CAAI;IAEvD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,mBAAmB,CAAC;AACxE,IAAA,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAC5C,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,UAAU,EAAE,cAAc;AAC3B,KAAA,CAAC;AAEF,IAAA,IAAI,eAAe;QACjB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAyB,KAAI;AAClD,YAAA,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC;AAChC,SAAC,CAAC;IAEJ,IAAI,QAAQ,IAAI,eAAe;QAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAiB,KAAI;YACxC,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,WAAW,EAAE;AACtD,gBAAA,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC;;AAE1C,SAAC,CAAC;AAEJ,IAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE;AACtC;;;;"}
@@ -0,0 +1,18 @@
1
+ import { EditorState } from '@codemirror/state';
2
+ import '../../../extensions/compartments/index.js';
3
+ import { initExtensions } from '../../../extensions/init-extensions.js';
4
+ import '@codemirror/view';
5
+ import '@codemirror/language';
6
+ import '@lezer/highlight';
7
+
8
+ async function initEditorState({ text, ...rest }) {
9
+ const extensions = await initExtensions(rest);
10
+ return EditorState.create({
11
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
12
+ doc: rest.multiCursorText ? rest.multiCursorText.toString() : text,
13
+ extensions,
14
+ });
15
+ }
16
+
17
+ export { initEditorState };
18
+ //# sourceMappingURL=init-editor-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-editor-state.js","sources":["../../../../../src/module/Editor/lib/init-editor-state.ts"],"sourcesContent":["import { EditorState } from \"@codemirror/state\";\nimport { type InitExtensionsOptions, initExtensions } from \"@/extensions\";\n\ntype InitEditorStateOptions = {\n text: string;\n} & InitExtensionsOptions;\n\nexport async function initEditorState({ text, ...rest }: InitEditorStateOptions) {\n const extensions = await initExtensions(rest);\n\n return EditorState.create({\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n doc: rest.multiCursorText ? rest.multiCursorText.toString() : text,\n extensions,\n });\n}\n"],"names":[],"mappings":";;;;;;;AAOO,eAAe,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAA0B,EAAA;AAC7E,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC;IAE7C,OAAO,WAAW,CAAC,MAAM,CAAC;;AAExB,QAAA,GAAG,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,IAAI;QAClE,UAAU;AACX,KAAA,CAAC;AACJ;;;;"}
@@ -0,0 +1,27 @@
1
+ import { EditorView } from '@codemirror/view';
2
+ import { initEditorProvider } from './init-editor-provider.js';
3
+ import { initEditorState } from './init-editor-state.js';
4
+
5
+ async function initEditor({ multiCursor, root, initialText, ...rest }) {
6
+ let provider;
7
+ let multiCursorText;
8
+ if (multiCursor) {
9
+ const editorProvider = await initEditorProvider({ ...multiCursor, initialText });
10
+ provider = editorProvider.provider;
11
+ multiCursorText = editorProvider.multiCursorText;
12
+ }
13
+ const state = await initEditorState({
14
+ ...rest,
15
+ text: initialText || "",
16
+ provider,
17
+ multiCursorText,
18
+ });
19
+ const view = new EditorView({
20
+ state,
21
+ parent: root,
22
+ });
23
+ return { view, provider };
24
+ }
25
+
26
+ export { initEditor };
27
+ //# sourceMappingURL=init-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-editor.js","sources":["../../../../../src/module/Editor/lib/init-editor.ts"],"sourcesContent":["import { EditorView } from \"@codemirror/view\";\nimport { type WebsocketProvider } from \"y-websocket\";\nimport type { Text } from \"yjs\";\nimport type { EditorArguments } from \"../Editor.types\";\nimport { initEditorProvider } from \"./init-editor-provider\";\nimport { initEditorState } from \"./init-editor-state\";\n\nexport async function initEditor({ multiCursor, root, initialText, ...rest }: EditorArguments) {\n let provider: WebsocketProvider | undefined;\n let multiCursorText: Text | undefined;\n\n if (multiCursor) {\n const editorProvider = await initEditorProvider({ ...multiCursor, initialText });\n provider = editorProvider.provider;\n multiCursorText = editorProvider.multiCursorText;\n }\n\n const state = await initEditorState({\n ...rest,\n text: initialText || \"\",\n provider,\n multiCursorText,\n });\n const view = new EditorView({\n state,\n parent: root,\n });\n\n return { view, provider };\n}\n"],"names":[],"mappings":";;;;AAOO,eAAe,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,EAAmB,EAAA;AAC3F,IAAA,IAAI,QAAuC;AAC3C,IAAA,IAAI,eAAiC;IAErC,IAAI,WAAW,EAAE;AACf,QAAA,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,EAAE,GAAG,WAAW,EAAE,WAAW,EAAE,CAAC;AAChF,QAAA,QAAQ,GAAG,cAAc,CAAC,QAAQ;AAClC,QAAA,eAAe,GAAG,cAAc,CAAC,eAAe;;AAGlD,IAAA,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC;AAClC,QAAA,GAAG,IAAI;QACP,IAAI,EAAE,WAAW,IAAI,EAAE;QACvB,QAAQ;QACR,eAAe;AAChB,KAAA,CAAC;AACF,IAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;QAC1B,KAAK;AACL,QAAA,MAAM,EAAE,IAAI;AACb,KAAA,CAAC;AAEF,IAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC3B;;;;"}
@@ -0,0 +1,29 @@
1
+ function styleInject(css, ref) {
2
+ if ( ref === void 0 ) ref = {};
3
+ var insertAt = ref.insertAt;
4
+
5
+ if (typeof document === 'undefined') { return; }
6
+
7
+ var head = document.head || document.getElementsByTagName('head')[0];
8
+ var style = document.createElement('style');
9
+ style.type = 'text/css';
10
+
11
+ if (insertAt === 'top') {
12
+ if (head.firstChild) {
13
+ head.insertBefore(style, head.firstChild);
14
+ } else {
15
+ head.appendChild(style);
16
+ }
17
+ } else {
18
+ head.appendChild(style);
19
+ }
20
+
21
+ if (style.styleSheet) {
22
+ style.styleSheet.cssText = css;
23
+ } else {
24
+ style.appendChild(document.createTextNode(css));
25
+ }
26
+ }
27
+
28
+ export { styleInject as default };
29
+ //# sourceMappingURL=style-inject.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-inject.es.js","sources":["../../../../../../../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAY,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO;;AAExD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B;AACA,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B;;AAEA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD;AACA;;;;","x_google_ignoreList":[0]}
package/lib/index.d.ts ADDED
@@ -0,0 +1,137 @@
1
+ import { KeyBinding, EditorView, ViewUpdate, Decoration } from '@codemirror/view';
2
+ import { WebsocketProvider } from 'y-websocket';
3
+ import { Text } from 'yjs';
4
+ import { EditorState, Range } from '@codemirror/state';
5
+ import { LanguageDescription } from '@codemirror/language';
6
+ import { SyntaxNodeRef } from '@lezer/common';
7
+
8
+ type EditorTheme = "dark" | "light";
9
+ type InitThemeOptions = {
10
+ dark?: ThemeOptions;
11
+ light?: ThemeOptions;
12
+ theme?: EditorTheme;
13
+ };
14
+ type ThemeOptions = {
15
+ themeConfig?: ThemeConfig;
16
+ highlightConfig?: HighlightConfig;
17
+ };
18
+ type ThemeConfig = {
19
+ fontFamily?: string;
20
+ color?: string;
21
+ background?: string;
22
+ codeBackground?: string;
23
+ codeColor?: string;
24
+ codeButtonColor?: string;
25
+ codeButtonBackground?: string;
26
+ horizontalColor?: string;
27
+ linkColor?: string;
28
+ blockquoteColor?: string;
29
+ mentionColor?: string;
30
+ vimSelectionFocused?: string;
31
+ vimSelection?: string;
32
+ };
33
+ type HighlightConfig = {
34
+ keyword?: string;
35
+ variable?: string;
36
+ function?: string;
37
+ string?: string;
38
+ constant?: string;
39
+ type?: string;
40
+ class?: string;
41
+ number?: string;
42
+ comment?: string;
43
+ heading?: string;
44
+ invalid?: string;
45
+ regexp?: string;
46
+ };
47
+
48
+ type InitKeyMapsOptions = {
49
+ onEnter?: HandleEnterKeyMapEditorFunction;
50
+ onEscape?: HandleEscapeKeyMapEditorFunction;
51
+ keyMaps?: CustomKeyMap[];
52
+ defaultKeyMaps?: DefaultKeyMapsOptions;
53
+ };
54
+ type CustomKeyMap = KeyBinding;
55
+ type HandleEnterKeyMapEditorFunction = (view: EditorView) => boolean;
56
+ type HandleEscapeKeyMapEditorFunction = (view: EditorView) => boolean;
57
+ type DefaultKeyMapsOptions = {
58
+ vim?: boolean;
59
+ theme?: boolean;
60
+ };
61
+
62
+ type GetChangeEventOptions = {
63
+ onChange?: HandleChangeEditorFunction;
64
+ };
65
+ type HandleChangeEditorFunction = (view: ViewUpdate) => void;
66
+
67
+ type GetFocusEventOptions = {
68
+ onFocus?: HandleFocusEditorFunction;
69
+ onBlur?: HandleBlurEditorFunction;
70
+ };
71
+ type HandleFocusEditorFunction = (state: EditorState) => void;
72
+ type HandleBlurEditorFunction = (state: EditorState) => void;
73
+
74
+ type InitListenersOptions = GetFocusEventOptions & GetChangeEventOptions;
75
+
76
+ type InitMarkdownOptions = {
77
+ languages?: LanguageDescription[];
78
+ };
79
+ type GetDecorationOptions = {
80
+ node: SyntaxNodeRef;
81
+ decorations: Range<Decoration>[];
82
+ view: EditorView;
83
+ };
84
+ type GetSelectionDecorationOptions = {
85
+ node: SyntaxNodeRef;
86
+ decorations: Range<Decoration>[];
87
+ view: EditorView;
88
+ isReadonly: boolean;
89
+ };
90
+ type GetDecorationFunction = (options: GetDecorationOptions) => void;
91
+ type GetSelectionDecorationFunction = (options: GetSelectionDecorationOptions) => void;
92
+ type DecorationPlugin = {
93
+ decorations?: GetDecorationFunction[];
94
+ selectionDecorations?: GetSelectionDecorationFunction[];
95
+ };
96
+
97
+ type InitSettingsOptions = {
98
+ readonly?: boolean;
99
+ vimMode?: boolean;
100
+ };
101
+
102
+ type ExtensionsOptions = InitListenersOptions & InitThemeOptions & InitSettingsOptions & InitMarkdownOptions & InitKeyMapsOptions;
103
+ type InitExtensionsOptions = {
104
+ multiCursorText: Text | undefined;
105
+ provider: WebsocketProvider | undefined;
106
+ } & ExtensionsOptions;
107
+
108
+ type EditorArguments = {
109
+ root: HTMLElement;
110
+ initialText?: string;
111
+ multiCursor?: MultiCursorOptions;
112
+ } & ExtensionsOptions;
113
+ type MultiCursorOptions = {
114
+ url: string;
115
+ userName?: string;
116
+ userColor?: string;
117
+ roomId: string;
118
+ onStartProvider?: (status?: string) => void;
119
+ };
120
+
121
+ declare class Editor {
122
+ view: EditorView | undefined;
123
+ provider: WebsocketProvider | undefined;
124
+ arguments: EditorArguments;
125
+ constructor(options: EditorArguments);
126
+ focus: () => void;
127
+ getContent: () => string | undefined;
128
+ setContent: (content: string, position?: number) => void;
129
+ setReadonly: (readonly: boolean) => void;
130
+ setTheme: (theme?: EditorTheme) => void;
131
+ setVimMode: (mode: boolean) => Promise<void>;
132
+ setUserProvider: (name?: string, color?: string) => void;
133
+ destroy: () => void;
134
+ }
135
+ type EditorInterface = typeof Editor;
136
+
137
+ export { type CustomKeyMap, type DecorationPlugin, type DefaultKeyMapsOptions, Editor, type EditorArguments, type EditorInterface, type EditorTheme, type ExtensionsOptions, type GetChangeEventOptions, type GetDecorationFunction, type GetDecorationOptions, type GetFocusEventOptions, type GetSelectionDecorationFunction, type GetSelectionDecorationOptions, type HandleBlurEditorFunction, type HandleChangeEditorFunction, type HandleEnterKeyMapEditorFunction, type HandleEscapeKeyMapEditorFunction, type HandleFocusEditorFunction, type HighlightConfig, type InitExtensionsOptions, type InitKeyMapsOptions, type InitListenersOptions, type InitMarkdownOptions, type InitSettingsOptions, type InitThemeOptions, type MultiCursorOptions, type ThemeConfig, type ThemeOptions };
package/package.json CHANGED
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "name": "@krainovsd/markdown-editor",
3
- "version": "0.0.3",
3
+ "version": "0.1.0",
4
4
  "description": "Krainov markdown-editor",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",
7
7
  "license": "ISC",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "https://github.com/KrainovSD/markdown-editor"
10
+ "url": "git+https://github.com/KrainovSD/js-tools.git",
11
+ "directory": "packages/markdown-editor"
11
12
  },
12
13
  "sideEffects": false,
13
14
  "exports": {
14
15
  ".": {
15
- "types": "./tmp/index.d.ts",
16
+ "types": "./lib/index.d.ts",
16
17
  "import": "./lib/esm/index.js",
17
18
  "require": "./lib/cjs/bundle.cjs"
18
19
  }
@@ -24,40 +25,47 @@
24
25
  "js"
25
26
  ],
26
27
  "files": [
27
- "lib",
28
- "tmp"
28
+ "lib"
29
29
  ],
30
30
  "scripts": {
31
+ "publish-package": "npm run lint && npm run build && npm publish",
31
32
  "dev": "vite",
32
- "build": "npm run build:types && npm run build:js",
33
- "build:js": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript --no-stdin --environment BUILD:production,NODE_ENV:production",
34
- "build:types": "tspc -p tsconfig.build.json",
33
+ "build": "npm run clear && npm run build:types && npm run build:js",
35
34
  "lint": "eslint src/** -c ./eslint.config.js --color --max-warnings 0",
36
35
  "lint:debug": "eslint --debug eslint.config.js",
37
- "format": "prettier --write 'src/**/*.{js,ts,tsx,scss,css,json}'"
36
+ "format": "prettier --write 'src/**/*.{js,ts,tsx,scss,css,json}'",
37
+ "build:dev": "vite build",
38
+ "build:js": "rm -rf lib && rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript --no-stdin --environment BUILD:production,NODE_ENV:production",
39
+ "build:types": "tspc -p tsconfig.build.json",
40
+ "clear": "rm -rf ./lib"
38
41
  },
39
42
  "devDependencies": {
40
- "@codemirror/language-data": "6.5.1",
41
- "@krainovsd/eslint-presets": "0.1.0",
42
- "@lezer/common": "1.2.3",
43
- "@lezer/markdown": "1.3.2",
44
- "@rollup/plugin-node-resolve": "15.3.0",
43
+ "rollup": "4.29.1",
45
44
  "@rollup/plugin-terser": "0.4.4",
46
- "@rollup/plugin-typescript": "12.1.1",
47
- "@trivago/prettier-plugin-sort-imports": "4.3.0",
48
- "@types/node": "22.8.6",
45
+ "@krainovsd/eslint-presets": "0.2.1",
46
+ "@rollup/plugin-commonjs": "28.0.2",
47
+ "@rollup/plugin-json": "6.1.0",
48
+ "@rollup/plugin-node-resolve": "16.0.0",
49
+ "@rollup/plugin-typescript": "12.1.2",
50
+ "rollup-plugin-dts": "6.1.1",
51
+ "rollup-plugin-bundle-stats": "4.17.0",
52
+ "rollup-plugin-visualizer": "5.12.0",
49
53
  "@types/rollup-plugin-peer-deps-external": "2.2.5",
50
- "eslint": "9.13.0",
51
- "prettier": "3.3.3",
52
- "rollup": "4.21.2",
53
54
  "rollup-plugin-peer-deps-external": "2.2.4",
54
55
  "rollup-plugin-postcss": "4.0.2",
56
+ "@trivago/prettier-plugin-sort-imports": "4.3.0",
57
+ "@types/node": "22.8.6",
58
+ "eslint": "9.17.0",
59
+ "prettier": "3.3.3",
60
+ "ts-patch": "3.3.0",
61
+ "typescript": "5.6.3",
62
+ "typescript-transform-paths": "3.5.2",
63
+ "@codemirror/language-data": "6.5.1",
64
+ "@lezer/common": "1.2.3",
65
+ "@lezer/markdown": "1.3.2",
55
66
  "sass": "1.83.0",
56
67
  "sass-embedded": "1.81.0",
57
- "ts-patch": "^3.3.0",
58
- "typescript": "5.6.3",
59
- "typescript-transform-paths": "^3.5.2",
60
- "vite": "5.4.10"
68
+ "vite": "6.0.11"
61
69
  },
62
70
  "dependencies": {
63
71
  "@codemirror/commands": "6.7.1",