@dxos/react-ui-editor 0.3.10-next.ef70620 → 0.3.11-main.0e40963

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 (169) hide show
  1. package/dist/lib/browser/index.mjs +2226 -971
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +63 -0
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -0
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +9 -4
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +12 -4
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/index.d.ts +1 -1
  11. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  12. package/dist/types/src/extensions/autocomplete.d.ts +10 -0
  13. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  14. package/dist/types/src/{components/TextEditor/extensions/basic/bundle.d.ts → extensions/basic.d.ts} +3 -2
  15. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  16. package/dist/types/src/extensions/blast.d.ts +25 -0
  17. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  18. package/dist/types/src/extensions/code.d.ts +2 -0
  19. package/dist/types/src/extensions/code.d.ts.map +1 -0
  20. package/dist/types/src/extensions/comments.d.ts +48 -0
  21. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  22. package/dist/types/src/extensions/hr.d.ts +2 -0
  23. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  24. package/dist/types/src/extensions/image.d.ts +4 -0
  25. package/dist/types/src/extensions/image.d.ts.map +1 -0
  26. package/dist/types/src/extensions/index.d.ts +16 -0
  27. package/dist/types/src/extensions/index.d.ts.map +1 -0
  28. package/dist/types/src/extensions/link.d.ts +12 -0
  29. package/dist/types/src/extensions/link.d.ts.map +1 -0
  30. package/dist/types/src/extensions/listener.d.ts +10 -0
  31. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  32. package/dist/types/src/extensions/markdown/bundle.d.ts +17 -0
  33. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  34. package/dist/types/src/extensions/markdown/highlight.d.ts +36 -0
  35. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  36. package/dist/types/src/extensions/markdown/index.d.ts +3 -0
  37. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  38. package/dist/types/src/extensions/mention.d.ts +6 -0
  39. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  40. package/dist/types/src/extensions/mermaid.d.ts +3 -0
  41. package/dist/types/src/extensions/mermaid.d.ts.map +1 -0
  42. package/dist/types/src/extensions/table.d.ts +8 -0
  43. package/dist/types/src/extensions/table.d.ts.map +1 -0
  44. package/dist/types/src/extensions/tasklist.d.ts +3 -0
  45. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  46. package/dist/types/src/extensions/typewriter.d.ts +10 -0
  47. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  48. package/dist/types/src/extensions/util.d.ts +5 -0
  49. package/dist/types/src/extensions/util.d.ts.map +1 -0
  50. package/dist/types/src/hooks/automerge/automerge.stories.d.ts +15 -0
  51. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
  52. package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
  53. package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +1 -1
  54. package/dist/types/src/hooks/automerge/index.d.ts.map +1 -0
  55. package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -0
  56. package/dist/types/src/{automerge/automerge-plugin/PatchSemaphore.d.ts → hooks/automerge/semaphore.d.ts} +4 -1
  57. package/dist/types/src/hooks/automerge/semaphore.d.ts.map +1 -0
  58. package/dist/types/src/{automerge/automerge-plugin/codeMirrorToAm.d.ts → hooks/automerge/update-automerge.d.ts} +2 -3
  59. package/dist/types/src/hooks/automerge/update-automerge.d.ts.map +1 -0
  60. package/dist/types/src/hooks/automerge/update-codemirror.d.ts +5 -0
  61. package/dist/types/src/hooks/automerge/update-codemirror.d.ts.map +1 -0
  62. package/dist/types/src/hooks/index.d.ts +0 -1
  63. package/dist/types/src/hooks/index.d.ts.map +1 -1
  64. package/dist/types/src/hooks/useTextModel.d.ts +19 -5
  65. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  66. package/dist/types/src/{components/TextEditor → hooks/yjs}/yjs.stories.d.ts +2 -1
  67. package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +1 -0
  68. package/dist/types/src/hooks/yjs/yjs.test.d.ts +2 -0
  69. package/dist/types/src/hooks/yjs/yjs.test.d.ts.map +1 -0
  70. package/dist/types/src/index.d.ts +3 -0
  71. package/dist/types/src/index.d.ts.map +1 -1
  72. package/dist/types/src/styles/markdown.d.ts +14 -11
  73. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  74. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  75. package/dist/types/src/themes/default.d.ts +17 -0
  76. package/dist/types/src/themes/default.d.ts.map +1 -0
  77. package/dist/types/src/themes/index.d.ts +2 -0
  78. package/dist/types/src/themes/index.d.ts.map +1 -0
  79. package/package.json +28 -33
  80. package/src/components/TextEditor/MarkdownEditor.stories.tsx +426 -0
  81. package/src/components/TextEditor/TextEditor.stories.tsx +57 -43
  82. package/src/components/TextEditor/TextEditor.tsx +98 -52
  83. package/src/components/TextEditor/index.ts +1 -1
  84. package/src/extensions/autocomplete.ts +59 -0
  85. package/src/{components/TextEditor/extensions/basic/bundle.ts → extensions/basic.ts} +8 -4
  86. package/src/extensions/blast.ts +373 -0
  87. package/src/extensions/code.ts +99 -0
  88. package/src/extensions/comments.ts +391 -0
  89. package/src/extensions/hr.ts +74 -0
  90. package/src/extensions/image.ts +69 -0
  91. package/src/extensions/index.ts +19 -0
  92. package/src/extensions/link.ts +192 -0
  93. package/src/extensions/listener.ts +35 -0
  94. package/src/extensions/markdown/bundle.ts +106 -0
  95. package/src/extensions/markdown/highlight.ts +204 -0
  96. package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +1 -1
  97. package/src/extensions/mention.ts +31 -0
  98. package/src/extensions/mermaid.ts +11 -0
  99. package/src/extensions/table.ts +132 -0
  100. package/src/extensions/tasklist.ts +121 -0
  101. package/src/extensions/typewriter.ts +68 -0
  102. package/src/extensions/util.ts +18 -0
  103. package/src/{automerge → hooks/automerge}/automerge.stories.tsx +7 -5
  104. package/src/{automerge/automerge-plugin → hooks/automerge}/plugin.ts +2 -1
  105. package/src/{automerge/automerge-plugin/PatchSemaphore.ts → hooks/automerge/semaphore.ts} +13 -9
  106. package/src/{automerge/automerge-plugin/codeMirrorToAm.ts → hooks/automerge/update-automerge.ts} +5 -2
  107. package/src/{automerge/automerge-plugin/amToCodemirror.ts → hooks/automerge/update-codemirror.ts} +4 -1
  108. package/src/hooks/index.ts +0 -1
  109. package/src/hooks/useTextModel.ts +102 -42
  110. package/src/{components/TextEditor → hooks/yjs}/yjs.stories.tsx +2 -1
  111. package/src/hooks/yjs/yjs.test.ts +59 -0
  112. package/src/index.ts +3 -0
  113. package/src/styles/markdown.ts +33 -24
  114. package/src/testing/replicator.ts +6 -6
  115. package/src/themes/default.ts +302 -0
  116. package/src/themes/index.ts +5 -0
  117. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
  118. package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts +0 -6
  119. package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
  120. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +0 -1
  121. package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +0 -1
  122. package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +0 -1
  123. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +0 -1
  124. package/dist/types/src/automerge/automerge.stories.d.ts +0 -9
  125. package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
  126. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts.map +0 -1
  127. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts +0 -3
  128. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts.map +0 -1
  129. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts +0 -10
  130. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts.map +0 -1
  131. package/dist/types/src/components/TextEditor/extensions/change.d.ts +0 -7
  132. package/dist/types/src/components/TextEditor/extensions/change.d.ts.map +0 -1
  133. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts +0 -11
  134. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts.map +0 -1
  135. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts +0 -8
  136. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts.map +0 -1
  137. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts +0 -10
  138. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts.map +0 -1
  139. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts +0 -4
  140. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts.map +0 -1
  141. package/dist/types/src/components/TextEditor/extensions/index.d.ts +0 -5
  142. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  143. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +0 -8
  144. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  145. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts +0 -3
  146. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  147. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts +0 -17
  148. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts.map +0 -1
  149. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts +0 -21
  150. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts.map +0 -1
  151. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
  152. package/dist/types/src/hooks/useCollaboration.d.ts +0 -9
  153. package/dist/types/src/hooks/useCollaboration.d.ts.map +0 -1
  154. package/src/components/TextEditor/extensions/basic/index.ts +0 -6
  155. package/src/components/TextEditor/extensions/basic/theme.ts +0 -49
  156. package/src/components/TextEditor/extensions/change.ts +0 -22
  157. package/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.ts +0 -99
  158. package/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.tsx +0 -61
  159. package/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.tsx +0 -119
  160. package/src/components/TextEditor/extensions/hyperlink/index.ts +0 -7
  161. package/src/components/TextEditor/extensions/index.ts +0 -8
  162. package/src/components/TextEditor/extensions/markdown/bundle.ts +0 -99
  163. package/src/components/TextEditor/extensions/markdown/tags.ts +0 -38
  164. package/src/components/TextEditor/extensions/markdown/theme.ts +0 -265
  165. package/src/hooks/useCollaboration.ts +0 -45
  166. package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.d.ts +0 -0
  167. package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/plugin.d.ts +0 -0
  168. package/src/{automerge/automerge-plugin → hooks/automerge}/handle.ts +0 -0
  169. package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +1 -1
@@ -1,99 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- // Copyright CodeMirror
4
- //
5
-
6
- import { syntaxTree } from '@codemirror/language';
7
- import { type EditorState, type RangeSet, RangeSetBuilder, StateField, type Transaction } from '@codemirror/state';
8
- import { Decoration, EditorView, WidgetType } from '@codemirror/view';
9
-
10
- // Adapted from:
11
- // https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=
12
- // https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433
13
-
14
- // TODO(burdon): Adapt to make all markdown editable?
15
-
16
- // TODO(burdon): Research overlays.
17
- // https://stackoverflow.com/questions/26933344/codemirror-detect-and-create-links-inside-editor
18
- // https://codemirror.net/5/doc/manual.html#addOverlay
19
- // https://codemirror.net/5/demo/simplemode.html
20
- // https://codemirror.net/5/demo/search.html (Search dialog).
21
-
22
- class Link extends WidgetType {
23
- constructor(private readonly _anchor: number, private readonly _text: string, private readonly _url?: string) {
24
- super();
25
- }
26
-
27
- override eq(other: any) {
28
- return this._text === other.text && this._url === other.url;
29
- }
30
-
31
- toDOM(view: EditorView) {
32
- const link = document.createElement('a');
33
- link.setAttribute('class', 'cm-link');
34
- link.textContent = this._text;
35
- if (this._url) {
36
- link.setAttribute('target', '_blank');
37
- link.href = this._url;
38
- } else {
39
- link.onclick = () => {
40
- view.dispatch({
41
- selection: {
42
- anchor: this._anchor,
43
- },
44
- });
45
- };
46
- }
47
-
48
- return link;
49
- }
50
- }
51
-
52
- type HyperlinkDecorationConfig = {
53
- link?: boolean;
54
- };
55
-
56
- /**
57
- * Creates a state field to replace AST elements with a hyperlink widget.
58
- * https://codemirror.net/docs/ref/#state.StateField
59
- */
60
- export const hyperlinkDecoration = ({ link }: HyperlinkDecorationConfig = {}) => {
61
- return StateField.define<RangeSet<any>>({
62
- create: (state) => update(state, link),
63
- update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, link),
64
- provide: (field) => EditorView.decorations.from(field),
65
- });
66
- };
67
-
68
- const update = (state: EditorState, link?: boolean) => {
69
- const builder = new RangeSetBuilder();
70
- const cursor = state.selection.main.head;
71
- syntaxTree(state).iterate({
72
- enter: (node) => {
73
- // Check if cursor is inside text.
74
- if (cursor < node.from || cursor > node.to) {
75
- if (node.name === 'Link') {
76
- const marks = node.node.getChildren('LinkMark');
77
- const text = marks.length >= 2 ? state.sliceDoc(marks[0].to, marks[1].from) : '';
78
-
79
- const urlNode = node.node.getChild('URL');
80
- const url = urlNode ? state.sliceDoc(urlNode.from, urlNode.to) : '';
81
-
82
- builder.add(
83
- node.from,
84
- node.to,
85
- Decoration.replace({
86
- widget: new Link(node.from, text, link ? url : undefined),
87
- }),
88
- );
89
-
90
- return false;
91
- }
92
- }
93
-
94
- return true;
95
- },
96
- });
97
-
98
- return builder.finish();
99
- };
@@ -1,61 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { hoverTooltip } from '@codemirror/view';
6
-
7
- import { tooltipContent } from '@dxos/react-ui-theme';
8
-
9
- const markdownLinkRegexp = /\[([^\]]+)]\(([^)]+)\)/;
10
-
11
- export type OnHyperlinkHover = (el: Element, url: string) => void;
12
-
13
- /**
14
- * https://codemirror.net/examples/tooltip
15
- * https://codemirror.net/docs/ref/#view.hoverTooltip
16
- * https://github.com/codemirror/view/blob/main/src/tooltip.ts
17
- */
18
- // TODO(burdon): Create config object.
19
- export const createHyperlinkTooltip = (onHover: OnHyperlinkHover, regexp = markdownLinkRegexp) =>
20
- hoverTooltip((view, pos) => {
21
- const { from, text } = view.state.doc.lineAt(pos);
22
- const p = pos - from;
23
-
24
- let idx = 0;
25
- let match;
26
- do {
27
- match = text.substring(idx).match(regexp);
28
- if (!match) {
29
- match = undefined;
30
- break;
31
- }
32
-
33
- idx = text.indexOf(match[0]);
34
- if (p >= idx && p < idx + match[0].length) {
35
- break;
36
- }
37
-
38
- idx += match[0].length;
39
- } while (true);
40
-
41
- if (!match) {
42
- return null;
43
- }
44
-
45
- const [, , url] = match ?? [];
46
-
47
- return {
48
- pos: idx + from,
49
- end: idx + from + match[0].length,
50
- above: true,
51
- create: () => {
52
- const el = document.createElement('a');
53
- el.innerText = '_'; // Required so doesn't collapse.
54
- el.className = tooltipContent({}, 'mb-2 p-1');
55
- el.setAttribute('target', '_blank');
56
- el.setAttribute('href', url);
57
- onHover(el, url);
58
- return { dom: el };
59
- },
60
- };
61
- });
@@ -1,119 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- // Adapted from: https://github.com/uiwjs/react-codemirror/blob/master/extensions/hyper-link/src/index.ts
4
- //
5
-
6
- import { type Extension } from '@codemirror/state';
7
- import {
8
- Decoration,
9
- type DecorationSet,
10
- EditorView,
11
- MatchDecorator,
12
- ViewPlugin,
13
- type ViewUpdate,
14
- } from '@codemirror/view';
15
-
16
- // Notes: Can't edit widget content (or cursor nav through them).
17
- // - https://discuss.codemirror.net/t/focusing-inputs-within-widgets/5178/7
18
- // Widgets intentionally always get set to contenteditable=false,
19
- // or they would become part of CodeMirror’s editable content element.
20
- // You should be able to introduce new contenteditable=true child elements inside of them.
21
-
22
- const markdownLinkRegexp = /\[([^\]]+)]\(([^)]+)\)(!?)/gi;
23
-
24
- /**
25
- * Custom link decorator.
26
- * NOTE: The default markdown extension formats links by default.
27
- * @deprecated
28
- */
29
- const linkDecorator = () =>
30
- new MatchDecorator({
31
- regexp: markdownLinkRegexp,
32
- decorate: (add, from, to, match, view) => {
33
- const [_, label, url] = match;
34
- const p0 = {
35
- start: from,
36
- end: from + 1,
37
- };
38
-
39
- const p1 = {
40
- start: from + 1,
41
- end: from + 1 + label.length,
42
- };
43
-
44
- const p2 = {
45
- start: p1.end,
46
- end: p1.end + 1,
47
- };
48
-
49
- const p3 = {
50
- start: p1.end + 1,
51
- end: p1.end + 1 + url.length + 2,
52
- };
53
-
54
- add(
55
- p0.start,
56
- p0.end,
57
- Decoration.mark({ class: 'cm-hyperlink-bracket', _attributes: { style: 'display: none' } }),
58
- );
59
- add(p1.start, p1.end, Decoration.mark({ class: 'cm-hyperlink-label' }));
60
- add(
61
- p2.start,
62
- p2.end,
63
- Decoration.mark({ class: 'cm-hyperlink-bracket', _attributes: { style: 'display: none' } }),
64
- );
65
- add(p3.start, p3.end, Decoration.mark({ class: 'cm-hyperlink-url', _attributes: { style: 'display: none' } }));
66
- },
67
- });
68
-
69
- export function hyperLinkExtension() {
70
- return ViewPlugin.fromClass(
71
- class HyperLinkView {
72
- readonly decorator: MatchDecorator;
73
- decorations: DecorationSet;
74
- constructor(view: EditorView) {
75
- this.decorator = linkDecorator();
76
- this.decorations = this.decorator.createDeco(view);
77
- }
78
-
79
- update(update: ViewUpdate) {
80
- if (update.docChanged || update.viewportChanged) {
81
- this.decorations = this.decorator.updateDeco(update, this.decorations);
82
- }
83
- }
84
- },
85
- {
86
- decorations: (view) => view.decorations,
87
- eventHandlers: {
88
- // TODO(burdon): CLick to expand link.
89
- // https://discuss.codemirror.net/t/decorator-iteration-on-click-event/4226/2
90
- mousedown: function (event, view) {
91
- const pos = view.posAtDOM(event.target as Node);
92
- if (pos !== 0) {
93
- console.log(this);
94
- }
95
- },
96
- // TODO(burdon): Hide when cursor moves away.
97
- keydown: (event, view) => {
98
- view.update([]);
99
- },
100
- },
101
- },
102
- );
103
- }
104
-
105
- export const hyperlinkStyle = EditorView.baseTheme({
106
- '.cm-hyperlink-label': {
107
- cursor: 'pointer',
108
- textDecoration: 'underline',
109
- },
110
- '.cm-hyperlink-bracket': {
111
- opacity: 0.2,
112
- },
113
- '.cm-hyperlink-url': {
114
- opacity: 0.5,
115
- fontFamily: 'monospace',
116
- },
117
- });
118
-
119
- export const hyperlinkWidget: Extension = [hyperLinkExtension(), hyperlinkStyle];
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export * from './hyperlinkDecoration';
6
- export * from './hyperlinkTooltip';
7
- export * from './hyperlinkWidget';
@@ -1,8 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export * from './basic';
6
- export * from './change';
7
- export * from './hyperlink';
8
- export * from './markdown';
@@ -1,99 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
6
- import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';
7
- import { markdownLanguage, markdown } from '@codemirror/lang-markdown';
8
- import {
9
- bracketMatching,
10
- defaultHighlightStyle,
11
- foldKeymap,
12
- indentOnInput,
13
- syntaxHighlighting,
14
- } from '@codemirror/language';
15
- import { languages } from '@codemirror/language-data';
16
- import { lintKeymap } from '@codemirror/lint';
17
- import { highlightSelectionMatches, searchKeymap } from '@codemirror/search';
18
- import { EditorState, type Extension } from '@codemirror/state';
19
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
20
- import {
21
- crosshairCursor,
22
- drawSelection,
23
- dropCursor,
24
- EditorView,
25
- highlightActiveLine,
26
- highlightActiveLineGutter,
27
- highlightSpecialChars,
28
- keymap,
29
- placeholder,
30
- rectangularSelection,
31
- } from '@codemirror/view';
32
- // import { GFM } from '@lezer/markdown';
33
-
34
- import type { ThemeMode } from '@dxos/react-ui';
35
-
36
- import { markdownTagsExtension } from './tags';
37
- import { markdownHighlightStyle } from './theme';
38
-
39
- export type MarkdownBundleOptions = {
40
- themeMode?: ThemeMode;
41
- placeholder?: string;
42
- };
43
-
44
- export const markdownBundle = ({ themeMode, placeholder: _placeholder }: MarkdownBundleOptions): Extension[] => {
45
- // All of https://github.com/codemirror/basic-setup minus line numbers and fold gutter.
46
- // https://codemirror.net/docs/ref/#codemirror.basicSetup
47
- return [
48
- bracketMatching(),
49
- closeBrackets(),
50
- _placeholder && placeholder(_placeholder),
51
-
52
- EditorState.allowMultipleSelections.of(true),
53
- EditorView.lineWrapping,
54
-
55
- // autocompletion(),
56
- crosshairCursor(),
57
- dropCursor(),
58
- drawSelection(),
59
- highlightActiveLine(),
60
- highlightActiveLineGutter(),
61
- highlightSelectionMatches(),
62
- highlightSpecialChars(),
63
- history(),
64
- indentOnInput(),
65
- rectangularSelection(),
66
-
67
- keymap.of([
68
- ...closeBracketsKeymap,
69
- // ...completionKeymap,
70
- ...defaultKeymap,
71
- ...foldKeymap,
72
- ...historyKeymap,
73
- ...lintKeymap,
74
- ...searchKeymap,
75
- indentWithTab,
76
- ]),
77
-
78
- // Main extension.
79
- // https://github.com/codemirror/lang-markdown
80
- markdown({
81
- base: markdownLanguage,
82
- codeLanguages: languages,
83
- extensions: [
84
- // TODO(burdon): This seems to upgrade the parser.
85
- // GitHub flavored markdown bundle: Table, TaskList, Strikethrough, and Autolink.
86
- // https://github.com/lezer-parser/markdown?tab=readme-ov-file#github-flavored-markdown
87
- // https://github.github.com/gfm
88
- // GFM,
89
-
90
- // Custom styling.
91
- markdownTagsExtension,
92
- ],
93
- }),
94
-
95
- // TODO(thure): All but one rule here apply to both themes; rename or refactor.
96
- syntaxHighlighting(markdownHighlightStyle),
97
- themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),
98
- ].filter(Boolean) as Extension[];
99
- };
@@ -1,38 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { styleTags, Tag } from '@lezer/highlight';
6
- import { type MarkdownConfig } from '@lezer/markdown';
7
-
8
- export const markdownTags = {
9
- headingMark: Tag.define(),
10
- quoteMark: Tag.define(),
11
- listMark: Tag.define(),
12
- linkMark: Tag.define(),
13
- emphasisMark: Tag.define(),
14
- codeMark: Tag.define(),
15
- codeText: Tag.define(),
16
- inlineCode: Tag.define(),
17
- url: Tag.define(),
18
- linkReference: Tag.define(),
19
- linkLabel: Tag.define(),
20
- };
21
-
22
- export const markdownTagsExtension: MarkdownConfig = {
23
- props: [
24
- styleTags({
25
- HeaderMark: markdownTags.headingMark,
26
- QuoteMark: markdownTags.quoteMark,
27
- ListMark: markdownTags.listMark,
28
- LinkMark: markdownTags.linkMark,
29
- EmphasisMark: markdownTags.emphasisMark,
30
- CodeMark: markdownTags.codeMark,
31
- CodeText: markdownTags.codeText,
32
- InlineCode: markdownTags.inlineCode,
33
- URL: markdownTags.url,
34
- LinkReference: markdownTags.linkReference,
35
- LinkLabel: markdownTags.linkLabel,
36
- }),
37
- ],
38
- };