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
@@ -0,0 +1,219 @@
1
+ import { type MutableRefObject } from 'react';
2
+ import { type Extension } from '@codemirror/state';
3
+ import { type LanguageDescription } from '@codemirror/language';
4
+ import { type MossImageIcons, type MossImagesConfig as ImagesConfig } from './features/image';
5
+ import { type MossFileBlockIcons, type MossFileBlocksConfig } from './features/file-blocks';
6
+ import { type WikiLinksConfig } from './features/wiki-links';
7
+ import { type MossSlashCommandsConfig } from './features/slash-commands';
8
+ import { type CollabAdapter } from './collab';
9
+ import { type MossCustomSyntax } from './syntax';
10
+ import { type MossSearchPanelPosition } from './features/search';
11
+ import type { InlinePreviewConfig } from './core/inline-preview';
12
+ import type { MossTablesConfig as TablesConfig } from './features/table';
13
+ import { type MossFileUploadConfig, type MossUploadIcons } from './features/upload';
14
+ export interface MossMDHandle {
15
+ focus: () => void;
16
+ undo: () => void;
17
+ redo: () => void;
18
+ openSearch: (query?: string) => void;
19
+ closeSearch: () => void;
20
+ /**
21
+ * Scroll the first match of `query` into view with a brief fade-out
22
+ * highlight — no search panel, no cursor movement. Designed for
23
+ * navigation cases like "open this atom from a search result and
24
+ * take me to the relevant paragraph". Matches the behavior of
25
+ * `initialRevealText` but as an imperative action after mount.
26
+ */
27
+ revealText: (query: string) => void;
28
+ isSearchOpen: () => boolean;
29
+ getMarkdown: () => string;
30
+ getContentDOM: () => HTMLElement | null;
31
+ /**
32
+ * Toggle read-only ("reading") mode imperatively. Equivalent to
33
+ * flipping the `readOnly` prop, but usable from outside React's
34
+ * render cycle (e.g. a toolbar button wired through the handle). The
35
+ * change is applied via a CM6 `Compartment` reconfigure — no remount,
36
+ * so scroll position and search state are preserved.
37
+ */
38
+ setReadOnly: (readOnly: boolean) => void;
39
+ setCollabAdapter: (adapter: CollabAdapter) => Promise<void>;
40
+ }
41
+ export interface MossMDIconsConfig {
42
+ /** Icons rendered by image blocks and their inline controls. */
43
+ image?: Partial<MossImageIcons>;
44
+ /** Icons rendered by standalone file link blocks. */
45
+ file?: Partial<MossFileBlockIcons>;
46
+ /** Icons rendered by transient upload progress blocks. */
47
+ upload?: Partial<MossUploadIcons>;
48
+ }
49
+ export interface MossMDProps {
50
+ /**
51
+ * Opaque identity for the document. Swapping `documentId` tears down
52
+ * and re-mounts the view so cursor / undo state from a previous
53
+ * document doesn't leak. If omitted, the initial `markdownSource`
54
+ * value is used as the identity — which means mounting a different
55
+ * string produces a fresh editor.
56
+ */
57
+ documentId?: string;
58
+ /**
59
+ * The markdown document to open the editor on. Used only at mount
60
+ * time — the editor is the source of truth for the doc after that.
61
+ * To swap documents, change `documentId`.
62
+ */
63
+ markdownSource: string;
64
+ /**
65
+ * If set, opens the search panel on mount with this query pre-filled.
66
+ * Useful for landing the reader on a search hit — the user sees their
67
+ * query already active without re-typing.
68
+ */
69
+ initialSearchText?: string | null;
70
+ /**
71
+ * Where the find-in-document controls appear inside the CodeMirror
72
+ * editor chrome. Defaults to `top`.
73
+ */
74
+ searchPanelPosition?: MossSearchPanelPosition;
75
+ /**
76
+ * If set, reveals the first match of this query in the document with
77
+ * a brief scroll-into-view and fade-out highlight — no search panel,
78
+ * no cursor movement. Less intrusive alternative to
79
+ * `initialSearchText` for "open an atom from a search result and take
80
+ * me to the relevant paragraph" flows.
81
+ *
82
+ * The matcher falls back progressively — exact string, whitespace-
83
+ * collapsed variant, individual lines, then truncated prefixes (140
84
+ * and 80 chars) — so hits from LLM-generated snippets or chunked
85
+ * search excerpts still resolve even when they don't match the
86
+ * source byte-for-byte.
87
+ */
88
+ initialRevealText?: string | null;
89
+ /**
90
+ * Skip any implicit focus behavior on mount. Defaults to `false`;
91
+ * the CM6 view doesn't auto-focus today, but consumers wiring this
92
+ * into a larger reader often want an explicit escape hatch in case
93
+ * a future extension or keymap does.
94
+ */
95
+ blurEditorOnMount?: boolean;
96
+ /**
97
+ * Render the editor in read-only ("reading") mode: the whole document
98
+ * stays rendered (no source ever reveals under a caret), typing /
99
+ * paste / table editing are disabled, and clicking a link opens it
100
+ * instead of placing a caret. Checkboxes remain toggleable, and
101
+ * find-in-document still works.
102
+ *
103
+ * Unlike `extensions`, this is NOT captured at mount — it's backed by
104
+ * a CM6 `Compartment`, so toggling it reconfigures the live view in
105
+ * place (scroll position preserved) rather than remounting. Defaults
106
+ * to `false`.
107
+ */
108
+ readOnly?: boolean;
109
+ /**
110
+ * Called on every doc change with the current markdown. Fires for
111
+ * both user edits and any dispatches the editor produces internally
112
+ * (e.g. checkbox toggles, tight-list continuations).
113
+ */
114
+ onMarkdownChange?: (markdown: string) => void;
115
+ /**
116
+ * Called when an IME composition session starts or ends. `true` means
117
+ * composition is active; `false` is sent for both normal completion and
118
+ * cancellation. The callback observes the input lifecycle and does not
119
+ * change the editor's composition handling.
120
+ */
121
+ onCompositionChange?: (composing: boolean) => void;
122
+ /**
123
+ * Called when the user plain-clicks a rendered link in the
124
+ * inline-preview output. Receives the link's URL as written in the
125
+ * source markdown. Defaults to `window.open(url, '_blank',
126
+ * 'noopener,noreferrer')`. Provide your own handler to route opens
127
+ * through a platform shell (Tauri, Capacitor, Electron).
128
+ */
129
+ onLinkClick?: (url: string) => void;
130
+ /**
131
+ * A mutable ref the editor attaches its imperative handle to. Use
132
+ * this for side-effectful ops that don't fit a prop/callback model
133
+ * — keyboard-driven undo/redo, opening the search panel on Ctrl+F
134
+ * from outside the editor, pulling the current markdown on demand.
135
+ */
136
+ editorHandleRef?: MutableRefObject<MossMDHandle | null>;
137
+ /**
138
+ * Grammars to load for fenced code blocks whose info string matches.
139
+ * `@codemirror/lang-markdown` lazy-imports each grammar on first use
140
+ * (no cost until a matching fence appears), so passing a large list
141
+ * is fine. Defaults to `[]` — fences render as plain monospace.
142
+ *
143
+ * For a curated ~20-language default, install the peers and import
144
+ * the registry:
145
+ *
146
+ * ```ts
147
+ * import { MOSS_CODE_LANGUAGES } from 'mossmd/code-languages';
148
+ * <MossMD codeLanguages={MOSS_CODE_LANGUAGES} ... />
149
+ * ```
150
+ *
151
+ * Or build your own list from the `LanguageDescription` factory
152
+ * exported by `@codemirror/language`.
153
+ */
154
+ codeLanguages?: readonly LanguageDescription[];
155
+ /**
156
+ * Extra CodeMirror 6 extensions appended to the built-in set.
157
+ * This is the hook for layering in additional plugins — autocomplete
158
+ * sources, custom decorations (wiki-links, block refs, footnotes),
159
+ * domain-specific keymaps, collaboration (yjs), vim mode, etc.
160
+ *
161
+ * Order matters for CM6 precedence. Use `Prec.high/default/low` from
162
+ * `@codemirror/state` to explicitly position an extension relative
163
+ * to the built-ins when it matters (e.g., custom keybindings that
164
+ * need to beat the default keymap).
165
+ *
166
+ * Extensions are captured once at mount time (keyed on
167
+ * `documentId ?? markdownSource`). Changing the array reference
168
+ * without changing the document identity does NOT re-apply — pass
169
+ * a stable reference (via `useMemo` or a module-level constant)
170
+ * unless you intend a remount.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * import { autocompletion, CompletionContext } from '@codemirror/autocomplete';
175
+ *
176
+ * const wikiLinkCompletion = autocompletion({
177
+ * override: [(ctx: CompletionContext) => {
178
+ * const match = ctx.matchBefore(/\[\[\w*$/);
179
+ * if (!match) return null;
180
+ * return {
181
+ * from: match.from + 2,
182
+ * options: atomStore.list().map(a => ({ label: a.title })),
183
+ * };
184
+ * }],
185
+ * });
186
+ *
187
+ * <MossMD extensions={[wikiLinkCompletion]} ... />
188
+ * ```
189
+ */
190
+ extensions?: readonly Extension[];
191
+ customSyntax?: readonly MossCustomSyntax[];
192
+ inlinePreviewConfig?: InlinePreviewConfig;
193
+ /**
194
+ * Unified icon overrides for the built-in React editor surface.
195
+ * Feature-level icon configs still work and take precedence.
196
+ */
197
+ icons?: MossMDIconsConfig;
198
+ /** Configure the floating edit control rendered on image blocks. */
199
+ imagesConfig?: ImagesConfig;
200
+ /** Configure rendered file link blocks. */
201
+ fileBlocksConfig?: MossFileBlocksConfig;
202
+ tablesConfig?: TablesConfig;
203
+ wikiLinksConfig?: WikiLinksConfig;
204
+ slashCommandsConfig?: MossSlashCommandsConfig;
205
+ fileUpload?: MossFileUploadConfig;
206
+ collabAdapter?: CollabAdapter;
207
+ }
208
+ /**
209
+ * React wrapper around a CodeMirror 6 editor configured for markdown
210
+ * editing with Obsidian-style inline live preview.
211
+ *
212
+ * Remember to import the accompanying CSS:
213
+ *
214
+ * ```ts
215
+ * import 'mossmd/editor.css';
216
+ * ```
217
+ */
218
+ export declare function MossMD({ markdownSource, documentId, initialSearchText, searchPanelPosition, initialRevealText, blurEditorOnMount, readOnly, onMarkdownChange, onCompositionChange, onLinkClick, editorHandleRef, codeLanguages, extensions, customSyntax, inlinePreviewConfig, icons, imagesConfig, fileBlocksConfig, tablesConfig, wikiLinksConfig, slashCommandsConfig, fileUpload, collabAdapter, }: MossMDProps): import("react").JSX.Element;
219
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.tsx"],"names":[],"mappings":"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"}