Skip to content

Commit 0a6a619

Browse files
d3m1d0vmakhnatkin
andauthored
feat!: markdown-editor@15 (#604)
* feat(deps)!: move lodash from peerDependencies to dependencies * feat(deps): upd gravity-ui/icons to v2.12.0 * feat(deps): upd gravity-ui/i18n to v1.7.0 * test(deps): update jest to v29.7.0 * feat: update typescript to v5.7.3 * feat!: removed deprecated properties from MarkdownEditorOptions type (#580) * feat!: removed deprecated properties (#583) * feat(package)!: drop typesVersions and improve exports (#585) * feat(build)!: use new jsx transform (#586) * feat(deps): update ProseMirror and CodeMirror packages (#589) * feat(deps): update lezer packages (#590) * feat(deps): updated @diplodoc/transform and related packages (#591) * feat!: update esm and cjs build (#592) * build: bump gulp-utils to v1.0.1 * feat(types)!: updated MarkdownSerializer types (#596) * feat(presets): fixed commonmark-specs preset * feat!: change re-exports from `src/plugins` * feat!: update uikit to v7 * feat(bundle)!: remove toaster from MarkdownEditorView props * fix(core): fixed circularr dependencies --------- Co-authored-by: Sergey Makhnatkin <[email protected]>
1 parent 94b9c00 commit 0a6a619

File tree

255 files changed

+4961
-8329
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

255 files changed

+4961
-8329
lines changed

.babelrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
}
1111
],
1212
"@babel/preset-typescript",
13-
"@babel/preset-react"
13+
["@babel/preset-react", {
14+
"runtime": "automatic"
15+
}]
1416
],
1517
"plugins": []
1618
}

.storybook/preview.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import type {Preview} from '@storybook/react';
22
import {MINIMAL_VIEWPORTS} from '@storybook/addon-viewport';
33
import {withThemeProvider} from '../demo/hocs/withThemeProvider';
44
import {withLang} from '../demo/hocs/withLang';
5+
import {withToaster} from '../demo/hocs/withToaster';
56

67
const preview: Preview = {
7-
decorators: [withThemeProvider, withLang],
8+
decorators: [withThemeProvider, withLang, withToaster],
89
parameters: {
910
jsx: {showFunctions: true}, // To show functions in sources
1011
viewport: {

README-ru.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ npm install @gravity-ui/markdown-editor
3030
```tsx
3131
import React from 'react';
3232
import {useMarkdownEditor, MarkdownEditorView} from '@gravity-ui/markdown-editor';
33-
import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18';
3433

3534
function Editor({onSubmit}) {
3635
const editor = useMarkdownEditor({allowHTML: false});
@@ -48,7 +47,7 @@ function Editor({onSubmit}) {
4847
};
4948
}, [onSubmit]);
5049

51-
return <MarkdownEditorView stickyToolbar autofocus toaster={toaster} editor={editor} />;
50+
return <MarkdownEditorView stickyToolbar autofocus editor={editor} />;
5251
}
5352
```
5453

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ To set up styling and theme see [UIKit docs](https://github.com/gravity-ui/uikit
3030
```tsx
3131
import React from 'react';
3232
import {useMarkdownEditor, MarkdownEditorView} from '@gravity-ui/markdown-editor';
33-
import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18';
3433

3534
function Editor({onSubmit}) {
3635
const editor = useMarkdownEditor({allowHTML: false});
@@ -48,7 +47,7 @@ function Editor({onSubmit}) {
4847
};
4948
}, [onSubmit]);
5049

51-
return <MarkdownEditorView stickyToolbar autofocus toaster={toaster} editor={editor} />;
50+
return <MarkdownEditorView stickyToolbar autofocus editor={editor} />;
5251
}
5352
```
5453
Read more:

demo/.eslintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"extends": "@gravity-ui/eslint-config/client"
2+
"extends": ["@gravity-ui/eslint-config/client", "plugin:react/jsx-runtime"]
33
}

demo/components/PMSelection.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import {useLayoutEffect} from 'react';
22

33
import {EditorView} from 'prosemirror-view';
44
import {useEffectOnce, useUpdate} from 'react-use';
@@ -23,7 +23,7 @@ export function WysiwygSelection({editor, className}: WysiwygSelectionProps) {
2323

2424
const view = editor?.currentMode === 'wysiwyg' && editor._wysiwygView;
2525

26-
React.useLayoutEffect(() => {
26+
useLayoutEffect(() => {
2727
if (!editor) return undefined;
2828
editor.on(
2929
// @ts-expect-error TODO: add public event for selection change

demo/components/Playground.tsx

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import React, {CSSProperties, useCallback, useEffect, useState} from 'react';
1+
import {CSSProperties, memo, useCallback, useEffect, useState} from 'react';
22

33
import {defaultOptions} from '@diplodoc/transform/lib/sanitize';
44
import {Button, DropdownMenu} from '@gravity-ui/uikit';
5-
import {toaster} from '@gravity-ui/uikit/toaster-singleton-react-18';
65

76
import {
87
type DirectiveSyntaxValue,
@@ -75,14 +74,7 @@ export type PlaygroundProps = {
7574
onChangeEditorType?: (mode: MarkdownEditorMode) => void;
7675
onChangeSplitModeEnabled?: (splitModeEnabled: boolean) => void;
7776
directiveSyntax?: DirectiveSyntaxValue;
78-
} & Pick<
79-
UseMarkdownEditorProps,
80-
| 'needToSetDimensionsForUploadedImages'
81-
| 'extraExtensions'
82-
| 'renderPreview'
83-
| 'extensionOptions'
84-
| 'experimental'
85-
> &
77+
} & Pick<UseMarkdownEditorProps, 'experimental' | 'wysiwygConfig'> &
8678
Pick<
8779
MarkdownEditorViewProps,
8880
| 'markupHiddenActionsConfig'
@@ -99,7 +91,7 @@ logger.setLogger({
9991
...console,
10092
});
10193

102-
export const Playground = React.memo<PlaygroundProps>((props) => {
94+
export const Playground = memo<PlaygroundProps>((props) => {
10395
const {
10496
initial,
10597
initialEditor,
@@ -116,8 +108,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
116108
stickyToolbar,
117109
renderPreviewDefined,
118110
height,
119-
extraExtensions,
120-
extensionOptions,
111+
wysiwygConfig,
121112
toolbarsPreset,
122113
wysiwygToolbarConfig,
123114
wysiwygCommandMenuConfig,
@@ -126,16 +117,13 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
126117
placeholderOptions,
127118
enableSubmitInPreview,
128119
hidePreviewAfterSubmit,
129-
needToSetDimensionsForUploadedImages,
130120
experimental,
131121
directiveSyntax,
132122
} = props;
133-
const [editorMode, setEditorMode] = React.useState<MarkdownEditorMode>(
134-
initialEditor ?? 'wysiwyg',
135-
);
136-
const [mdRaw, setMdRaw] = React.useState<MarkupString>(initial || '');
123+
const [editorMode, setEditorMode] = useState<MarkdownEditorMode>(initialEditor ?? 'wysiwyg');
124+
const [mdRaw, setMdRaw] = useState<MarkupString>(initial || '');
137125

138-
React.useEffect(() => {
126+
useEffect(() => {
139127
updateLocation(mdRaw);
140128
}, [mdRaw]);
141129

@@ -193,39 +181,44 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
193181
</style
194182
`,
195183
});
196-
if (extraExtensions) builder.use(extraExtensions);
184+
if (wysiwygConfig?.extensions) builder.use(wysiwygConfig.extensions);
185+
},
186+
extensionOptions: {
187+
commandMenu: {actions: wysiwygCommandMenuConfig ?? wCommandMenuConfig},
188+
imgSize: {
189+
parseInsertedUrlAsImage,
190+
},
191+
...wysiwygConfig?.extensionOptions,
197192
},
198193
},
199-
allowHTML,
200-
linkify,
201-
linkifyTlds,
202-
initialMarkup: mdRaw,
203-
breaks: breaks ?? true,
204-
initialEditorMode: editorMode,
205-
initialSplitModeEnabled: initialSplitModeEnabled,
206-
initialToolbarVisible: true,
207-
splitMode: splitModeOrientation,
208-
needToSetDimensionsForUploadedImages,
209-
renderPreview: renderPreviewDefined ? renderPreview : undefined,
210-
fileUploadHandler,
194+
md: {
195+
html: allowHTML,
196+
linkify,
197+
linkifyTlds,
198+
breaks: breaks ?? true,
199+
},
200+
initial: {
201+
markup: mdRaw,
202+
mode: editorMode,
203+
toolbarVisible: true,
204+
splitModeEnabled: initialSplitModeEnabled,
205+
},
206+
handlers: {
207+
uploadFile: fileUploadHandler,
208+
},
211209
experimental: {
212210
...experimental,
213211
directiveSyntax,
214-
preserveEmptyRows: preserveEmptyRows,
215-
},
216-
prepareRawMarkup: prepareRawMarkup
217-
? (value) => '**prepare raw markup**\n\n' + value
218-
: undefined,
219-
extensionOptions: {
220-
commandMenu: {actions: wysiwygCommandMenuConfig ?? wCommandMenuConfig},
221-
imgSize: {
222-
parseInsertedUrlAsImage,
223-
},
224-
...extensionOptions,
212+
preserveEmptyRows,
213+
prepareRawMarkup: prepareRawMarkup
214+
? (value) => '**prepare raw markup**\n\n' + value
215+
: undefined,
225216
},
226217
markupConfig: {
227218
extensions: markupConfigExtensions,
228219
parseInsertedUrlAsImage,
220+
renderPreview,
221+
splitMode: splitModeOrientation,
229222
},
230223
},
231224
[
@@ -236,8 +229,7 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
236229
splitModeOrientation,
237230
renderPreviewDefined,
238231
renderPreview,
239-
extraExtensions,
240-
needToSetDimensionsForUploadedImages,
232+
experimental?.needToSetDimensionsForUploadedImages,
241233
initial,
242234
experimental?.enableNewImageSizeCalculation,
243235
experimental?.needToSetDimensionsForUploadedImages,
@@ -300,7 +292,6 @@ export const Playground = React.memo<PlaygroundProps>((props) => {
300292
view={({className}) => (
301293
<MarkdownEditorView
302294
autofocus
303-
toaster={toaster}
304295
className={className}
305296
stickyToolbar={Boolean(stickyToolbar)}
306297
toolbarsPreset={toolbarsPreset}

demo/components/PlaygroundLayout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useEffect} from 'react';
1+
import {StrictMode, useEffect} from 'react';
22

33
import {useUpdate} from 'react-use';
44

@@ -49,14 +49,14 @@ export const PlaygroundLayout: React.FC<PlaygroundLayoutProps> = function Playgr
4949

5050
<hr />
5151

52-
<React.StrictMode>
52+
<StrictMode>
5353
<div className={b('editor')} style={{height: props.viewHeight ?? 'initial'}}>
5454
{props.view({className: b('editor-view')})}
5555

5656
<WysiwygDevTools editor={editor} />
5757
<WysiwygSelection editor={editor} className={b('pm-selection')} />
5858
</div>
59-
</React.StrictMode>
59+
</StrictMode>
6060

6161
<hr />
6262

demo/components/PlaygroundMini.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import {memo} from 'react';
22

33
import {getInitialMd} from '../utils/getInitialMd';
44

@@ -25,7 +25,7 @@ export type PlaygroundMiniProps = Pick<
2525
| 'directiveSyntax'
2626
> & {withDefaultInitialContent?: boolean};
2727

28-
export const PlaygroundMini = React.memo<PlaygroundMiniProps>(
28+
export const PlaygroundMini = memo<PlaygroundMiniProps>(
2929
({withDefaultInitialContent, initial, ...props}) => (
3030
<Playground
3131
{...props}

demo/components/ProseMirrorDevTools.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import {useEffect, useLayoutEffect} from 'react';
22

33
import {applyDevTools, removeDevTools} from 'prosemirror-dev-toolkit';
44
import {EditorView} from 'prosemirror-view';
@@ -18,7 +18,7 @@ export function WysiwygDevTools({editor}: WysiwygDevToolsProps) {
1818

1919
const view = editor?.currentMode === 'wysiwyg' && editor._wysiwygView;
2020

21-
React.useLayoutEffect(() => {
21+
useLayoutEffect(() => {
2222
if (!editor) return undefined;
2323
editor.on('change-editor-mode', rerender);
2424
return () => {
@@ -36,7 +36,7 @@ type ProseMirrorDevToolsProps = {
3636
};
3737

3838
function ProseMirrorDevTools({view}: ProseMirrorDevToolsProps) {
39-
React.useEffect(() => {
39+
useEffect(() => {
4040
applyDevTools(view);
4141
return () => {
4242
removeDevTools();

0 commit comments

Comments
 (0)