@dxos/react-ui-editor 0.3.10 → 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 (141) hide show
  1. package/dist/lib/browser/index.mjs +1971 -1744
  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 +14 -10
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +3 -2
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  9. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  10. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  11. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  12. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  13. package/dist/types/src/extensions/code.d.ts.map +1 -0
  14. package/dist/types/src/extensions/comments.d.ts +48 -0
  15. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  16. package/dist/types/src/extensions/hr.d.ts +2 -0
  17. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  18. package/dist/types/src/extensions/image.d.ts.map +1 -0
  19. package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +3 -3
  20. package/dist/types/src/extensions/index.d.ts.map +1 -0
  21. package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
  22. package/dist/types/src/extensions/link.d.ts.map +1 -0
  23. package/dist/types/src/extensions/listener.d.ts +10 -0
  24. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  25. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  26. package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -1
  27. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  28. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  29. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  30. package/dist/types/src/extensions/mermaid.d.ts +3 -0
  31. package/dist/types/src/extensions/mermaid.d.ts.map +1 -0
  32. package/dist/types/src/extensions/table.d.ts.map +1 -0
  33. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  34. package/dist/types/src/{components/TextEditor/extensions/demo.d.ts → extensions/typewriter.d.ts} +2 -3
  35. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  36. package/dist/types/src/extensions/util.d.ts +5 -0
  37. package/dist/types/src/extensions/util.d.ts.map +1 -0
  38. package/dist/types/src/hooks/automerge/automerge.stories.d.ts +2 -3
  39. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -1
  40. package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -1
  41. package/dist/types/src/hooks/automerge/{PatchSemaphore.d.ts → semaphore.d.ts} +1 -1
  42. package/dist/types/src/hooks/automerge/semaphore.d.ts.map +1 -0
  43. package/dist/types/src/hooks/automerge/update-automerge.d.ts +6 -0
  44. package/dist/types/src/hooks/automerge/update-automerge.d.ts.map +1 -0
  45. package/dist/types/src/hooks/automerge/update-codemirror.d.ts +5 -0
  46. package/dist/types/src/hooks/automerge/update-codemirror.d.ts.map +1 -0
  47. package/dist/types/src/hooks/useTextModel.d.ts +14 -6
  48. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  49. package/dist/types/src/hooks/yjs/yjs.test.d.ts +2 -0
  50. package/dist/types/src/hooks/yjs/yjs.test.d.ts.map +1 -0
  51. package/dist/types/src/index.d.ts +3 -0
  52. package/dist/types/src/index.d.ts.map +1 -1
  53. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  54. package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +5 -13
  55. package/dist/types/src/themes/default.d.ts.map +1 -0
  56. package/dist/types/src/themes/index.d.ts.map +1 -0
  57. package/package.json +24 -20
  58. package/src/components/TextEditor/MarkdownEditor.stories.tsx +130 -71
  59. package/src/components/TextEditor/TextEditor.stories.tsx +2 -2
  60. package/src/components/TextEditor/TextEditor.tsx +29 -25
  61. package/src/components/TextEditor/index.ts +0 -3
  62. package/src/{components/TextEditor/extensions → extensions}/code.ts +13 -13
  63. package/src/extensions/comments.ts +391 -0
  64. package/src/extensions/hr.ts +74 -0
  65. package/src/{components/TextEditor/extensions → extensions}/image.ts +3 -1
  66. package/src/{components/TextEditor/extensions → extensions}/index.ts +3 -3
  67. package/src/{components/TextEditor/extensions → extensions}/link.ts +66 -10
  68. package/src/extensions/listener.ts +35 -0
  69. package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +6 -9
  70. package/src/extensions/mermaid.ts +11 -0
  71. package/src/{components/TextEditor/extensions → extensions}/table.ts +14 -1
  72. package/src/{components/TextEditor/extensions/demo.ts → extensions/typewriter.ts} +2 -3
  73. package/src/extensions/util.ts +18 -0
  74. package/src/hooks/automerge/automerge.stories.tsx +2 -3
  75. package/src/hooks/automerge/plugin.ts +1 -1
  76. package/src/hooks/automerge/{PatchSemaphore.ts → semaphore.ts} +4 -3
  77. package/src/hooks/automerge/{translation/codemirror-to-automerge.ts → update-automerge.ts} +3 -3
  78. package/src/hooks/automerge/{translation/automerge-to-codemirror.ts → update-codemirror.ts} +2 -7
  79. package/src/hooks/useTextModel.ts +60 -22
  80. package/src/hooks/yjs/yjs.test.ts +59 -0
  81. package/src/index.ts +3 -0
  82. package/src/testing/replicator.ts +0 -1
  83. package/src/{components/TextEditor/themes → themes}/default.ts +61 -38
  84. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
  85. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
  86. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  87. package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
  88. package/dist/types/src/components/TextEditor/extensions/comments.d.ts +0 -18
  89. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
  90. package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +0 -1
  91. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts +0 -10
  92. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +0 -1
  93. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts +0 -24
  94. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts.map +0 -1
  95. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  96. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  97. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
  98. package/dist/types/src/components/TextEditor/extensions/listener.d.ts +0 -9
  99. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
  100. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  101. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
  102. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  103. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  104. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  105. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
  106. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
  107. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
  108. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
  109. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
  110. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +0 -1
  111. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts +0 -5
  112. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts.map +0 -1
  113. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts +0 -6
  114. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts.map +0 -1
  115. package/dist/types/src/hooks/automerge/translation/index.d.ts +0 -3
  116. package/dist/types/src/hooks/automerge/translation/index.d.ts.map +0 -1
  117. package/src/components/TextEditor/extensions/comments.ts +0 -173
  118. package/src/components/TextEditor/extensions/experimental.tsx +0 -114
  119. package/src/components/TextEditor/extensions/highlight.ts +0 -128
  120. package/src/components/TextEditor/extensions/listener.ts +0 -23
  121. package/src/components/TextEditor/extensions/tooltip.tsx +0 -61
  122. package/src/hooks/automerge/translation/index.ts +0 -6
  123. /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
  124. /package/dist/types/src/{components/TextEditor/extensions → extensions}/basic.d.ts +0 -0
  125. /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
  126. /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
  127. /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
  128. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +0 -0
  129. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
  130. /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
  131. /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
  132. /package/dist/types/src/{components/TextEditor/extensions → extensions}/tasklist.d.ts +0 -0
  133. /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
  134. /package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +0 -0
  135. /package/src/{components/TextEditor/extensions → extensions}/basic.ts +0 -0
  136. /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
  137. /package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +0 -0
  138. /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
  139. /package/src/{components/TextEditor/extensions → extensions}/mention.ts +0 -0
  140. /package/src/{components/TextEditor/extensions → extensions}/tasklist.ts +0 -0
  141. /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
@@ -3,9 +3,11 @@
3
3
  //
4
4
 
5
5
  import get from 'lodash.get';
6
- import { type StyleSpec } from 'style-mod';
7
6
 
8
- import { tokens } from '../../../styles';
7
+ import { type ThemeStyles, tokens } from '../styles';
8
+
9
+ // TODO(burdon): Can we erase All of the default CM styles?
10
+ // TODO(burdon): Theme styles seem to be added multiple times?
9
11
 
10
12
  /**
11
13
  * Minimal styles.
@@ -18,19 +20,31 @@ import { tokens } from '../../../styles';
18
20
  * NOTE: Use one of '&', '&light', and '&dark' prefix to scope instance.
19
21
  * NOTE: `light` and `dark` selectors are preprocessed by CodeMirror and can only be in the base theme.
20
22
  */
21
- export const defaultTheme: {
22
- [selector: string]: StyleSpec;
23
- } = {
23
+ export const defaultTheme: ThemeStyles = {
24
24
  //
25
25
  // Main layout:
26
- // <div class=".cm-editor .cm-focused">
27
- // <div class=".cm-scroller">
28
- // <div class=".cm-content" role="textbox" contenteditable="true">
29
- // <div class=".cm-line" />
26
+ // https://codemirror.net/examples/styling
27
+ //
28
+ // <div class="cm-editor [cm-focused] [generated classes]">
29
+ // <div class="cm-scroller">
30
+ // <div class="cm-gutters">
31
+ // <div class="cm-gutter [...]">
32
+ // <div class="cm-gutterElement">...</div>
33
+ // </div>
34
+ // </div>
35
+ // <div class="cm-content" role="textbox" contenteditable="true">
36
+ // <div class="cm-line"></div>
37
+ // </div>
38
+ // <div class="cm-selectionLayer">
39
+ // <div class="cm-selectionBackground"></div>
40
+ // </div>
41
+ // <div class="cm-cursorLayer">
42
+ // <div class="cm-cursor"></div>
30
43
  // </div>
31
44
  // </div>
32
45
  // </div>
33
46
  //
47
+
34
48
  '&': {},
35
49
  '&.cm-focused': {
36
50
  outline: 'none',
@@ -39,9 +53,10 @@ export const defaultTheme: {
39
53
  overflow: 'visible',
40
54
  fontFamily: get(tokens, 'fontFamily.mono', []).join(','),
41
55
  },
56
+
42
57
  '& .cm-content': {
43
58
  padding: 0,
44
- // Base font size (otherwise defined by HTML tag, which might be different for storybook).
59
+ // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
45
60
  fontSize: '16px',
46
61
  },
47
62
  '&light .cm-content': {
@@ -72,31 +87,41 @@ export const defaultTheme: {
72
87
  '& .cm-line': {
73
88
  paddingInline: 0,
74
89
  },
75
- '& .cm-line *': {},
76
90
  '& .cm-activeLine': {
77
- backgroundColor: 'transparent',
91
+ background: 'inherit',
78
92
  },
79
93
 
80
94
  //
81
- // selection
95
+ // Selection
82
96
  //
83
97
 
84
- '&light .cm-selectionBackground, &light.cm-focused .cm-selectionBackground': {
85
- background: get(tokens, 'extend.colors.primary.150', '#00ffff'),
98
+ '&light .cm-selectionBackground': {
99
+ background: get(tokens, 'extend.colors.primary.100'),
86
100
  },
87
- '&dark .cm-selectionBackground, &dark.cm-focused .cm-selectionBackground': {
88
- background: get(tokens, 'extend.colors.primary.850', '#00ffff'),
101
+ '&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {
102
+ background: get(tokens, 'extend.colors.primary.200'),
89
103
  },
90
- '&light .cm-selectionMatch': {
91
- background: get(tokens, 'extend.colors.primary.250', '#00ffff') + '44',
104
+ '&dark .cm-selectionBackground': {
105
+ background: get(tokens, 'extend.colors.primary.700'),
92
106
  },
93
- '&dark .cm-selectionMatch': {
94
- background: get(tokens, 'extend.colors.primary.600', '#00ffff') + '44',
107
+ '&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {
108
+ background: get(tokens, 'extend.colors.primary.600'),
109
+ },
110
+
111
+ //
112
+ // Search
113
+ //
114
+
115
+ '&light .cm-searchMatch': {
116
+ backgroundColor: get(tokens, 'extend.colors.yellow.100'),
117
+ },
118
+ '&dark .cm-searchMatch': {
119
+ backgroundColor: get(tokens, 'extend.colors.yellow.700'),
95
120
  },
96
121
 
97
122
  //
98
123
  // collaboration
99
- // TODO(burdon): Review classnames (YJS dependent?)
124
+ // TODO(burdon): Review classnames (YJS dependent?) Note: e2e tests depend on this class.
100
125
  //
101
126
 
102
127
  '&light .cm-ySelection, &light .cm-yLineSelection': {
@@ -211,6 +236,7 @@ export const defaultTheme: {
211
236
 
212
237
  /**
213
238
  * Panels
239
+ * TODO(burdon): Needs styling attention (esp. dark mode).
214
240
  * https://github.com/codemirror/search/blob/main/src/search.ts#L745
215
241
  *
216
242
  * Find/replace panel.
@@ -226,7 +252,6 @@ export const defaultTheme: {
226
252
  */
227
253
  '& .cm-panels': {
228
254
  border: `1px solid ${get(tokens, 'extend.colors.neutral.200')}`,
229
- borderBottom: 'none',
230
255
  },
231
256
  '& .cm-panel': {
232
257
  background: get(tokens, 'extend.colors.neutral.50'),
@@ -236,20 +261,22 @@ export const defaultTheme: {
236
261
  margin: '4px',
237
262
  fontFamily: get(tokens, 'fontFamily.body', []).join(','),
238
263
  background: get(tokens, 'extend.colors.neutral.100'),
264
+ backgroundImage: 'none',
239
265
  border: 'none',
266
+ '&:hover': {
267
+ background: get(tokens, 'extend.colors.neutral.200'),
268
+ },
269
+ '&:active': {
270
+ background: get(tokens, 'extend.colors.neutral.300'),
271
+ backgroundImage: 'none',
272
+ },
240
273
  },
241
-
242
- '& .cm-searchMatch': {
243
- backgroundColor: get(tokens, 'extend.colors.yellow.100'),
244
- },
245
- '& .cm-searchMatch.cm-searchMatch-selected': {
246
- backgroundColor: get(tokens, 'extend.colors.primary.100'),
274
+ '& .cm-panel input[type=checkbox]': {
275
+ marginRight: '0.4rem !important',
247
276
  },
248
277
  };
249
278
 
250
- export const textTheme: {
251
- [selector: string]: StyleSpec;
252
- } = {
279
+ export const textTheme: ThemeStyles = {
253
280
  '& .cm-scroller': {
254
281
  fontFamily: get(tokens, 'fontFamily.body', []).join(','),
255
282
  },
@@ -258,18 +285,14 @@ export const textTheme: {
258
285
  },
259
286
  };
260
287
 
261
- export const markdownTheme: {
262
- [selector: string]: StyleSpec;
263
- } = {
288
+ export const markdownTheme: ThemeStyles = {
264
289
  // NOTE: Must leave base font family as is (i.e., monospace) due to fenced code blocks.
265
290
  '& .cm-placeholder': {
266
291
  fontFamily: get(tokens, 'fontFamily.body', []).join(','),
267
292
  },
268
293
  };
269
294
 
270
- export const codeTheme: {
271
- [selector: string]: StyleSpec;
272
- } = {
295
+ export const codeTheme: ThemeStyles = {
273
296
  '& .cm-scroller': {
274
297
  fontFamily: get(tokens, 'fontFamily.mono', []).join(','),
275
298
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/autocomplete.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;CAC1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,iBAAkB,mBAAmB,4CAgC7D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/basic.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,WAAW,uDAAwD,kBAAkB,KAAG,SAAS,EAa5E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"blast.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/blast.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMnD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,gBAAgB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,qBAAqB,EAAE;QAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACpE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAU5B,CAAC;AAEF,eAAO,MAAM,KAAK,aAAa,QAAQ,YAAY,CAAC,KAAoB,SAmEvE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/code.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,IAAI,+CA+ChB,CAAC"}
@@ -1,18 +0,0 @@
1
- import { type Extension } from '@codemirror/state';
2
- import { type Rect } from '@codemirror/view';
3
- type CommentsInfo = {
4
- active?: string;
5
- items?: {
6
- id: string;
7
- pos: number;
8
- location: Rect | null;
9
- }[];
10
- };
11
- export type CommentsOptions = {
12
- key?: string;
13
- onCreate?: (from: number, to: number) => string | void;
14
- onUpdate?: (info: CommentsInfo) => void;
15
- };
16
- export declare const comments: (options?: CommentsOptions) => Extension;
17
- export {};
18
- //# sourceMappingURL=comments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/comments.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAGL,KAAK,IAAI,EAOV,MAAM,kBAAkB,CAAC;AAqC1B,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CACzC,CAAC;AAKF,eAAO,MAAM,QAAQ,aAAa,eAAe,KAAQ,SA0GxD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/demo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,IAAI,sBAA0C,WAAW,KAAQ,SAgD7E,CAAC"}
@@ -1,10 +0,0 @@
1
- import { type Extension } from '@codemirror/state';
2
- import { type DecorationSet, MatchDecorator, ViewPlugin, type ViewUpdate } from '@codemirror/view';
3
- export declare const styles: Extension;
4
- export declare function hyperLinkExtension(): ViewPlugin<{
5
- readonly decorator: MatchDecorator;
6
- decorations: DecorationSet;
7
- update(update: ViewUpdate): void;
8
- }>;
9
- export declare const hyperlinkWidget: Extension;
10
- //# sourceMappingURL=experimental.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"experimental.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/experimental.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAEL,KAAK,aAAa,EAElB,cAAc,EACd,UAAU,EACV,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAG1B,eAAO,MAAM,MAAM,WAYjB,CAAC;AAiDH,wBAAgB,kBAAkB;wBAGR,cAAc;;mBAOnB,UAAU;GAwB9B;AAED,eAAO,MAAM,eAAe,EAAE,SAA0C,CAAC"}
@@ -1,24 +0,0 @@
1
- import { type Extension, StateField } from '@codemirror/state';
2
- import { EditorView } from '@codemirror/view';
3
- import { type DocumentRange } from '../../../hooks';
4
- type HighlightRange = DocumentRange & {
5
- active?: boolean;
6
- };
7
- /**
8
- * Update field set.
9
- */
10
- export declare const useHighlights: (view: EditorView | undefined, ranges?: HighlightRange[]) => void;
11
- /**
12
- * State field that tracks highlight ranges.
13
- */
14
- export declare const highlightStateField: StateField<HighlightRange[]>;
15
- /**
16
- * Decorate ranges.
17
- */
18
- export declare const highlightDecorations: Extension;
19
- export type HighlightOptions = {
20
- onChange?: (active?: string) => {};
21
- };
22
- export declare const highlight: (options?: HighlightOptions) => Extension;
23
- export {};
24
- //# sourceMappingURL=highlight.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/highlight.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAc,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI1D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAsBpD,KAAK,cAAc,GAAG,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAK3D;;GAEG;AAEH,eAAO,MAAM,aAAa,SAAU,UAAU,GAAG,SAAS,WAAU,cAAc,EAAE,SAMnF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,8BAW9B,CAAC;AAEH;;GAEG;AAEH,eAAO,MAAM,oBAAoB,WAiB/B,CAAC;AAoCH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,EAAE,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,SAAS,aAAa,gBAAgB,KAAQ,SAE1D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/image.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,SAAS,EAKf,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,YAAY,GAAG,EAAE,CAAC;AAE9B,eAAO,MAAM,KAAK,aAAa,YAAY,KAAQ,SAMlD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/link.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,SAAS,EAKf,MAAM,mBAAmB,CAAC;AAO3B,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,aAAa,WAAW,KAAQ,SAMhD,CAAC"}
@@ -1,9 +0,0 @@
1
- import { StateField } from '@codemirror/state';
2
- export type ListenerOptions = {
3
- onChange: (text: string) => void;
4
- };
5
- /**
6
- * Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799
7
- */
8
- export declare const listener: ({ onChange }: ListenerOptions) => StateField<null>;
9
- //# sourceMappingURL=listener.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/listener.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,QAAQ,iBAAkB,eAAe,qBAWrD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/TextEditor/extensions/markdown/bundle.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAYhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,wDAIxB,qBAAqB,KAAG,SAAS,EA6CnC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/TextEditor/extensions/markdown/highlight.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAmB,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAAS,MAAM,iBAAiB,CAAC;AAmB7D;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;CAgBxB,CAAC;AAaF,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAKlD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,cAAe,OAAO,mBAgIxD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/TextEditor/extensions/markdown/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/mention.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,OAAO,iBAAkB,cAAc,KAAG,SAmBtD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/table.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,QAAQ,EAAmB,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAMnH,MAAM,MAAM,YAAY,GAAG,EAAE,CAAC;AAE9B;;;GAGG;AACH,eAAO,MAAM,KAAK,aAAa,YAAY,8BAM1C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasklist.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/tasklist.ts"],"names":[],"mappings":"AA+DA,MAAM,MAAM,eAAe,GAAG,EAAE,CAAC;AAEjC,eAAO,MAAM,QAAQ,aAAa,eAAe,4CAuDhD,CAAC"}
@@ -1,12 +0,0 @@
1
- import { type Extension } from '@codemirror/state';
2
- export type TooltipOptions = {
3
- onHover: (el: Element, url: string) => void;
4
- regexp?: RegExp;
5
- };
6
- /**
7
- * https://codemirror.net/examples/tooltip
8
- * https://codemirror.net/docs/ref/#view.hoverTooltip
9
- * https://github.com/codemirror/view/blob/main/src/tooltip.ts
10
- */
11
- export declare const tooltip: ({ onHover, regexp }: TooltipOptions) => Extension;
12
- //# sourceMappingURL=tooltip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/tooltip.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,wBAA8C,cAAc,KAAG,SAuC/E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/themes/default.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE;IACzB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAkO/B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAQ/B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAM/B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAQ/B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/themes/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PatchSemaphore.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/automerge/PatchSemaphore.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,KAAK,EAA8E,MAAM,UAAU,CAAC;AAGlH,KAAK,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/B,KAAK,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;AAE7B,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,SAAS,CAAC;AAE3F;;GAEG;AACH,qBAAa,cAAc;IACzB,MAAM,EAAG,KAAK,CAAC;IACf,YAAY,UAAS;IACrB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAM;gBAEjB,KAAK,CAAC,EAAE,KAAK;IAMzB,SAAS,WAAY,UAAU,QAAQ,UAAU,UA0C/C;CACH"}
@@ -1,5 +0,0 @@
1
- import { type EditorSelection } from '@codemirror/state';
2
- import { type EditorView } from '@codemirror/view';
3
- import { type Patch, type Prop } from '@dxos/automerge/automerge';
4
- export declare const automergeToCodemirror: (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => void;
5
- //# sourceMappingURL=automerge-to-codemirror.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"automerge-to-codemirror.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/automerge/translation/automerge-to-codemirror.ts"],"names":[],"mappings":"AAMA,OAAO,EAA8B,KAAK,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,IAAI,EAGV,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,qBAAqB,SAC1B,UAAU,aACL,eAAe,UAClB,IAAI,EAAE,WACL,KAAK,EAAE,SAkBjB,CAAC"}
@@ -1,6 +0,0 @@
1
- import { type EditorState, type Transaction } from '@codemirror/state';
2
- import { type Heads } from '@dxos/automerge/automerge';
3
- import { type IDocHandle } from '../handle';
4
- import { type Field } from '../plugin';
5
- export declare const codemirrorToAutomerge: (field: Field, handle: IDocHandle, transactions: Transaction[], state: EditorState) => Heads | undefined;
6
- //# sourceMappingURL=codemirror-to-automerge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codemirror-to-automerge.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/automerge/translation/codemirror-to-automerge.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAa,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElF,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,eAAO,MAAM,qBAAqB,yBAExB,UAAU,gBACJ,WAAW,EAAE,SACpB,WAAW,KACjB,KAAK,GAAG,SAyBV,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from './automerge-to-codemirror';
2
- export * from './codemirror-to-automerge';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/automerge/translation/index.ts"],"names":[],"mappings":"AAIA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
@@ -1,173 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { type Extension } from '@codemirror/state';
6
- import {
7
- keymap,
8
- type DecorationSet,
9
- type Rect,
10
- type ViewUpdate,
11
- Decoration,
12
- EditorView,
13
- MatchDecorator,
14
- ViewPlugin,
15
- WidgetType,
16
- } from '@codemirror/view';
17
-
18
- import { debounce } from '@dxos/async';
19
- import { invariant } from '@dxos/invariant';
20
-
21
- // TODO(burdon): Reconcile with theme.
22
- const styles = EditorView.baseTheme({
23
- '& .cm-bookmark': {
24
- cursor: 'pointer',
25
- margin: '4px',
26
- padding: '4px',
27
- backgroundColor: 'yellow',
28
- },
29
- '& .cm-bookmark-selected': {
30
- backgroundColor: 'orange',
31
- },
32
- });
33
-
34
- class BookmarkWidget extends WidgetType {
35
- constructor(private readonly _pos: number, private readonly _id: string, private readonly _handleClick: () => void) {
36
- super();
37
- invariant(this._id);
38
- }
39
-
40
- override eq(other: BookmarkWidget) {
41
- return this._id === other._id;
42
- }
43
-
44
- override toDOM() {
45
- const span = document.createElement('span');
46
- span.className = 'cm-bookmark';
47
- span.textContent = '§';
48
- span.onclick = () => this._handleClick();
49
- return span;
50
- }
51
- }
52
-
53
- type CommentsInfo = {
54
- active?: string;
55
- items?: { id: string; pos: number; location: Rect | null }[];
56
- };
57
-
58
- export type CommentsOptions = {
59
- key?: string;
60
- onCreate?: (from: number, to: number) => string | void;
61
- onUpdate?: (info: CommentsInfo) => void;
62
- };
63
-
64
- // https://www.markdownguide.org/extended-syntax/#footnotes
65
- // TODO(burdon): Record span in automerge model?
66
- // TODO(burdon): Extended markdown: https://www.markdownguide.org/extended-syntax
67
- export const comments = (options: CommentsOptions = {}): Extension => {
68
- let active: string | undefined;
69
-
70
- const bookmarkMatcher = new MatchDecorator({
71
- regexp: /\[\^(\w+)\]/g,
72
- decoration: (match, view, pos) => {
73
- const id = match[1];
74
- return Decoration.replace({
75
- id,
76
- widget: new BookmarkWidget(pos, id, () => handleUpdate({ active: id })),
77
- });
78
- },
79
- });
80
-
81
- const bookmarks = ViewPlugin.fromClass(
82
- class {
83
- bookmarks: DecorationSet;
84
- constructor(view: EditorView) {
85
- this.bookmarks = bookmarkMatcher.createDeco(view);
86
- }
87
-
88
- update(update: ViewUpdate) {
89
- this.bookmarks = bookmarkMatcher.updateDeco(update, this.bookmarks);
90
- }
91
- },
92
- {
93
- decorations: (instance) => instance.bookmarks,
94
- provide: (plugin) =>
95
- EditorView.atomicRanges.of((view) => {
96
- return view.plugin(plugin)?.bookmarks || Decoration.none;
97
- }),
98
- },
99
- );
100
-
101
- const handleUpdate = debounce((data: CommentsInfo) => {
102
- options.onUpdate?.(data);
103
- }, 200);
104
-
105
- return [
106
- keymap.of([
107
- {
108
- key: options?.key ?? 'shift-meta-c',
109
- run: (view) => {
110
- // Insert footnote.
111
- const { from, to, head } = view.state.selection.main;
112
- const id = options.onCreate?.(from, to);
113
- if (id) {
114
- const tag = `[^${id}]`;
115
- // TODO(burdon): Add selection.
116
- view.dispatch({
117
- changes: { from: head, insert: tag },
118
- selection: { anchor: head + tag.length },
119
- });
120
-
121
- return true;
122
- }
123
-
124
- return false;
125
- },
126
- },
127
- ]),
128
-
129
- bookmarks,
130
-
131
- // Monitor cursor movement.
132
- EditorView.updateListener.of((update) => {
133
- active = undefined;
134
- if (!options.onUpdate) {
135
- return;
136
- }
137
-
138
- const { view, state } = update;
139
- const pos = state.selection.main.head;
140
-
141
- const decorations: { from: number; to: number; value: Decoration }[] = [];
142
- const rangeSet = view.plugin(bookmarks)?.bookmarks;
143
- let closest = Infinity;
144
- // TODO(burdon): Handle multiple visible ranges in large documents.
145
- const { from, to } = /* view.visibleRanges?.[0] ?? */ { from: 0, to: state.doc.length };
146
- rangeSet?.between(from, to, (from, to, value) => {
147
- decorations.push({ from, to, value });
148
- const d = Math.min(Math.abs(pos - from), Math.abs(pos - to));
149
- if (d < closest) {
150
- // TODO(burdon): Update class of selected.
151
- active = value.spec.id;
152
- closest = d;
153
- }
154
- });
155
-
156
- if (decorations.length) {
157
- handleUpdate({
158
- active,
159
- items: decorations.map(
160
- ({
161
- from,
162
- value: {
163
- spec: { id },
164
- },
165
- }) => ({ id: id as string, pos: from, location: view.coordsAtPos(from) }),
166
- ),
167
- });
168
- }
169
- }),
170
-
171
- styles,
172
- ];
173
- };