@mdwrk/markdown-editor-react 1.0.2

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.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # mdwrk/markdown-editor-react
2
+
3
+ React bindings for the portable Markdown Workspace source-mode editor.
4
+
5
+ ## Responsibilities
6
+
7
+ - `MarkdownSourceEditor` React component
8
+ - controlled and uncontrolled value modes
9
+ - textarea selection + cursor synchronization
10
+ - keyboard shortcuts and built-in command wiring
11
+ - undo/redo integration on top of the core package
12
+ - theme variable bridge and optional default stylesheet
13
+
14
+ ## Key exports
15
+
16
+ - `MarkdownSourceEditor`
17
+ - `createMarkdownEditorThemeStyle`
18
+ - `createMarkdownEditorThemeVariablesFromThemeTokens`
19
+ - `createMarkdownEditorThemeStyleFromThemeTokens`
20
+ - `useMarkdownSourceEditorTheme`
21
+ - `MarkdownSourceEditorHandle`
22
+ - re-exports from `mdwrk/markdown-editor-core`
23
+
24
+ ## Optional stylesheet
25
+
26
+ ```css
27
+ @import url("@mdwrk/markdown-editor-react/styles/default.css");
28
+ ```
29
+
30
+ ## Status
31
+
32
+ Implemented in the Phase 9 checkpoint. The package is publishable. Repository-wide certification remains pending later phases.
@@ -0,0 +1,2 @@
1
+ export declare const MarkdownSourceEditor: any;
2
+ //# sourceMappingURL=component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.tsx"],"names":[],"mappings":"AAsCA,eAAO,MAAM,oBAAoB,KAwUhC,CAAC"}
@@ -0,0 +1,254 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES, applyBuiltinMarkdownCommand, canRedoHistory, canUndoHistory, computeCursorPosition, createSelection, createHistoryState, normalizeSelection, pushHistoryEntry, redoHistory, replaceHistoryPresent, resetHistoryState, undoHistory, } from "@mdwrk/markdown-editor-core";
4
+ import { createMarkdownEditorThemeStyle } from "./theme.js";
5
+ const mergeClassNames = (...values) => values.filter(Boolean).join(" ");
6
+ function selectionEquals(a, b) {
7
+ return a.start === b.start && a.end === b.end && (a.direction ?? "none") === (b.direction ?? "none");
8
+ }
9
+ function snapshotFromState(value, selection) {
10
+ return { value, selection };
11
+ }
12
+ export const MarkdownSourceEditor = React.forwardRef(function MarkdownSourceEditor({ value, defaultValue, documentKey, onChange, onSelectionChange, onCursorChange, onHistoryChange, onCommand, className, style, themeStyle, placeholder = "Start typing...", spellCheck = false, autoFocus = false, disabled = false, showLineNumbers = true, historyLimit = 100, textareaClassName, gutterClassName, lineNumberClassName, indentUnit = "\t", themeVariables, }, ref) {
13
+ const isControlled = value !== undefined;
14
+ const initialValue = React.useMemo(() => value ?? defaultValue ?? "", []);
15
+ const [draftValue, setDraftValue] = React.useState(initialValue);
16
+ const [selection, setSelection] = React.useState(createSelection(initialValue.length, initialValue.length));
17
+ const [history, setHistory] = React.useState(() => createHistoryState(initialValue, createSelection(initialValue.length, initialValue.length), historyLimit));
18
+ const textareaRef = React.useRef(null);
19
+ const gutterRef = React.useRef(null);
20
+ const draftValueRef = React.useRef(draftValue);
21
+ const selectionRef = React.useRef(selection);
22
+ const historyRef = React.useRef(history);
23
+ const pendingSelectionRef = React.useRef(null);
24
+ React.useEffect(() => {
25
+ draftValueRef.current = draftValue;
26
+ }, [draftValue]);
27
+ React.useEffect(() => {
28
+ selectionRef.current = selection;
29
+ }, [selection]);
30
+ React.useEffect(() => {
31
+ historyRef.current = history;
32
+ onHistoryChange?.(history);
33
+ }, [history, onHistoryChange]);
34
+ React.useEffect(() => {
35
+ if (documentKey === undefined)
36
+ return;
37
+ const nextValue = value ?? defaultValue ?? draftValueRef.current;
38
+ const nextSelection = createSelection(nextValue.length, nextValue.length);
39
+ setDraftValue(nextValue);
40
+ setSelection(nextSelection);
41
+ setHistory(resetHistoryState(nextValue, nextSelection, historyLimit));
42
+ pendingSelectionRef.current = nextSelection;
43
+ }, [documentKey]);
44
+ React.useLayoutEffect(() => {
45
+ if (!isControlled || value === undefined)
46
+ return;
47
+ if (value === draftValueRef.current)
48
+ return;
49
+ const nextSelection = normalizeSelection(selectionRef.current, value.length);
50
+ setDraftValue(value);
51
+ setSelection(nextSelection);
52
+ setHistory((currentHistory) => replaceHistoryPresent(currentHistory, value, nextSelection));
53
+ pendingSelectionRef.current = nextSelection;
54
+ }, [isControlled, value]);
55
+ React.useLayoutEffect(() => {
56
+ const textarea = textareaRef.current;
57
+ if (!textarea)
58
+ return;
59
+ const nextSelection = pendingSelectionRef.current ?? selectionRef.current;
60
+ const normalized = normalizeSelection(nextSelection, textarea.value.length);
61
+ try {
62
+ textarea.setSelectionRange(normalized.start, normalized.end, normalized.direction ?? "none");
63
+ }
64
+ catch {
65
+ textarea.setSelectionRange(normalized.start, normalized.end);
66
+ }
67
+ pendingSelectionRef.current = null;
68
+ }, [draftValue, selection]);
69
+ const emitCursor = React.useCallback((nextValue, nextSelection) => {
70
+ const cursor = computeCursorPosition(nextValue, nextSelection.end);
71
+ onCursorChange?.(cursor.line, cursor.column);
72
+ }, [onCursorChange]);
73
+ const syncSelectionFromTextarea = React.useCallback(() => {
74
+ const textarea = textareaRef.current;
75
+ if (!textarea)
76
+ return createSelection(0, 0);
77
+ const nextSelection = normalizeSelection({
78
+ start: textarea.selectionStart,
79
+ end: textarea.selectionEnd,
80
+ direction: textarea.selectionDirection ?? "none",
81
+ }, textarea.value.length);
82
+ const didSelectionChange = !selectionEquals(selectionRef.current, nextSelection);
83
+ selectionRef.current = nextSelection;
84
+ if (didSelectionChange) {
85
+ setSelection(nextSelection);
86
+ onSelectionChange?.(nextSelection);
87
+ }
88
+ emitCursor(textarea.value, nextSelection);
89
+ return nextSelection;
90
+ }, [emitCursor, onSelectionChange]);
91
+ const commitValue = React.useCallback((nextValue, nextSelection, options = {}) => {
92
+ const normalizedSelection = normalizeSelection(nextSelection, nextValue.length);
93
+ draftValueRef.current = nextValue;
94
+ selectionRef.current = normalizedSelection;
95
+ setDraftValue(nextValue);
96
+ setSelection(normalizedSelection);
97
+ pendingSelectionRef.current = normalizedSelection;
98
+ setHistory((currentHistory) => {
99
+ return options.historic === false
100
+ ? replaceHistoryPresent(currentHistory, nextValue, normalizedSelection)
101
+ : pushHistoryEntry(currentHistory, nextValue, normalizedSelection);
102
+ });
103
+ onChange?.(nextValue);
104
+ onSelectionChange?.(normalizedSelection);
105
+ emitCursor(nextValue, normalizedSelection);
106
+ if (options.focus) {
107
+ requestAnimationFrame(() => textareaRef.current?.focus());
108
+ }
109
+ }, [emitCursor, onChange, onSelectionChange]);
110
+ const applyEditResult = React.useCallback((result, options) => {
111
+ if (!result.changed && options?.historic !== false)
112
+ return snapshotFromState(draftValueRef.current, selectionRef.current);
113
+ commitValue(result.value, result.selection, options);
114
+ return snapshotFromState(result.value, result.selection);
115
+ }, [commitValue]);
116
+ const executeCommand = React.useCallback((command, options = {}) => {
117
+ if (command === "undo") {
118
+ const nextHistory = undoHistory(historyRef.current);
119
+ setHistory(nextHistory);
120
+ setDraftValue(nextHistory.present.value);
121
+ setSelection(nextHistory.present.selection);
122
+ pendingSelectionRef.current = nextHistory.present.selection;
123
+ onChange?.(nextHistory.present.value);
124
+ onSelectionChange?.(nextHistory.present.selection);
125
+ emitCursor(nextHistory.present.value, nextHistory.present.selection);
126
+ onCommand?.(command);
127
+ return nextHistory.present;
128
+ }
129
+ if (command === "redo") {
130
+ const nextHistory = redoHistory(historyRef.current);
131
+ setHistory(nextHistory);
132
+ setDraftValue(nextHistory.present.value);
133
+ setSelection(nextHistory.present.selection);
134
+ pendingSelectionRef.current = nextHistory.present.selection;
135
+ onChange?.(nextHistory.present.value);
136
+ onSelectionChange?.(nextHistory.present.selection);
137
+ emitCursor(nextHistory.present.value, nextHistory.present.selection);
138
+ onCommand?.(command);
139
+ return nextHistory.present;
140
+ }
141
+ const result = applyBuiltinMarkdownCommand(command, draftValueRef.current, selectionRef.current, {
142
+ indentUnit: options.indentUnit ?? indentUnit,
143
+ });
144
+ const snapshot = applyEditResult(result, { focus: true });
145
+ onCommand?.(command);
146
+ return snapshot;
147
+ }, [applyEditResult, emitCursor, indentUnit, onChange, onCommand, onSelectionChange]);
148
+ React.useImperativeHandle(ref, () => ({
149
+ focus() {
150
+ textareaRef.current?.focus();
151
+ },
152
+ getSnapshot() {
153
+ return snapshotFromState(draftValueRef.current, selectionRef.current);
154
+ },
155
+ getSelection() {
156
+ return selectionRef.current;
157
+ },
158
+ setSelection(nextSelection) {
159
+ const normalized = normalizeSelection(nextSelection, draftValueRef.current.length);
160
+ setSelection(normalized);
161
+ pendingSelectionRef.current = normalized;
162
+ onSelectionChange?.(normalized);
163
+ emitCursor(draftValueRef.current, normalized);
164
+ },
165
+ applyEdit(result, options) {
166
+ applyEditResult(result, { historic: options?.historic, focus: true });
167
+ },
168
+ executeCommand,
169
+ undo() {
170
+ executeCommand("undo");
171
+ },
172
+ redo() {
173
+ executeCommand("redo");
174
+ },
175
+ canUndo() {
176
+ return canUndoHistory(historyRef.current);
177
+ },
178
+ canRedo() {
179
+ return canRedoHistory(historyRef.current);
180
+ },
181
+ getHistory() {
182
+ return historyRef.current;
183
+ },
184
+ setValue(nextValue, options) {
185
+ commitValue(nextValue, options?.selection ?? createSelection(nextValue.length), {
186
+ historic: options?.historic,
187
+ focus: true,
188
+ });
189
+ },
190
+ }), [applyEditResult, commitValue, emitCursor, executeCommand, onSelectionChange]);
191
+ const handleTextareaChange = React.useCallback((event) => {
192
+ const nextValue = event.currentTarget.value;
193
+ const nextSelection = normalizeSelection({
194
+ start: event.currentTarget.selectionStart,
195
+ end: event.currentTarget.selectionEnd,
196
+ direction: event.currentTarget.selectionDirection ?? "none",
197
+ }, nextValue.length);
198
+ commitValue(nextValue, nextSelection);
199
+ }, [commitValue]);
200
+ const handleKeyDown = React.useCallback((event) => {
201
+ if (disabled)
202
+ return;
203
+ syncSelectionFromTextarea();
204
+ const meta = event.metaKey || event.ctrlKey;
205
+ const key = event.key.toLowerCase();
206
+ if (!meta && event.key === "Tab") {
207
+ event.preventDefault();
208
+ executeCommand(event.shiftKey ? "outdent" : "indent", { indentUnit });
209
+ return;
210
+ }
211
+ if (!meta)
212
+ return;
213
+ if (key === "b") {
214
+ event.preventDefault();
215
+ executeCommand("bold");
216
+ return;
217
+ }
218
+ if (key === "i") {
219
+ event.preventDefault();
220
+ executeCommand("italic");
221
+ return;
222
+ }
223
+ if (key === "x" && event.shiftKey) {
224
+ event.preventDefault();
225
+ executeCommand("strikethrough");
226
+ return;
227
+ }
228
+ if (key === "z") {
229
+ event.preventDefault();
230
+ executeCommand(event.shiftKey ? "redo" : "undo");
231
+ return;
232
+ }
233
+ if (key === "y") {
234
+ event.preventDefault();
235
+ executeCommand("redo");
236
+ }
237
+ }, [disabled, executeCommand, indentUnit, syncSelectionFromTextarea]);
238
+ const lineCount = React.useMemo(() => {
239
+ const displayValue = isControlled ? (value ?? "") : draftValue;
240
+ const matches = displayValue.match(/\n/g);
241
+ return (matches?.length ?? 0) + 1;
242
+ }, [draftValue, isControlled, value]);
243
+ const mergedThemeStyle = React.useMemo(() => ({
244
+ ...createMarkdownEditorThemeStyle(themeVariables),
245
+ ...themeStyle,
246
+ ...style,
247
+ }), [style, themeStyle, themeVariables]);
248
+ return (_jsx("div", { className: mergeClassNames(DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES.root, "editor-stage", className), style: mergedThemeStyle, children: _jsxs("div", { className: mergeClassNames(DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES.layout, "editor-layout-wrapper"), children: [showLineNumbers ? (_jsx("div", { ref: gutterRef, className: mergeClassNames(DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES.gutter, "editor-gutter", gutterClassName), "aria-hidden": "true", children: Array.from({ length: lineCount }, (_, index) => (_jsx("div", { className: mergeClassNames(DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES.lineNumber, "line-num", lineNumberClassName), children: index + 1 }, index + 1))) })) : null, _jsx("textarea", { ref: textareaRef, className: mergeClassNames(DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES.textarea, "editor-textarea", textareaClassName), value: isControlled ? (value ?? "") : draftValue, onChange: handleTextareaChange, onKeyDown: handleKeyDown, onClick: syncSelectionFromTextarea, onKeyUp: syncSelectionFromTextarea, onSelect: syncSelectionFromTextarea, onScroll: (event) => {
249
+ if (gutterRef.current) {
250
+ gutterRef.current.scrollTop = event.currentTarget.scrollTop;
251
+ }
252
+ }, spellCheck: spellCheck, autoFocus: autoFocus, disabled: disabled, placeholder: placeholder, "data-testid": "markdown-source-editor" })] }) }));
253
+ });
254
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./theme.js";
4
+ export * from "./component.js";
5
+ export * from "@mdwrk/markdown-editor-core";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./theme.js";
4
+ export * from "./component.js";
5
+ export * from "@mdwrk/markdown-editor-core";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CSSProperties } from "react";
2
+ import { type ThemeTokenOverrides } from "@mdwrk/ui-tokens/theme-map";
3
+ export interface MarkdownEditorThemeVariables {
4
+ readonly background?: string;
5
+ readonly gutterBackground?: string;
6
+ readonly border?: string;
7
+ readonly foreground?: string;
8
+ readonly foregroundMuted?: string;
9
+ readonly accent?: string;
10
+ readonly fontMono?: string;
11
+ readonly padding?: string;
12
+ readonly lineHeight?: string;
13
+ readonly fontSize?: string;
14
+ }
15
+ export declare function createMarkdownEditorThemeStyle(variables?: MarkdownEditorThemeVariables): CSSProperties;
16
+ export declare function createMarkdownEditorThemeVariablesFromThemeTokens(overrides?: ThemeTokenOverrides): Readonly<Record<`--${string}`, string>>;
17
+ export declare function createMarkdownEditorThemeStyleFromThemeTokens(overrides?: ThemeTokenOverrides): CSSProperties;
18
+ export declare function useMarkdownSourceEditorTheme(variables?: MarkdownEditorThemeVariables): CSSProperties;
19
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,4BAAiC,GAC3C,aAAa,CAaf;AAED,wBAAgB,iDAAiD,CAC/D,SAAS,GAAE,mBAAwB,GAClC,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAEzC;AAED,wBAAgB,6CAA6C,CAC3D,SAAS,GAAE,mBAAwB,GAClC,aAAa,CAMf;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,GAAE,4BAAiC,GAC3C,aAAa,CAEf"}
package/dist/theme.js ADDED
@@ -0,0 +1,29 @@
1
+ import { createEditorThemeBridgeVariableRecord, } from "@mdwrk/ui-tokens/theme-map";
2
+ export function createMarkdownEditorThemeStyle(variables = {}) {
3
+ return {
4
+ ["--mwe-bg-surface"]: variables.background ?? "var(--bg-panel, #11151a)",
5
+ ["--mwe-bg-gutter"]: variables.gutterBackground ?? "var(--bg-inset, #0d1117)",
6
+ ["--mwe-border-color"]: variables.border ?? "var(--border-color, rgba(255,255,255,0.12))",
7
+ ["--mwe-fg-primary"]: variables.foreground ?? "var(--fg-primary, #e9ecf1)",
8
+ ["--mwe-fg-muted"]: variables.foregroundMuted ?? "var(--fg-muted, #94a3b8)",
9
+ ["--mwe-accent"]: variables.accent ?? "var(--accent, #7c9cff)",
10
+ ["--mwe-font-mono"]: variables.fontMono ?? 'var(--font-mono, "Fira Code", ui-monospace, monospace)',
11
+ ["--mwe-editor-padding"]: variables.padding ?? "var(--editor-padding, 16px)",
12
+ ["--mwe-line-height"]: variables.lineHeight ?? "1.5rem",
13
+ ["--mwe-font-size"]: variables.fontSize ?? "calc(13px * var(--ui-scale, 1))",
14
+ };
15
+ }
16
+ export function createMarkdownEditorThemeVariablesFromThemeTokens(overrides = {}) {
17
+ return createEditorThemeBridgeVariableRecord(overrides);
18
+ }
19
+ export function createMarkdownEditorThemeStyleFromThemeTokens(overrides = {}) {
20
+ return {
21
+ ...createMarkdownEditorThemeVariablesFromThemeTokens(overrides),
22
+ ["--mwe-line-height"]: "1.5rem",
23
+ ["--mwe-font-size"]: "calc(13px * var(--ui-scale, 1))",
24
+ };
25
+ }
26
+ export function useMarkdownSourceEditorTheme(variables = {}) {
27
+ return createMarkdownEditorThemeStyle(variables);
28
+ }
29
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qCAAqC,GAEtC,MAAM,4BAA4B,CAAC;AAepC,MAAM,UAAU,8BAA8B,CAC5C,YAA0C,EAAE;IAE5C,OAAO;QACL,CAAC,kBAAyB,CAAC,EAAE,SAAS,CAAC,UAAU,IAAI,0BAA0B;QAC/E,CAAC,iBAAwB,CAAC,EAAE,SAAS,CAAC,gBAAgB,IAAI,0BAA0B;QACpF,CAAC,oBAA2B,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,6CAA6C;QAChG,CAAC,kBAAyB,CAAC,EAAE,SAAS,CAAC,UAAU,IAAI,4BAA4B;QACjF,CAAC,gBAAuB,CAAC,EAAE,SAAS,CAAC,eAAe,IAAI,0BAA0B;QAClF,CAAC,cAAqB,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,wBAAwB;QACrE,CAAC,iBAAwB,CAAC,EAAE,SAAS,CAAC,QAAQ,IAAI,wDAAwD;QAC1G,CAAC,sBAA6B,CAAC,EAAE,SAAS,CAAC,OAAO,IAAI,6BAA6B;QACnF,CAAC,mBAA0B,CAAC,EAAE,SAAS,CAAC,UAAU,IAAI,QAAQ;QAC9D,CAAC,iBAAwB,CAAC,EAAE,SAAS,CAAC,QAAQ,IAAI,iCAAiC;KACpF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iDAAiD,CAC/D,YAAiC,EAAE;IAEnC,OAAO,qCAAqC,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,6CAA6C,CAC3D,YAAiC,EAAE;IAEnC,OAAO;QACL,GAAG,iDAAiD,CAAC,SAAS,CAAC;QAC/D,CAAC,mBAA0B,CAAC,EAAE,QAAQ;QACtC,CAAC,iBAAwB,CAAC,EAAE,iCAAiC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,YAA0C,EAAE;IAE5C,OAAO,8BAA8B,CAAC,SAAS,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { MarkdownEditorBuiltinCommandId, MarkdownEditorCommandOptions, MarkdownEditorHistoryState, MarkdownEditorHostEditApi, MarkdownEditorSelection, MarkdownEditorSnapshot } from "@mdwrk/markdown-editor-core";
3
+ import type { MarkdownEditorThemeVariables } from "./theme.js";
4
+ export interface MarkdownSourceEditorProps {
5
+ readonly value?: string;
6
+ readonly defaultValue?: string;
7
+ readonly documentKey?: string | number;
8
+ readonly onChange?: (value: string) => void;
9
+ readonly onSelectionChange?: (selection: MarkdownEditorSelection) => void;
10
+ readonly onCursorChange?: (line: number, column: number) => void;
11
+ readonly onHistoryChange?: (history: MarkdownEditorHistoryState) => void;
12
+ readonly onCommand?: (command: MarkdownEditorBuiltinCommandId) => void;
13
+ readonly className?: string;
14
+ readonly style?: CSSProperties;
15
+ readonly themeStyle?: CSSProperties;
16
+ readonly placeholder?: string;
17
+ readonly spellCheck?: boolean;
18
+ readonly autoFocus?: boolean;
19
+ readonly disabled?: boolean;
20
+ readonly showLineNumbers?: boolean;
21
+ readonly historyLimit?: number;
22
+ readonly textareaClassName?: string;
23
+ readonly gutterClassName?: string;
24
+ readonly lineNumberClassName?: string;
25
+ readonly indentUnit?: string;
26
+ readonly themeVariables?: MarkdownEditorThemeVariables;
27
+ }
28
+ export interface MarkdownSourceEditorHandle extends MarkdownEditorHostEditApi {
29
+ canUndo(): boolean;
30
+ canRedo(): boolean;
31
+ getHistory(): MarkdownEditorHistoryState;
32
+ setValue(value: string, options?: {
33
+ historic?: boolean;
34
+ selection?: MarkdownEditorSelection;
35
+ }): void;
36
+ executeCommand(command: MarkdownEditorBuiltinCommandId, options?: MarkdownEditorCommandOptions): MarkdownEditorSnapshot;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI,CAAC;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,4BAA4B,CAAC;CACxD;AAED,MAAM,WAAW,0BAA2B,SAAQ,yBAAyB;IAC3E,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC;IACnB,UAAU,IAAI,0BAA0B,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,uBAAuB,CAAA;KAAE,GAAG,IAAI,CAAC;IACrG,cAAc,CAAC,OAAO,EAAE,8BAA8B,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,sBAAsB,CAAC;CACzH"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const MARKDOWN_EDITOR_REACT_VERSION = "1.0.2";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const MARKDOWN_EDITOR_REACT_VERSION = "1.0.2";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@mdwrk/markdown-editor-react",
3
+ "version": "1.0.2",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "engines": {
10
+ "node": ">=20 <23"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "src/styles",
15
+ "README.md"
16
+ ],
17
+ "sideEffects": [
18
+ "./src/styles/default.css"
19
+ ],
20
+ "keywords": [
21
+ "markdown-workspace",
22
+ "editor",
23
+ "markdown",
24
+ "react"
25
+ ],
26
+ "description": "React bindings, textarea editor surface, command wiring, history integration, and theme bridge for the Markdown Workspace portable markdown editor.",
27
+ "dependencies": {
28
+ "@mdwrk/markdown-editor-core": "^1.0.1",
29
+ "@mdwrk/ui-tokens": "^1.0.1"
30
+ },
31
+ "peerDependencies": {
32
+ "react": "^19.0.0",
33
+ "react-dom": "^19.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@mdwrk/testing": "^1.0.0",
37
+ "@testing-library/jest-dom": "^6.6.3",
38
+ "@testing-library/react": "^16.1.0",
39
+ "@types/react": "^19.0.8",
40
+ "@types/react-dom": "^19.0.3",
41
+ "jsdom": "^25.0.1",
42
+ "vitest": "^2.1.8"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.json",
46
+ "typecheck": "tsc --noEmit -p tsconfig.json",
47
+ "lint": "npm run typecheck",
48
+ "test": "vitest run",
49
+ "prepack": "npm run build"
50
+ },
51
+ "exports": {
52
+ ".": {
53
+ "types": "./dist/index.d.ts",
54
+ "import": "./dist/index.js"
55
+ },
56
+ "./version": {
57
+ "types": "./dist/version.d.ts",
58
+ "import": "./dist/version.js"
59
+ },
60
+ "./types": {
61
+ "types": "./dist/types.d.ts",
62
+ "import": "./dist/types.js"
63
+ },
64
+ "./theme": {
65
+ "types": "./dist/theme.d.ts",
66
+ "import": "./dist/theme.js"
67
+ },
68
+ "./styles/default.css": "./src/styles/default.css"
69
+ },
70
+ "main": "./dist/index.js",
71
+ "types": "./dist/index.d.ts",
72
+ "author": "Jacob Stewart <jacob@swarmauri.com>",
73
+ "homepage": "https://mdwrk.com"
74
+ }
@@ -0,0 +1,57 @@
1
+ @import url("@mdwrk/ui-tokens/styles/root.css");
2
+
3
+ .mw-editor {
4
+ background: var(--mwe-bg-surface, var(--bg-panel, #11151a));
5
+ color: var(--mwe-fg-primary, var(--fg-primary, #e9ecf1));
6
+ width: 100%;
7
+ height: 100%;
8
+ }
9
+
10
+ .mw-editor-layout {
11
+ display: flex;
12
+ min-height: 320px;
13
+ width: 100%;
14
+ height: 100%;
15
+ overflow: hidden;
16
+ border: 1px solid var(--mwe-border-color, var(--border-color, rgba(255,255,255,0.12)));
17
+ background: var(--mwe-bg-surface, var(--bg-panel, #11151a));
18
+ }
19
+
20
+ .mw-editor-gutter {
21
+ width: 48px;
22
+ flex: 0 0 48px;
23
+ background: var(--mwe-bg-gutter, var(--bg-inset, #0d1117));
24
+ border-right: 1px solid var(--mwe-border-color, var(--border-color, rgba(255,255,255,0.12)));
25
+ color: var(--mwe-fg-muted, var(--fg-muted, #94a3b8));
26
+ font-family: var(--mwe-font-mono, var(--font-mono, ui-monospace, monospace));
27
+ font-size: calc(var(--mwe-font-size, 13px) - 2px);
28
+ line-height: var(--mwe-line-height, 1.5rem);
29
+ padding: calc(var(--mwe-editor-padding, 16px) - 8px) 8px;
30
+ text-align: right;
31
+ overflow: hidden;
32
+ user-select: none;
33
+ }
34
+
35
+ .mw-editor-line-number {
36
+ height: var(--mwe-line-height, 1.5rem);
37
+ line-height: var(--mwe-line-height, 1.5rem);
38
+ }
39
+
40
+ .mw-editor-textarea {
41
+ flex: 1 1 auto;
42
+ min-height: 320px;
43
+ width: 100%;
44
+ border: none;
45
+ resize: none;
46
+ background: var(--mwe-bg-surface, var(--bg-panel, #11151a));
47
+ color: var(--mwe-fg-primary, var(--fg-primary, #e9ecf1));
48
+ font-family: var(--mwe-font-mono, var(--font-mono, ui-monospace, monospace));
49
+ font-size: var(--mwe-font-size, 13px);
50
+ line-height: var(--mwe-line-height, 1.5rem);
51
+ padding: var(--mwe-editor-padding, 16px);
52
+ outline: none;
53
+ }
54
+
55
+ .mw-editor-textarea::selection {
56
+ background: color-mix(in srgb, var(--mwe-accent, var(--accent, #7c9cff)) 28%, transparent);
57
+ }