mossmd 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +21 -0
  3. package/README.md +336 -0
  4. package/dist/collab/index.d.ts +14 -0
  5. package/dist/collab/index.d.ts.map +1 -0
  6. package/dist/collab/index.js +6 -0
  7. package/dist/collab/index.js.map +1 -0
  8. package/dist/core/code-languages.d.ts +3 -0
  9. package/dist/core/code-languages.d.ts.map +1 -0
  10. package/dist/core/code-languages.js +130 -0
  11. package/dist/core/code-languages.js.map +1 -0
  12. package/dist/core/decoration-utils.d.ts +4 -0
  13. package/dist/core/decoration-utils.d.ts.map +1 -0
  14. package/dist/core/decoration-utils.js +25 -0
  15. package/dist/core/decoration-utils.js.map +1 -0
  16. package/dist/core/edit-helpers.d.ts +13 -0
  17. package/dist/core/edit-helpers.d.ts.map +1 -0
  18. package/dist/core/edit-helpers.js +318 -0
  19. package/dist/core/edit-helpers.js.map +1 -0
  20. package/dist/core/icons.d.ts +16 -0
  21. package/dist/core/icons.d.ts.map +1 -0
  22. package/dist/core/icons.js +86 -0
  23. package/dist/core/icons.js.map +1 -0
  24. package/dist/core/inline-preview.d.ts +32 -0
  25. package/dist/core/inline-preview.d.ts.map +1 -0
  26. package/dist/core/inline-preview.js +925 -0
  27. package/dist/core/inline-preview.js.map +1 -0
  28. package/dist/core/list-editing.d.ts +10 -0
  29. package/dist/core/list-editing.d.ts.map +1 -0
  30. package/dist/core/list-editing.js +244 -0
  31. package/dist/core/list-editing.js.map +1 -0
  32. package/dist/core/list-model.d.ts +40 -0
  33. package/dist/core/list-model.d.ts.map +1 -0
  34. package/dist/core/list-model.js +114 -0
  35. package/dist/core/list-model.js.map +1 -0
  36. package/dist/core/list-navigation.d.ts +3 -0
  37. package/dist/core/list-navigation.d.ts.map +1 -0
  38. package/dist/core/list-navigation.js +234 -0
  39. package/dist/core/list-navigation.js.map +1 -0
  40. package/dist/core/markdown-context.d.ts +3 -0
  41. package/dist/core/markdown-context.d.ts.map +1 -0
  42. package/dist/core/markdown-context.js +10 -0
  43. package/dist/core/markdown-context.js.map +1 -0
  44. package/dist/core/preview-activity.d.ts +18 -0
  45. package/dist/core/preview-activity.d.ts.map +1 -0
  46. package/dist/core/preview-activity.js +199 -0
  47. package/dist/core/preview-activity.js.map +1 -0
  48. package/dist/core/preview-widgets.d.ts +65 -0
  49. package/dist/core/preview-widgets.d.ts.map +1 -0
  50. package/dist/core/preview-widgets.js +359 -0
  51. package/dist/core/preview-widgets.js.map +1 -0
  52. package/dist/core/read-only.d.ts +26 -0
  53. package/dist/core/read-only.d.ts.map +1 -0
  54. package/dist/core/read-only.js +49 -0
  55. package/dist/core/read-only.js.map +1 -0
  56. package/dist/core/tree-progress.d.ts +29 -0
  57. package/dist/core/tree-progress.d.ts.map +1 -0
  58. package/dist/core/tree-progress.js +143 -0
  59. package/dist/core/tree-progress.js.map +1 -0
  60. package/dist/editor.d.ts +219 -0
  61. package/dist/editor.d.ts.map +1 -0
  62. package/dist/editor.js +551 -0
  63. package/dist/editor.js.map +1 -0
  64. package/dist/features/callout/index.d.ts +9 -0
  65. package/dist/features/callout/index.d.ts.map +1 -0
  66. package/dist/features/callout/index.js +223 -0
  67. package/dist/features/callout/index.js.map +1 -0
  68. package/dist/features/file-blocks/index.d.ts +12 -0
  69. package/dist/features/file-blocks/index.d.ts.map +1 -0
  70. package/dist/features/file-blocks/index.js +397 -0
  71. package/dist/features/file-blocks/index.js.map +1 -0
  72. package/dist/features/image/index.d.ts +28 -0
  73. package/dist/features/image/index.d.ts.map +1 -0
  74. package/dist/features/image/index.js +699 -0
  75. package/dist/features/image/index.js.map +1 -0
  76. package/dist/features/index.d.ts +17 -0
  77. package/dist/features/index.d.ts.map +1 -0
  78. package/dist/features/index.js +9 -0
  79. package/dist/features/index.js.map +1 -0
  80. package/dist/features/search/index.d.ts +4 -0
  81. package/dist/features/search/index.d.ts.map +1 -0
  82. package/dist/features/search/index.js +131 -0
  83. package/dist/features/search/index.js.map +1 -0
  84. package/dist/features/slash-commands/index.d.ts +52 -0
  85. package/dist/features/slash-commands/index.d.ts.map +1 -0
  86. package/dist/features/slash-commands/index.js +422 -0
  87. package/dist/features/slash-commands/index.js.map +1 -0
  88. package/dist/features/table/index.d.ts +44 -0
  89. package/dist/features/table/index.d.ts.map +1 -0
  90. package/dist/features/table/index.js +1262 -0
  91. package/dist/features/table/index.js.map +1 -0
  92. package/dist/features/upload/index.d.ts +80 -0
  93. package/dist/features/upload/index.d.ts.map +1 -0
  94. package/dist/features/upload/index.js +790 -0
  95. package/dist/features/upload/index.js.map +1 -0
  96. package/dist/features/wiki-links/index.d.ts +27 -0
  97. package/dist/features/wiki-links/index.d.ts.map +1 -0
  98. package/dist/features/wiki-links/index.js +577 -0
  99. package/dist/features/wiki-links/index.js.map +1 -0
  100. package/dist/index.d.ts +17 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +12 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/styles/content.css +247 -0
  105. package/dist/styles/inline-preview.css +2116 -0
  106. package/dist/styles/tokens.css +234 -0
  107. package/dist/syntax/highlight.d.ts +10 -0
  108. package/dist/syntax/highlight.d.ts.map +1 -0
  109. package/dist/syntax/highlight.js +75 -0
  110. package/dist/syntax/highlight.js.map +1 -0
  111. package/dist/syntax/index.d.ts +16 -0
  112. package/dist/syntax/index.d.ts.map +1 -0
  113. package/dist/syntax/index.js +29 -0
  114. package/dist/syntax/index.js.map +1 -0
  115. package/dist/theme/index.d.ts +6 -0
  116. package/dist/theme/index.d.ts.map +1 -0
  117. package/dist/theme/index.js +204 -0
  118. package/dist/theme/index.js.map +1 -0
  119. package/package.json +237 -0
package/dist/editor.js ADDED
@@ -0,0 +1,551 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { Decoration, EditorView, drawSelection, dropCursor, highlightActiveLine, highlightSpecialChars, keymap, rectangularSelection, } from '@codemirror/view';
4
+ import { Compartment, EditorState, StateEffect, StateField, Transaction, } from '@codemirror/state';
5
+ import { indentOnInput, indentUnit, } from '@codemirror/language';
6
+ import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
7
+ import { defaultKeymap, history, historyKeymap, indentWithTab, redo, undo, } from '@codemirror/commands';
8
+ import { markdown, markdownKeymap, markdownLanguage } from '@codemirror/lang-markdown';
9
+ import { SearchQuery, closeSearchPanel, openSearchPanel, searchKeymap, searchPanelOpen, setSearchQuery, } from '@codemirror/search';
10
+ import { mossTheme, mossSyntax } from './theme';
11
+ import { autoCloseCodeFence, extendEmphasisPair, imeCompositionGuard, normalizeDigitPunctuation, startAsteriskList, } from './core/edit-helpers';
12
+ import { mossImages, } from './features/image';
13
+ import { mossFileBlocks, } from './features/file-blocks';
14
+ import { highlightMarkdown } from './syntax/highlight';
15
+ import { inlinePreview } from './core/inline-preview';
16
+ import { readOnlyExtension } from './core/read-only';
17
+ import { mossTables } from './features/table';
18
+ import { wikiLinks, } from './features/wiki-links';
19
+ import { mossSlashCommands, } from './features/slash-commands';
20
+ import { noopCollabAdapter } from './collab';
21
+ import { registerMossSyntax } from './syntax';
22
+ import { mossSearch, } from './features/search';
23
+ import { mossFileUpload, } from './features/upload';
24
+ // Stable references so consumers that don't pass `codeLanguages` or
25
+ // `extensions` don't force-remount the editor on every render.
26
+ const EMPTY_CODE_LANGUAGES = [];
27
+ const EMPTY_EXTENSIONS = [];
28
+ function defaultOpenLink(url) {
29
+ try {
30
+ window.open(url, '_blank', 'noopener,noreferrer');
31
+ }
32
+ catch {
33
+ // window.open can throw in sandboxed iframes etc.
34
+ }
35
+ }
36
+ /**
37
+ * React wrapper around a CodeMirror 6 editor configured for markdown
38
+ * editing with Obsidian-style inline live preview.
39
+ *
40
+ * Remember to import the accompanying CSS:
41
+ *
42
+ * ```ts
43
+ * import 'mossmd/editor.css';
44
+ * ```
45
+ */
46
+ export function MossMD({ markdownSource, documentId, initialSearchText, searchPanelPosition = 'top', initialRevealText, blurEditorOnMount, readOnly = false, onMarkdownChange, onCompositionChange, onLinkClick, editorHandleRef, codeLanguages = EMPTY_CODE_LANGUAGES, extensions = EMPTY_EXTENSIONS, customSyntax = [], inlinePreviewConfig = {}, icons = {}, imagesConfig = {}, fileBlocksConfig = {}, tablesConfig = {}, wikiLinksConfig = {}, slashCommandsConfig, fileUpload, collabAdapter = noopCollabAdapter, }) {
47
+ const rootRef = useRef(null);
48
+ const viewRef = useRef(null);
49
+ const clearRevealTimerRef = useRef(null);
50
+ const onMarkdownChangeRef = useRef(onMarkdownChange);
51
+ const onCompositionChangeRef = useRef(onCompositionChange);
52
+ const onLinkClickRef = useRef(onLinkClick);
53
+ const collabAdapterRef = useRef(noopCollabAdapter);
54
+ const collabUnsubscribeRef = useRef(null);
55
+ const collabGenerationRef = useRef(0);
56
+ // The editor extensions are captured at mount, but the callback prop
57
+ // may change later. Route through the ref while preserving the
58
+ // documented window.open fallback when no callback is supplied.
59
+ const handleLinkClick = (url) => {
60
+ const handler = onLinkClickRef.current;
61
+ if (handler)
62
+ handler(url);
63
+ else
64
+ defaultOpenLink(url);
65
+ };
66
+ // One compartment per component instance so read-only can be
67
+ // reconfigured live without remounting the view. Seeded with the
68
+ // current prop at mount; kept in sync by the effect below and the
69
+ // imperative `setReadOnly` handle.
70
+ const readOnlyCompartmentRef = useRef(new Compartment());
71
+ const searchCompartmentRef = useRef(new Compartment());
72
+ const searchPanelPositionRef = useRef(searchPanelPosition);
73
+ // Latest `readOnly` for the mount effect, which doesn't list it as a
74
+ // dependency (toggling must reconfigure, not remount).
75
+ const readOnlyRef = useRef(readOnly);
76
+ readOnlyRef.current = readOnly;
77
+ const hasWikiLinksConfig = Object.keys(wikiLinksConfig).length > 0;
78
+ const resolvedImagesConfig = {
79
+ ...imagesConfig,
80
+ icons: {
81
+ ...icons.image,
82
+ ...imagesConfig.icons,
83
+ },
84
+ };
85
+ const resolvedFileBlocksConfig = {
86
+ ...fileBlocksConfig,
87
+ icons: {
88
+ ...icons.file,
89
+ ...fileBlocksConfig.icons,
90
+ },
91
+ };
92
+ const resolvedFileUpload = fileUpload
93
+ ? {
94
+ ...fileUpload,
95
+ icons: {
96
+ ...icons.upload,
97
+ ...fileUpload.icons,
98
+ },
99
+ }
100
+ : undefined;
101
+ useEffect(() => {
102
+ onMarkdownChangeRef.current = onMarkdownChange;
103
+ }, [onMarkdownChange]);
104
+ useEffect(() => {
105
+ onCompositionChangeRef.current = onCompositionChange;
106
+ }, [onCompositionChange]);
107
+ useEffect(() => {
108
+ onLinkClickRef.current = onLinkClick;
109
+ }, [onLinkClick]);
110
+ // Mount once per document identity; swapping documents tears down the
111
+ // view so cursor/undo state from the previous doc doesn't leak.
112
+ const editorIdentity = documentId ?? markdownSource;
113
+ const attachCollabAdapter = async (adapter, view) => {
114
+ const generation = ++collabGenerationRef.current;
115
+ const previous = collabAdapterRef.current;
116
+ if (previous === adapter && collabUnsubscribeRef.current)
117
+ return;
118
+ collabUnsubscribeRef.current?.();
119
+ collabUnsubscribeRef.current = null;
120
+ if (previous !== noopCollabAdapter && previous !== adapter) {
121
+ await previous.detach();
122
+ }
123
+ if (viewRef.current !== view || collabGenerationRef.current !== generation) {
124
+ if (adapter !== noopCollabAdapter)
125
+ await adapter.detach();
126
+ return;
127
+ }
128
+ collabAdapterRef.current = adapter;
129
+ collabUnsubscribeRef.current = adapter.onRemoteChange((doc) => {
130
+ if (viewRef.current !== view ||
131
+ collabAdapterRef.current !== adapter ||
132
+ doc === view.state.doc.toString()) {
133
+ return;
134
+ }
135
+ view.dispatch({
136
+ changes: {
137
+ from: 0,
138
+ to: view.state.doc.length,
139
+ insert: doc,
140
+ },
141
+ annotations: Transaction.remote.of(true),
142
+ });
143
+ });
144
+ try {
145
+ await adapter.attach(view);
146
+ }
147
+ catch (error) {
148
+ if (collabGenerationRef.current === generation &&
149
+ collabAdapterRef.current === adapter) {
150
+ collabUnsubscribeRef.current?.();
151
+ collabUnsubscribeRef.current = null;
152
+ collabAdapterRef.current = noopCollabAdapter;
153
+ }
154
+ throw error;
155
+ }
156
+ };
157
+ useEffect(() => {
158
+ const root = rootRef.current;
159
+ if (!root)
160
+ return;
161
+ const registeredSyntax = registerMossSyntax(customSyntax);
162
+ const view = new EditorView({
163
+ parent: root,
164
+ state: EditorState.create({
165
+ doc: markdownSource,
166
+ extensions: [
167
+ highlightSpecialChars(),
168
+ history(),
169
+ drawSelection(),
170
+ dropCursor(),
171
+ EditorState.allowMultipleSelections.of(true),
172
+ indentOnInput(),
173
+ indentUnit.of(' '),
174
+ rectangularSelection(),
175
+ highlightActiveLine(),
176
+ // Obsidian-style bracket pairing.
177
+ closeBrackets(),
178
+ imeCompositionGuard,
179
+ EditorView.domEventHandlers({
180
+ compositionstart() {
181
+ onCompositionChangeRef.current?.(true);
182
+ return false;
183
+ },
184
+ compositionend() {
185
+ onCompositionChangeRef.current?.(false);
186
+ return false;
187
+ },
188
+ compositioncancel() {
189
+ onCompositionChangeRef.current?.(false);
190
+ return false;
191
+ },
192
+ }),
193
+ startAsteriskList,
194
+ extendEmphasisPair,
195
+ autoCloseCodeFence,
196
+ normalizeDigitPunctuation,
197
+ EditorView.lineWrapping,
198
+ // Find-in-document. `top: true` drops the panel above the
199
+ // editor (matching Obsidian / the prior Milkdown panel).
200
+ // The createPanel wrapper adds a stable class that external
201
+ // code can query to detect "is search open?" without relying
202
+ // on CM6 internals.
203
+ searchCompartmentRef.current.of(mossSearch(searchPanelPosition)),
204
+ // GFM via base: markdownLanguage — tables, strikethrough,
205
+ // task lists, autolinks. Without this, the parser is pure
206
+ // CommonMark and inline-preview never sees Task / Table.
207
+ markdown({
208
+ base: markdownLanguage,
209
+ codeLanguages: [...codeLanguages],
210
+ extensions: [
211
+ highlightMarkdown,
212
+ ...registeredSyntax.markdownExtensions,
213
+ ],
214
+ }),
215
+ // Extend closeBrackets to markdown's symmetric delimiters.
216
+ markdownLanguage.data.of({
217
+ closeBrackets: { brackets: ['(', '[', '{', "'", '"', '*', '_', '`'] },
218
+ }),
219
+ mossSyntax,
220
+ mossTheme,
221
+ keymap.of([
222
+ ...closeBracketsKeymap,
223
+ ...historyKeymap,
224
+ ...searchKeymap,
225
+ ...markdownKeymap,
226
+ indentWithTab,
227
+ ...defaultKeymap,
228
+ ]),
229
+ mossTables({
230
+ onLinkClick: handleLinkClick,
231
+ ...tablesConfig,
232
+ }),
233
+ mossImages(resolvedImagesConfig),
234
+ mossFileBlocks(resolvedFileBlocksConfig),
235
+ inlinePreview({
236
+ onLinkClick: handleLinkClick,
237
+ ...inlinePreviewConfig,
238
+ }),
239
+ ...(hasWikiLinksConfig
240
+ ? [
241
+ wikiLinks({
242
+ ...wikiLinksConfig,
243
+ onOpen: wikiLinksConfig.onOpen ?? handleLinkClick,
244
+ }),
245
+ ]
246
+ : []),
247
+ ...(slashCommandsConfig
248
+ ? [
249
+ mossSlashCommands(slashCommandsConfig, {
250
+ includeUploadBlocks: !resolvedFileUpload,
251
+ uploadBlocksConfig: { icons: icons.upload },
252
+ }),
253
+ ]
254
+ : []),
255
+ ...(resolvedFileUpload ? [mossFileUpload(resolvedFileUpload)] : []),
256
+ EditorView.updateListener.of((update) => {
257
+ if (!update.docChanged)
258
+ return;
259
+ onMarkdownChangeRef.current?.(update.state.doc.toString());
260
+ }),
261
+ initialRevealField,
262
+ // Read-only state lives in a compartment so it can toggle in
263
+ // place. Seeded from the prop at mount via the ref (the mount
264
+ // effect intentionally omits `readOnly` from its deps).
265
+ readOnlyCompartmentRef.current.of(readOnlyExtension(readOnlyRef.current)),
266
+ ...registeredSyntax.extensions,
267
+ // Consumer extensions last so they compose on top of the
268
+ // built-ins (e.g. a custom keymap wrapped in Prec.high will
269
+ // beat the default keymap above). Extensions intentionally
270
+ // trail the change listener so consumer update-listeners
271
+ // fire after onMarkdownChange.
272
+ ...extensions,
273
+ ],
274
+ }),
275
+ });
276
+ viewRef.current = view;
277
+ void attachCollabAdapter(collabAdapter, view).catch(() => { });
278
+ if (initialSearchText) {
279
+ // Defer by a tick so the panel mounts after the view's initial
280
+ // layout — otherwise the panel's DOM measurement race can leave
281
+ // it mis-positioned on first paint.
282
+ queueMicrotask(() => {
283
+ if (viewRef.current !== view)
284
+ return;
285
+ view.dispatch({
286
+ effects: setSearchQuery.of(new SearchQuery({ search: initialSearchText })),
287
+ });
288
+ openSearchPanel(view);
289
+ });
290
+ }
291
+ if (blurEditorOnMount) {
292
+ // No-op under default extensions — CM6 doesn't auto-focus. Kept
293
+ // for API symmetry with the previous Milkdown-based editor, so
294
+ // consumers don't have to special-case this prop when swapping.
295
+ }
296
+ return () => {
297
+ if (clearRevealTimerRef.current !== null) {
298
+ window.clearTimeout(clearRevealTimerRef.current);
299
+ clearRevealTimerRef.current = null;
300
+ }
301
+ collabGenerationRef.current++;
302
+ collabUnsubscribeRef.current?.();
303
+ collabUnsubscribeRef.current = null;
304
+ const activeAdapter = collabAdapterRef.current;
305
+ collabAdapterRef.current = noopCollabAdapter;
306
+ if (activeAdapter !== noopCollabAdapter)
307
+ void activeAdapter.detach();
308
+ view.destroy();
309
+ viewRef.current = null;
310
+ };
311
+ // eslint-disable-next-line react-hooks/exhaustive-deps
312
+ }, [editorIdentity]);
313
+ useEffect(() => {
314
+ const view = viewRef.current;
315
+ if (!view || collabAdapter === collabAdapterRef.current)
316
+ return;
317
+ void attachCollabAdapter(collabAdapter, view).catch(() => { });
318
+ }, [collabAdapter]);
319
+ useEffect(() => {
320
+ const view = viewRef.current;
321
+ if (!view || searchPanelPositionRef.current === searchPanelPosition)
322
+ return;
323
+ searchPanelPositionRef.current = searchPanelPosition;
324
+ view.dispatch({
325
+ effects: searchCompartmentRef.current.reconfigure(mossSearch(searchPanelPosition)),
326
+ });
327
+ }, [searchPanelPosition]);
328
+ // If a reveal query was passed, scroll the first match into view
329
+ // with the fade highlight right after mount. Runs in its own effect
330
+ // so the text can change without re-mounting the editor.
331
+ useEffect(() => {
332
+ const view = viewRef.current;
333
+ if (!view || !initialRevealText)
334
+ return;
335
+ revealInitialMatch(viewRef, view, initialRevealText, clearRevealTimerRef);
336
+ }, [editorIdentity, initialRevealText]);
337
+ // Reconfigure the read-only compartment when the prop changes. Runs
338
+ // in its own effect (not the mount effect) so toggling reading mode
339
+ // reconfigures the live view instead of tearing it down.
340
+ useEffect(() => {
341
+ const view = viewRef.current;
342
+ if (!view)
343
+ return;
344
+ view.dispatch({
345
+ effects: readOnlyCompartmentRef.current.reconfigure(readOnlyExtension(readOnly)),
346
+ });
347
+ }, [readOnly]);
348
+ // Publish the imperative handle. Lives in its own effect so changing
349
+ // `editorHandleRef` identity doesn't rebuild the view.
350
+ useEffect(() => {
351
+ if (!editorHandleRef)
352
+ return;
353
+ editorHandleRef.current = {
354
+ focus: () => viewRef.current?.focus(),
355
+ undo: () => {
356
+ const view = viewRef.current;
357
+ if (view)
358
+ undo(view);
359
+ },
360
+ redo: () => {
361
+ const view = viewRef.current;
362
+ if (view)
363
+ redo(view);
364
+ },
365
+ openSearch: (query) => {
366
+ const view = viewRef.current;
367
+ if (!view)
368
+ return;
369
+ if (query !== undefined) {
370
+ view.dispatch({
371
+ effects: setSearchQuery.of(new SearchQuery({ search: query })),
372
+ });
373
+ }
374
+ openSearchPanel(view);
375
+ },
376
+ closeSearch: () => {
377
+ const view = viewRef.current;
378
+ if (view)
379
+ closeSearchPanel(view);
380
+ },
381
+ revealText: (query) => {
382
+ const view = viewRef.current;
383
+ if (!view || !query)
384
+ return;
385
+ revealInitialMatch(viewRef, view, query, clearRevealTimerRef);
386
+ },
387
+ isSearchOpen: () => {
388
+ const view = viewRef.current;
389
+ return view ? searchPanelOpen(view.state) : false;
390
+ },
391
+ getMarkdown: () => viewRef.current?.state.doc.toString() ?? '',
392
+ getContentDOM: () => viewRef.current?.contentDOM ?? null,
393
+ setReadOnly: (next) => {
394
+ const view = viewRef.current;
395
+ if (!view)
396
+ return;
397
+ view.dispatch({
398
+ effects: readOnlyCompartmentRef.current.reconfigure(readOnlyExtension(next)),
399
+ });
400
+ },
401
+ setCollabAdapter: async (adapter) => {
402
+ const view = viewRef.current;
403
+ if (!view)
404
+ return;
405
+ await attachCollabAdapter(adapter, view);
406
+ },
407
+ };
408
+ return () => {
409
+ if (editorHandleRef.current)
410
+ editorHandleRef.current = null;
411
+ };
412
+ }, [editorHandleRef]);
413
+ return _jsx("div", { ref: rootRef, className: "moss-cm-editor" });
414
+ }
415
+ // ---------------------------------------------------------------------
416
+ // Initial reveal
417
+ //
418
+ // "Reveal" is a one-shot highlight-and-scroll: when a consumer opens
419
+ // the editor with an associated query (e.g. the user arrived from a
420
+ // search result), we paint the first match with a subtle fade-out
421
+ // background and scroll it near the top of the viewport. No cursor
422
+ // move, no search panel. The highlight clears itself after a beat
423
+ // so the reader can focus on the content.
424
+ const setInitialReveal = StateEffect.define();
425
+ const initialRevealField = StateField.define({
426
+ create() {
427
+ return Decoration.none;
428
+ },
429
+ update(decorations, tr) {
430
+ decorations = decorations.map(tr.changes);
431
+ for (const effect of tr.effects) {
432
+ if (!effect.is(setInitialReveal))
433
+ continue;
434
+ if (!effect.value) {
435
+ decorations = Decoration.none;
436
+ continue;
437
+ }
438
+ decorations = Decoration.set([
439
+ Decoration.mark({ class: 'cm-initialRevealMatch' }).range(effect.value.from, effect.value.to),
440
+ ]);
441
+ }
442
+ return decorations;
443
+ },
444
+ provide: (field) => EditorView.decorations.from(field),
445
+ });
446
+ function revealInitialMatch(viewRef, view, queryText, clearRevealTimerRef) {
447
+ const match = findInitialRevealRange(view.state.doc, queryText);
448
+ if (!match)
449
+ return;
450
+ const { from, to } = match;
451
+ view.dispatch({
452
+ effects: [
453
+ setInitialReveal.of({ from, to }),
454
+ EditorView.scrollIntoView(from, { y: 'start', yMargin: 72 }),
455
+ ],
456
+ });
457
+ // After CM6 paints the highlight, try to scroll the line NEAR THE
458
+ // TOP of whatever scrolls above it — CM6's built-in scrollIntoView
459
+ // only pins the position to the view's own scroller, which is fine
460
+ // until the editor is embedded in a larger scrolling surface
461
+ // (common in reader shells). Walk to find the actual scroll parent
462
+ // and align there.
463
+ requestAnimationFrame(() => {
464
+ if (viewRef.current !== view)
465
+ return;
466
+ const el = view.dom.querySelector('.cm-initialRevealMatch')?.closest('.cm-line') ??
467
+ view.dom.querySelector('.cm-initialRevealMatch');
468
+ if (el instanceof HTMLElement) {
469
+ scrollMatchNearTop(el, 72);
470
+ }
471
+ });
472
+ if (clearRevealTimerRef.current !== null) {
473
+ window.clearTimeout(clearRevealTimerRef.current);
474
+ }
475
+ clearRevealTimerRef.current = window.setTimeout(() => {
476
+ if (viewRef.current !== view)
477
+ return;
478
+ view.dispatch({ effects: setInitialReveal.of(null) });
479
+ clearRevealTimerRef.current = null;
480
+ }, REVEAL_FADE_MS);
481
+ }
482
+ const REVEAL_FADE_MS = 3200;
483
+ function findInitialRevealRange(docText, queryText) {
484
+ for (const candidate of buildRevealCandidates(queryText)) {
485
+ const query = new SearchQuery({ search: candidate });
486
+ if (!query.valid || !query.search)
487
+ continue;
488
+ const cursor = query.getCursor(docText);
489
+ const first = cursor.next();
490
+ if (!first.done && first.value.from !== first.value.to) {
491
+ return first.value;
492
+ }
493
+ }
494
+ return null;
495
+ }
496
+ // Try progressively-looser variants of the query so hits still
497
+ // resolve when the consumer's search returned an LLM-massaged snippet
498
+ // that doesn't match the source byte-for-byte (different whitespace,
499
+ // truncated, multi-line collapsed).
500
+ function buildRevealCandidates(queryText) {
501
+ const candidates = new Set();
502
+ const trimmed = queryText.trim();
503
+ if (!trimmed)
504
+ return [];
505
+ candidates.add(trimmed);
506
+ const collapsed = trimmed.replace(/\s+/g, ' ').trim();
507
+ if (collapsed)
508
+ candidates.add(collapsed);
509
+ for (const line of trimmed
510
+ .split('\n')
511
+ .map((part) => part.trim())
512
+ .filter(Boolean)) {
513
+ candidates.add(line);
514
+ const lineCollapsed = line.replace(/\s+/g, ' ').trim();
515
+ if (lineCollapsed)
516
+ candidates.add(lineCollapsed);
517
+ }
518
+ if (collapsed.length > 140)
519
+ candidates.add(collapsed.slice(0, 140).trim());
520
+ if (collapsed.length > 80)
521
+ candidates.add(collapsed.slice(0, 80).trim());
522
+ // Skip candidates that are too short to be meaningfully
523
+ // distinguishing — but always keep the original trimmed query as a
524
+ // last-ditch option. 12 chars is enough to avoid "the" or "an"
525
+ // dominating the first-match selection.
526
+ return [...candidates].filter((candidate) => candidate.length >= 12 || candidate === trimmed);
527
+ }
528
+ function scrollMatchNearTop(match, offset) {
529
+ const scrollParent = findScrollParent(match);
530
+ if (!scrollParent) {
531
+ match.scrollIntoView({ behavior: 'smooth', block: 'start' });
532
+ return;
533
+ }
534
+ const parentRect = scrollParent.getBoundingClientRect();
535
+ const matchRect = match.getBoundingClientRect();
536
+ const nextTop = scrollParent.scrollTop + (matchRect.top - parentRect.top) - offset;
537
+ scrollParent.scrollTo({ top: Math.max(0, nextTop), behavior: 'smooth' });
538
+ }
539
+ function findScrollParent(node) {
540
+ let current = node.parentElement;
541
+ while (current) {
542
+ const { overflowY } = window.getComputedStyle(current);
543
+ if ((overflowY === 'auto' || overflowY === 'scroll') &&
544
+ current.scrollHeight > current.clientHeight) {
545
+ return current;
546
+ }
547
+ current = current.parentElement;
548
+ }
549
+ return null;
550
+ }
551
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Extension } from '@codemirror/state';
2
+ import { type MossCustomSyntax } from '../../syntax';
3
+ export type MossCalloutType = 'note' | 'abstract' | 'info' | 'todo' | 'tip' | 'important' | 'success' | 'question' | 'warning' | 'caution' | 'failure' | 'danger' | 'bug' | 'example' | 'quote' | (string & {});
4
+ export interface MossCalloutsConfig {
5
+ aliases?: Record<string, MossCalloutType>;
6
+ }
7
+ export declare function mossCallouts(config?: MossCalloutsConfig): Extension;
8
+ export declare function mossCalloutSyntax(config?: MossCalloutsConfig): MossCustomSyntax;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/callout/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,KAAK,GACL,WAAW,GACX,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,GACT,QAAQ,GACR,KAAK,GACL,SAAS,GACT,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAwED,wBAAgB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,SAAS,CAyCvE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,kBAAuB,GAC9B,gBAAgB,CAMlB"}