react-codemirror-merge

CodeMirror merge view for React.
Install
npm install react-codemirror-merge --save
Usage
import CodeMirrorMerge from 'react-codemirror-merge';
import { EditorView } from 'codemirror';
import { EditorState } from '@codemirror/state';
const Original = CodeMirrorMerge.Original;
const Modified = CodeMirrorMerge.Modified;
let doc = `one
two
three
four
five`;
export const Example = () => {
return (
<CodeMirrorMerge orientation="b-a">
<Original value={doc} />
<Modified
value={doc.replace(/t/g, 'T') + 'Six'}
extensions={[EditorView.editable.of(false), EditorState.readOnly.of(true)]}
/>
</CodeMirrorMerge>
);
};
Theme
import { useState } from 'react';
import CodeMirrorMerge from 'react-codemirror-merge';
import { EditorView } from 'codemirror';
import { EditorState } from '@codemirror/state';
const Original = CodeMirrorMerge.Original;
const Modified = CodeMirrorMerge.Modified;
let doc = `one
two
three
four
five`;
export const Example = () => {
const [theme, setTheme] = useState('light');
return (
<CodeMirrorMerge orientation="b-a" theme={theme}>
<Original value={doc} />
<Modified
value={doc.replace(/t/g, 'T') + 'Six'}
extensions={[EditorView.editable.of(false), EditorState.readOnly.of(true)]}
/>
</CodeMirrorMerge>
);
};
import React, { useState } from 'react';
import CodeMirrorMerge from 'react-codemirror-merge';
import { EditorView } from '@codemirror/view';
import { javascript } from '@codemirror/lang-javascript';
import { githubLight, githubDark } from '@uiw/codemirror-theme-github';
const Original = CodeMirrorMerge.Original;
const Modified = CodeMirrorMerge.Modified;
let doc = `function examle() {
}`;
function Example() {
const [theme, setTheme] = useState('light');
return (
<div>
<CodeMirrorMerge theme={theme === 'light' ? githubLight : githubDark} orientation="a-b">
<Original extensions={[javascript({ jsx: true }), EditorView.lineWrapping]} value={doc} />
<Modified extensions={[EditorView.lineWrapping, javascript({ jsx: true })]} value={doc.replace(/e/g, 'T')} />
</CodeMirrorMerge>
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>Change Theme {theme}</button>
</div>
);
}
Props
import { Extension } from '@codemirror/state';
export interface CodeMirrorMergeRef extends InternalRef {}
export interface CodeMirrorMergeProps extends React.HTMLAttributes<HTMLDivElement>, MergeConfig {
theme?: 'light' | 'dark' | 'none' | Extension;
}
interface MergeConfig {
orientation?: 'a-b' | 'b-a';
revertControls?: 'a-to-b' | 'b-to-a';
renderRevertControl?: () => HTMLElement;
highlightChanges?: boolean;
gutter?: boolean;
collapseUnchanged?: {
margin?: number;
minSize?: number;
};
}
Modified Props
interface ModifiedProps extends Omit<DefaultExtensionsOptions, 'theme'> {
value?: string | Text;
selection?:
| EditorSelection
| {
anchor: number;
head?: number;
};
extensions?: Extension;
onChange?(value: string, viewUpdate: ViewUpdate): void;
}
import { Extension } from '@codemirror/state';
import { BasicSetupOptions } from '@uiw/codemirror-extensions-basic-setup';
import { DefaultExtensionsOptions } from '@uiw/react-codemirror';
export interface DefaultExtensionsOptions {
indentWithTab?: boolean;
basicSetup?: boolean | BasicSetupOptions;
placeholder?: string | HTMLElement;
theme?: 'light' | 'dark' | 'none' | Extension;
readOnly?: boolean;
editable?: boolean;
}
Original Props
interface OriginalProps extends Omit<DefaultExtensionsOptions, 'theme'> {
value?: string | Text;
selection?:
| EditorSelection
| {
anchor: number;
head?: number;
};
extensions?: Extension;
onChange?(value: string, viewUpdate: ViewUpdate): void;
}
import { Extension } from '@codemirror/state';
import { BasicSetupOptions } from '@uiw/codemirror-extensions-basic-setup';
import { DefaultExtensionsOptions } from '@uiw/react-codemirror';
export interface DefaultExtensionsOptions {
indentWithTab?: boolean;
basicSetup?: boolean | BasicSetupOptions;
placeholder?: string | HTMLElement;
theme?: 'light' | 'dark' | 'none' | Extension;
readOnly?: boolean;
editable?: boolean;
}
Contributors
As always, thanks to our amazing contributors!
Made with github-action-contributors.
License
Licensed under the MIT License.