@gravity-ui/markdown-editor 15.10.1 → 15.11.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.
- package/build/cjs/bundle/MarkdownEditorView.d.ts +2 -1
- package/build/cjs/bundle/MarkdownEditorView.js +7 -3
- package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
- package/build/cjs/bundle/settings/index.d.ts +3 -1
- package/build/cjs/bundle/settings/index.js +9 -4
- package/build/cjs/bundle/settings/index.js.map +1 -1
- package/build/cjs/extensions/additional/GPT/constants.js +2 -2
- package/build/cjs/extensions/additional/GPT/constants.js.map +1 -1
- package/build/cjs/extensions/markdown/Image/imageUrlPaste/index.js +10 -1
- package/build/cjs/extensions/markdown/Image/imageUrlPaste/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Lists/commands.js +1 -1
- package/build/cjs/extensions/markdown/Lists/commands.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +9 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/cjs/markup/codemirror/create.js +15 -4
- package/build/cjs/markup/codemirror/create.js.map +1 -1
- package/build/cjs/styles/list.css +13 -0
- package/build/cjs/styles/styles.css +14 -0
- package/build/cjs/utils/clipboard.js +3 -0
- package/build/cjs/utils/clipboard.js.map +1 -1
- package/build/cjs/utils/input-state.d.ts +6 -0
- package/build/cjs/utils/input-state.js +18 -0
- package/build/cjs/utils/input-state.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/MarkdownEditorView.d.ts +2 -1
- package/build/esm/bundle/MarkdownEditorView.js +7 -3
- package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
- package/build/esm/bundle/settings/index.d.ts +3 -1
- package/build/esm/bundle/settings/index.js +9 -4
- package/build/esm/bundle/settings/index.js.map +1 -1
- package/build/esm/extensions/additional/GPT/constants.js +2 -2
- package/build/esm/extensions/additional/GPT/constants.js.map +1 -1
- package/build/esm/extensions/markdown/Image/imageUrlPaste/index.js +10 -1
- package/build/esm/extensions/markdown/Image/imageUrlPaste/index.js.map +1 -1
- package/build/esm/extensions/markdown/Lists/commands.js +1 -1
- package/build/esm/extensions/markdown/Lists/commands.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +9 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/esm/markup/codemirror/create.js +15 -4
- package/build/esm/markup/codemirror/create.js.map +1 -1
- package/build/esm/styles/list.css +13 -0
- package/build/esm/styles/styles.css +14 -0
- package/build/esm/utils/clipboard.js +3 -0
- package/build/esm/utils/clipboard.js.map +1 -1
- package/build/esm/utils/input-state.d.ts +6 -0
- package/build/esm/utils/input-state.js +14 -0
- package/build/esm/utils/input-state.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +25 -22
- package/package.json +2 -2
- package/build/cjs/styles/markdown copy.css +0 -24
- package/build/esm/styles/markdown copy.css +0 -24
|
@@ -6,6 +6,7 @@ const autocomplete_1 = require("@codemirror/autocomplete");
|
|
|
6
6
|
const commands_1 = require("@codemirror/commands");
|
|
7
7
|
const language_1 = require("@codemirror/language");
|
|
8
8
|
const view_1 = require("@codemirror/view");
|
|
9
|
+
const input_state_1 = require("../../utils/input-state.js");
|
|
9
10
|
const action_names_1 = require("../../bundle/config/action-names.js");
|
|
10
11
|
const logger_1 = require("../../logger.js");
|
|
11
12
|
const shortcuts_1 = require("../../shortcuts/index.js");
|
|
@@ -28,6 +29,7 @@ function createCodemirror(params) {
|
|
|
28
29
|
if (!disabledExtensions.history) {
|
|
29
30
|
extensions.push((0, commands_1.history)());
|
|
30
31
|
}
|
|
32
|
+
const inputState = new input_state_1.InputState();
|
|
31
33
|
extensions.push((0, language_1.syntaxHighlighting)(gravity_1.gravityHighlightStyle), logger_facet_1.LoggerFacet.of(logger), view_1.keymap.of([
|
|
32
34
|
{ key: shortcuts_1.formatter.toCM(shortcuts_1.Action.Bold), run: withLogger(action_names_1.ActionName.bold, commands_2.toggleBold) },
|
|
33
35
|
{ key: shortcuts_1.formatter.toCM(shortcuts_1.Action.Italic), run: withLogger(action_names_1.ActionName.italic, commands_2.toggleItalic) },
|
|
@@ -73,9 +75,15 @@ function createCodemirror(params) {
|
|
|
73
75
|
scroll(event) {
|
|
74
76
|
onScroll(event);
|
|
75
77
|
},
|
|
78
|
+
keydown(event) {
|
|
79
|
+
inputState.keydown(event);
|
|
80
|
+
},
|
|
81
|
+
keyup(event) {
|
|
82
|
+
inputState.keyup(event);
|
|
83
|
+
},
|
|
76
84
|
paste(event, editor) {
|
|
77
85
|
if (!event.clipboardData)
|
|
78
|
-
return;
|
|
86
|
+
return false;
|
|
79
87
|
const pasteLogger = logger.nested({
|
|
80
88
|
domEvent: 'paste',
|
|
81
89
|
dataTypes: event.clipboardData.types,
|
|
@@ -91,7 +99,7 @@ function createCodemirror(params) {
|
|
|
91
99
|
logger.event({ event: 'paste-markup' });
|
|
92
100
|
const reindentedYfmContent = (0, smart_reindent_1.smartReindent)(yfmContent, currentLine);
|
|
93
101
|
editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));
|
|
94
|
-
return;
|
|
102
|
+
return true;
|
|
95
103
|
}
|
|
96
104
|
// checking if a copy buffer content is suitable for convertion
|
|
97
105
|
const shouldSkipHtml = (0, clipboard_1.shouldSkipHtmlConversion)(event.clipboardData);
|
|
@@ -119,10 +127,10 @@ function createCodemirror(params) {
|
|
|
119
127
|
logger.event({ event: 'paste-parsed-html' });
|
|
120
128
|
const reindentedHtmlContent = (0, smart_reindent_1.smartReindent)(parsedMarkdownMarkup, currentLine);
|
|
121
129
|
editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));
|
|
122
|
-
return;
|
|
130
|
+
return true;
|
|
123
131
|
}
|
|
124
132
|
}
|
|
125
|
-
if (parseInsertedUrlAsImage) {
|
|
133
|
+
if (!inputState.shiftKey && parseInsertedUrlAsImage) {
|
|
126
134
|
const linkMatches = currentLine.matchAll(linkRegex);
|
|
127
135
|
const cursorPositionInCurrentLine = from - line.from;
|
|
128
136
|
const isInsertedInsideLink = linkMatches.some((item) => cursorPositionInCurrentLine >= item.index &&
|
|
@@ -139,6 +147,7 @@ function createCodemirror(params) {
|
|
|
139
147
|
title,
|
|
140
148
|
},
|
|
141
149
|
])(editor);
|
|
150
|
+
return true;
|
|
142
151
|
}
|
|
143
152
|
}
|
|
144
153
|
}
|
|
@@ -149,7 +158,9 @@ function createCodemirror(params) {
|
|
|
149
158
|
if (pastedText !== reindentedText) {
|
|
150
159
|
editor.dispatch(editor.state.replaceSelection(reindentedText));
|
|
151
160
|
event.preventDefault();
|
|
161
|
+
return true;
|
|
152
162
|
}
|
|
163
|
+
return false;
|
|
153
164
|
},
|
|
154
165
|
}));
|
|
155
166
|
if (searchPanel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":"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","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {type Logger2, globalLogger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {LoggerFacet} from './logger-facet';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nconst linkRegex = /\\[[\\s\\S]*?]\\([\\s\\S]*?\\)/g;\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n logger: Logger2.ILogger;\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n searchPanel?: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n logger,\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n searchPanel = true,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n LoggerFacet.of(logger),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: event.clipboardData.types,\n });\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n logger.event({event: 'paste-markup'});\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n pasteLogger.error(e, {event: 'parse-html-to-md'});\n globalLogger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n logger.event({event: 'paste-parsed-html'});\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return;\n }\n }\n\n if (parseInsertedUrlAsImage) {\n const linkMatches = currentLine.matchAll(linkRegex);\n const cursorPositionInCurrentLine = from - line.from;\n const isInsertedInsideLink = linkMatches.some(\n (item) =>\n cursorPositionInCurrentLine >= item.index &&\n cursorPositionInCurrentLine <= item.index + (item[0]?.length ?? 0),\n );\n\n if (!isInsertedInsideLink) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n logger.event({event: 'paste-url-as-image'});\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n }\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n }\n },\n }),\n );\n\n if (searchPanel) {\n extensions.push(\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n }\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n const {state} = args[0];\n state.facet(LoggerFacet).action({source: 'keymap', action});\n globalLogger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":";;AA+FA,4CA+OC;AAED,gCAOC;AAvVD,2DAAwD;AACxD,mDAO8B;AAC9B,mDAAwD;AAExD,2CAM0B;AAE1B,4DAAiD;AAIjD,sEAA4D;AAE5D,4CAAwD;AACxD,wDAA4D;AAE5D,wDAAiF;AAEjF,mDAkBqB;AAErB,0DAAuD;AACvD,gEAAoF;AACpF,0CAA8D;AAC9D,iEAAgE;AAChE,oDAA2C;AAC3C,sDAA2D;AAC3D,kDAAiD;AACjD,sDAAyD;AACzD,8DAA+C;AAC/C,kCAAmD;AAMnD,MAAM,SAAS,GAAG,0BAA0B,CAAC;AA8B7C,SAAgB,gBAAgB,CAAC,MAA8B;IAC3D,MAAM,EACF,MAAM,EACN,GAAG,EACH,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,kBAAkB,GAAG,EAAE,EACvB,OAAO,GAAG,EAAE,EACZ,QAAQ,EACR,cAAc,EACd,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,WAAW,GAAG,IAAI,GACrB,GAAG,MAAM,CAAC;IAEX,MAAM,UAAU,GAAgB,CAAC,sBAAY,EAAE,IAAA,kBAAW,EAAC,kBAAkB,CAAC,CAAC,CAAC;IAEhF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,IAAA,kBAAO,GAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,wBAAU,EAAE,CAAC;IAEpC,UAAU,CAAC,IAAI,CACX,IAAA,6BAAkB,EAAC,+BAAqB,CAAC,EACzC,0BAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EACtB,aAAM,CAAC,EAAE,CAAC;QACN,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,IAAI,EAAE,qBAAU,CAAC,EAAC;QACpE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,MAAM,EAAE,uBAAY,CAAC,EAAC;QAC1E,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,MAAM,EAAE,8BAAmB,CAAC,EAAC;QACjF,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,SAAS,EAAE,0BAAe,CAAC,EAAC;QACnF,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,IAAI,EAAE,qBAAU,CAAC,EAAC;QACpE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,eAAI,CAAC,EAAC;QACtE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,WAAW,EAAE,2BAAgB,CAAC,EAAC;QACjF,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,UAAU,EAAE,0BAAe,CAAC,EAAC;QACpF,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,GAAG,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,OAAO,EAAE,uBAAY,CAAC,EAAC;QACxE,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,wBAAa,CAAC,EAAC;QAC3E;YACI,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAE;YACtB,cAAc,EAAE,IAAI;YACpB,GAAG,EAAE,GAAG,EAAE;gBACN,QAAQ,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ;QACD;YACI,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAE;YACtB,cAAc,EAAE,IAAI;YACpB,GAAG,EAAE,GAAG,EAAE;gBACN,QAAQ,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ;QACD,EAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAS,EAAC;QAClD;YACI,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,kCAAuB;SACjC;QACD,wBAAa;QACb,GAAG,wBAAa;QAChB,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAa,CAAC;QACpD,GAAG,OAAO;KACb,CAAC,EACF,IAAA,6BAAc,EAAC,oBAAoB,CAAC,EACpC,IAAA,aAAO,EAAC,cAAc,CAAC,EACvB,gCAAkB,CAAC,EAAE,CAAC,aAAa,CAAC,EACpC,sCAAoB,CAAC,EAAE,CAAC,eAAe,CAAC,EACxC,0CAA0B,EAC1B,iBAAU,CAAC,YAAY,EACvB,iBAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAC,UAAU,EAAE,MAAM,EAAC,CAAC,EACrD,iBAAU,CAAC,gBAAgB,CAAC;QACxB,MAAM,CAAC,KAAK;YACR,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,KAAK;YACT,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,KAAK;YACP,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,MAAM;YACf,IAAI,CAAC,KAAK,CAAC,aAAa;gBAAE,OAAO,KAAK,CAAC;YAEvC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC9B,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK;aACvC,CAAC,CAAC;YAEH,MAAM,EAAC,IAAI,EAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;YAE9B,6EAA6E;YAC7E,6CAA6C;YAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,4BAAgB,CAAC,GAAG,CAAC,CAAC;YACrE,IAAI,UAAU,EAAE,CAAC;gBACb,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,cAAc,EAAC,CAAC,CAAC;gBACtC,MAAM,oBAAoB,GAAG,IAAA,8BAAa,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACrE,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,+DAA+D;YAC/D,MAAM,cAAc,GAAG,IAAA,oCAAwB,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAErE,gDAAgD;YAChD,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,4BAAgB,CAAC,IAAI,CAAC,CAAC;YACvE,sEAAsE;YACtE,IAAI,WAAW,IAAI,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrD,IAAI,oBAAwC,CAAC;gBAC7C,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEjE,MAAM,SAAS,GAAG,IAAI,8BAAiB,EAAE,CAAC;oBAC1C,oBAAoB,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,iFAAiF;oBACjF,4DAA4D;oBAC5D,6EAA6E;oBAC7E,wDAAwD;oBACxD,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAC,CAAC,CAAC;oBAClD,qBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;gBAED,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;oBACrC,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,mBAAmB,EAAC,CAAC,CAAC;oBAC3C,MAAM,qBAAqB,GAAG,IAAA,8BAAa,EACvC,oBAAoB,EACpB,WAAW,CACd,CAAC;oBACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC;oBACtE,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,uBAAuB,EAAE,CAAC;gBAClD,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,2BAA2B,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACrD,MAAM,oBAAoB,GAAG,WAAW,CAAC,IAAI,CACzC,CAAC,IAAI,EAAE,EAAE,CACL,2BAA2B,IAAI,IAAI,CAAC,KAAK;oBACzC,2BAA2B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CACzE,CAAC;gBAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACxB,MAAM,EAAC,QAAQ,EAAE,KAAK,EAAC,GACnB,uBAAuB,CACnB,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,4BAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAC3D,IAAI,EAAE,CAAC;oBAEZ,IAAI,QAAQ,EAAE,CAAC;wBACX,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,oBAAoB,EAAC,CAAC,CAAC;wBAC5C,IAAA,uBAAY,EAAC;4BACT;gCACI,GAAG,EAAE,QAAQ;gCACb,GAAG,EAAE,KAAK;gCACV,KAAK;6BACR;yBACJ,CAAC,CAAC,MAAM,CAAC,CAAC;wBACX,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;YACL,CAAC;YAED,gCAAgC;YAChC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,4BAAgB,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,cAAc,GAAG,IAAA,8BAAa,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC9D,gDAAgD;YAChD,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;gBAChC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC/D,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;KACJ,CAAC,CACL,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,CACX,IAAA,0BAAiB,EAAC;YACd,cAAc,EAAE,qBAAqB;YACrC,QAAQ;SACX,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACpB,UAAU,CAAC,IAAI,CACX,aAAM,CAAC,EAAE,CAAC;YACN,EAAC,GAAG,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAE,EAAE,GAAG,EAAE,UAAU,CAAC,yBAAU,CAAC,QAAQ,EAAE,yBAAc,CAAC,EAAC;SACnF,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CACX,2CAAsB,CAAC,EAAE,CAAC;YACtB,EAAE,EAAE,MAAM,CAAC,aAAa;YACxB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,6BAA6B,EAAE,MAAM,CAAC,6BAA6B;SACtE,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,iBAAU,CAAC;QAClB,GAAG;QACH,UAAU;QACV,oBAAoB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,QAAQ,EAAE,CAAC;YACX,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,WAAW,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc,EAAE,OAAqB;IAC5D,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,0BAAW,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;QAC5D,qBAAY,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport {InputState} from 'src/utils/input-state';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {type Logger2, globalLogger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {LoggerFacet} from './logger-facet';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nconst linkRegex = /\\[[\\s\\S]*?]\\([\\s\\S]*?\\)/g;\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n logger: Logger2.ILogger;\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n searchPanel?: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n logger,\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n searchPanel = true,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n const inputState = new InputState();\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n LoggerFacet.of(logger),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n keydown(event) {\n inputState.keydown(event);\n },\n keyup(event) {\n inputState.keyup(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: event.clipboardData.types,\n });\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n logger.event({event: 'paste-markup'});\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return true;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n pasteLogger.error(e, {event: 'parse-html-to-md'});\n globalLogger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n logger.event({event: 'paste-parsed-html'});\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return true;\n }\n }\n\n if (!inputState.shiftKey && parseInsertedUrlAsImage) {\n const linkMatches = currentLine.matchAll(linkRegex);\n const cursorPositionInCurrentLine = from - line.from;\n const isInsertedInsideLink = linkMatches.some(\n (item) =>\n cursorPositionInCurrentLine >= item.index &&\n cursorPositionInCurrentLine <= item.index + (item[0]?.length ?? 0),\n );\n\n if (!isInsertedInsideLink) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n logger.event({event: 'paste-url-as-image'});\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n return true;\n }\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n return true;\n }\n\n return false;\n },\n }),\n );\n\n if (searchPanel) {\n extensions.push(\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n }\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n const {state} = args[0];\n state.facet(LoggerFacet).action({source: 'keymap', action});\n globalLogger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
TDOD: delete it after https://github.com/diplodoc-platform/transform/pull/708
|
|
3
|
+
fix spacing for last paragraph and empty paragraphs with cursor (override YFM style)
|
|
4
|
+
*/
|
|
5
|
+
@supports selector(:has(br)) {
|
|
6
|
+
.yfm li > p:only-of-type:has(br),
|
|
7
|
+
.yfm li > blockquote:only-of-type:has(br) {
|
|
8
|
+
margin-block: 0;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
.yfm li > p:last-child {
|
|
12
|
+
margin-block: var(--yfm-list-text-only-margin-block, 0);
|
|
13
|
+
}
|
|
@@ -21,4 +21,18 @@
|
|
|
21
21
|
--yfm-colorify-green: var(--yfm-color-text-green);
|
|
22
22
|
--yfm-colorify-blue: var(--yfm-color-text-blue);
|
|
23
23
|
--yfm-colorify-violet: var(--yfm-color-text-violet);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
TDOD: delete it after https://github.com/diplodoc-platform/transform/pull/708
|
|
28
|
+
fix spacing for last paragraph and empty paragraphs with cursor (override YFM style)
|
|
29
|
+
*/
|
|
30
|
+
@supports selector(:has(br)) {
|
|
31
|
+
.yfm li > p:only-of-type:has(br),
|
|
32
|
+
.yfm li > blockquote:only-of-type:has(br) {
|
|
33
|
+
margin-block: 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
.yfm li > p:last-child {
|
|
37
|
+
margin-block: var(--yfm-list-text-only-margin-block, 0);
|
|
24
38
|
}
|
|
@@ -49,6 +49,9 @@ function shouldSkipHtmlConversion(clipboardData) {
|
|
|
49
49
|
// If there's no HTML content, skip conversion
|
|
50
50
|
if (!hasHtml)
|
|
51
51
|
return true;
|
|
52
|
+
// Check for HTML only (text/html)
|
|
53
|
+
if (clipboardData.types.length === 1)
|
|
54
|
+
return false;
|
|
52
55
|
// Check for standard HTML clipboard (text/plain + text/html)
|
|
53
56
|
if (clipboardData.types.length === 2)
|
|
54
57
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAUD,gDAOC;AAKD,
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAUD,gDAOC;AAKD,4DAoBC;AAvED,4CAA4C;AAC5C,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,gCAAhB,gBAAgB,QAQ3B;AAED,SAAgB,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,SAAgB,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAUD,SAAgB,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InputState = void 0;
|
|
4
|
+
class InputState {
|
|
5
|
+
#shiftKey = false;
|
|
6
|
+
get shiftKey() {
|
|
7
|
+
return this.#shiftKey;
|
|
8
|
+
}
|
|
9
|
+
keydown(e) {
|
|
10
|
+
this.#shiftKey = e.code.startsWith('Shift') || e.shiftKey;
|
|
11
|
+
}
|
|
12
|
+
keyup(e) {
|
|
13
|
+
if (e.code.startsWith('Shift'))
|
|
14
|
+
this.#shiftKey = false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.InputState = InputState;
|
|
18
|
+
//# sourceMappingURL=input-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-state.js","sourceRoot":"../../../src","sources":["utils/input-state.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IACnB,SAAS,GAAG,KAAK,CAAC;IAElB,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,CAAgB;QACpB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,CAAgB;QAClB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3D,CAAC;CACJ;AAdD,gCAcC","sourcesContent":["export class InputState {\n #shiftKey = false;\n\n get shiftKey() {\n return this.#shiftKey;\n }\n\n keydown(e: KeyboardEvent) {\n this.#shiftKey = e.code.startsWith('Shift') || e.shiftKey;\n }\n\n keyup(e: KeyboardEvent) {\n if (e.code.startsWith('Shift')) this.#shiftKey = false;\n }\n}\n"]}
|
package/build/cjs/version.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
/** During build process, the current version will be injected here */
|
|
5
|
-
exports.VERSION = typeof '15.
|
|
5
|
+
exports.VERSION = typeof '15.11.1' !== 'undefined' ? '15.11.1' : 'unknown';
|
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/build/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.11.1' !== 'undefined' ? '15.11.1' : 'unknown';\n"]}
|
|
@@ -2,6 +2,7 @@ import { type QAProps } from '@gravity-ui/uikit';
|
|
|
2
2
|
import { type ClassNameProps } from "../classname.js";
|
|
3
3
|
import type { ToolbarsPreset } from "../modules/toolbars/types.js";
|
|
4
4
|
import type { Editor } from "./Editor.js";
|
|
5
|
+
import { type SettingItems } from "./settings/index.js";
|
|
5
6
|
import type { MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData } from "./toolbar/types.js";
|
|
6
7
|
import "../styles/styles.css";
|
|
7
8
|
import "./MarkdownEditorView.css";
|
|
@@ -28,7 +29,7 @@ type ViewProps = {
|
|
|
28
29
|
editor?: Editor;
|
|
29
30
|
autofocus?: boolean;
|
|
30
31
|
/** @default true */
|
|
31
|
-
settingsVisible?: boolean;
|
|
32
|
+
settingsVisible?: boolean | SettingItems[];
|
|
32
33
|
toolbarsPreset?: ToolbarsPreset;
|
|
33
34
|
stickyToolbar: boolean;
|
|
34
35
|
enableSubmitInPreview?: boolean;
|
|
@@ -20,7 +20,7 @@ import "../styles/styles.css";
|
|
|
20
20
|
import "./MarkdownEditorView.css"; // eslint-disable-line import/order
|
|
21
21
|
export const cnEditorComponent = cn('editor-component');
|
|
22
22
|
const b = cnEditorComponent;
|
|
23
|
-
const EditorWrapper = forwardRef(({ autofocus, editor, editorMode, enableSubmitInPreview, hidePreviewAfterSubmit, isFocused, markupHiddenActionsConfig: initialMarkupHiddenActionsConfig, markupToolbarConfig: initialMarkupToolbarConfig, qa, settingsVisible, showPreview, stickyToolbar, toggleShowPreview, toolbarsPreset, unsetShowPreview, wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig, wysiwygToolbarConfig: initialWysiwygToolbarConfig, }, ref) => {
|
|
23
|
+
const EditorWrapper = forwardRef(({ autofocus, editor, editorMode, enableSubmitInPreview, hidePreviewAfterSubmit, isFocused, markupHiddenActionsConfig: initialMarkupHiddenActionsConfig, markupToolbarConfig: initialMarkupToolbarConfig, qa, settingsVisible: settingsVisibleProp, showPreview, stickyToolbar, toggleShowPreview, toolbarsPreset, unsetShowPreview, wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig, wysiwygToolbarConfig: initialWysiwygToolbarConfig, }, ref) => {
|
|
24
24
|
const { wysiwygToolbarConfig, markupToolbarConfig, wysiwygHiddenActionsConfig, markupHiddenActionsConfig, } = useMemo(() => getToolbarsConfigs({
|
|
25
25
|
toolbarsPreset,
|
|
26
26
|
props: {
|
|
@@ -78,12 +78,14 @@ const EditorWrapper = forwardRef(({ autofocus, editor, editorMode, enableSubmitI
|
|
|
78
78
|
stickyToolbar,
|
|
79
79
|
toolbarVisibility: editor.toolbarVisible && !showPreview,
|
|
80
80
|
};
|
|
81
|
+
const areSettingsVisible = settingsVisibleProp === true ||
|
|
82
|
+
(Array.isArray(settingsVisibleProp) && settingsVisibleProp.length > 0);
|
|
81
83
|
return (_jsx("div", { className: b('editor-wrapper'), ref: ref, "data-qa": qa, "data-mode": editor.currentMode, children: showPreview ? (_jsxs(_Fragment, { children: [_jsx("div", { className: b('preview-wrapper'), children: editor.renderPreview?.({
|
|
82
84
|
getValue: editor.getValue,
|
|
83
85
|
mode: 'preview',
|
|
84
86
|
md: editor.mdOptions,
|
|
85
87
|
directiveSyntax: editor.directiveSyntax,
|
|
86
|
-
}) }), _jsx(Settings, { ...settingsProps, settingsVisible:
|
|
88
|
+
}) }), _jsx(Settings, { ...settingsProps, settingsVisible: settingsVisibleProp })] })) : (_jsxs(_Fragment, { children: [editorMode === 'wysiwyg' && (_jsx(WysiwygEditorView, { editor: editor, autofocus: autofocus, settingsVisible: areSettingsVisible, toolbarConfig: wysiwygToolbarConfig, toolbarVisible: editor.toolbarVisible, hiddenActionsConfig: wysiwygHiddenActionsConfig, className: b('editor', { mode: editorMode }), toolbarClassName: b('toolbar'), stickyToolbar: stickyToolbar, children: _jsx(Settings, { ...settingsProps, settingsVisible: editor.toolbarVisible && settingsVisibleProp }) })), editorMode === 'markup' && (_jsx(MarkupEditorView, { editor: editor, autofocus: autofocus, settingsVisible: areSettingsVisible, toolbarConfig: markupToolbarConfig, toolbarVisible: editor.toolbarVisible, splitMode: editor.splitMode, splitModeEnabled: editor.splitModeEnabled, hiddenActionsConfig: markupHiddenActionsConfig, className: b('editor', { mode: editorMode }), toolbarClassName: b('toolbar'), stickyToolbar: stickyToolbar, children: _jsx(Settings, { ...settingsProps, settingsVisible: editor.toolbarVisible && settingsVisibleProp }) })), _jsx(Settings, { ...settingsProps, settingsVisible: !editor.toolbarVisible && settingsVisibleProp, renderPreviewButton: !editor.toolbarVisible && editorMode === 'markup' })] })) }));
|
|
87
89
|
});
|
|
88
90
|
EditorWrapper.displayName = 'EditorWrapper';
|
|
89
91
|
export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
@@ -115,6 +117,8 @@ export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
|
115
117
|
divRef.current.focus();
|
|
116
118
|
}
|
|
117
119
|
}, [divRef, showPreview]);
|
|
120
|
+
const areSettingsVisible = settingsVisible === true ||
|
|
121
|
+
(Array.isArray(settingsVisible) && settingsVisible.length > 0);
|
|
118
122
|
return (_jsx(ErrorBoundary, { onError: (e) => {
|
|
119
123
|
globalLogger.error(e);
|
|
120
124
|
editor.logger.error(e);
|
|
@@ -135,7 +139,7 @@ export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
|
135
139
|
});
|
|
136
140
|
return null;
|
|
137
141
|
}, children: _jsxs("div", { ref: divRef, "data-qa": qa, className: b({
|
|
138
|
-
settings:
|
|
142
|
+
settings: areSettingsVisible,
|
|
139
143
|
split: markupSplitMode && editor.splitMode,
|
|
140
144
|
}, [className]), role: "button", tabIndex: 0, children: [_jsx(EditorWrapper, { autofocus: autofocus, editor: editor, editorMode: editorMode, enableSubmitInPreview: enableSubmitInPreview, hidePreviewAfterSubmit: hidePreviewAfterSubmit, isFocused: isWrapperFocused(divRef), markupHiddenActionsConfig: markupHiddenActionsConfig, markupToolbarConfig: markupToolbarConfig, qa: "g-md-editor-mode", ref: editorWrapperRef, settingsVisible: settingsVisible, showPreview: showPreview, stickyToolbar: stickyToolbar, toggleShowPreview: toggleShowPreview, toolbarsPreset: toolbarsPreset, unsetShowPreview: unsetShowPreview, wysiwygHiddenActionsConfig: wysiwygHiddenActionsConfig, wysiwygToolbarConfig: wysiwygToolbarConfig }), markupSplitMode && (_jsxs(_Fragment, { children: [editor.splitMode === 'horizontal' ? (_jsx(HorizontalDrag, { editor: editor, isMounted: isMounted, leftElRef: editorWrapperRef, rightElRef: splitModeViewWrapperRef, wrapperRef: divRef })) : (_jsx("div", { className: b('resizer') })), _jsx(SplitModeView, { editor: editor, ref: splitModeViewWrapperRef })] }))] }) }));
|
|
141
145
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkdownEditorView.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,OAAO,EACP,MAAM,EACN,QAAQ,GACX,MAAM,OAAO,CAAC;AAEf,OAAO,EAAe,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAsB,EAAE,EAAC,wBAAqB;AACrD,OAAO,EAAC,IAAI,EAAC,gCAAuB;AACpC,OAAO,EAAC,YAAY,EAAC,qBAAkB;AAEvC,OAAO,EAAC,eAAe,EAAE,SAAS,EAAC,gCAAuB;AAC1D,OAAO,EAAC,KAAK,EAAC,0BAAiB;AAG/B,OAAO,EAAC,cAAc,EAAC,4BAAyB;AAChD,OAAO,EAAC,gBAAgB,EAAC,8BAA2B;AACpD,OAAO,EAAC,aAAa,EAAC,2BAAwB;AAC9C,OAAO,EAAC,iBAAiB,EAAC,+BAA4B;AACtD,OAAO,EAAC,wBAAwB,EAAC,qBAAkB;AACnD,OAAO,EAAC,cAAc,EAA2B,4BAAmB;AACpE,OAAO,EAAC,QAAQ,EAAC,0BAAiB;AAElC,OAAO,EAAC,kBAAkB,EAAC,2CAAwC;AAGnE,8BAA+B;AAC/B,kCAAmC,CAAC,mCAAmC;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC;AACxD,MAAM,CAAC,GAAG,iBAAiB,CAAC;AAU5B,MAAM,aAAa,GAAG,UAAU,CAC5B,CACI,EACI,SAAS,EACT,MAAM,EACN,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,SAAS,EACT,yBAAyB,EAAE,gCAAgC,EAC3D,mBAAmB,EAAE,0BAA0B,EAC/C,EAAE,EACF,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,0BAA0B,EAAE,iCAAiC,EAC7D,oBAAoB,EAAE,2BAA2B,GACpD,EACD,GAAG,EACL,EAAE;IACA,MAAM,EACF,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,GAC5B,GAAG,OAAO,CACP,GAAG,EAAE,CACD,kBAAkB,CAAC;QACf,cAAc;QACd,KAAK,EAAE;YACH,oBAAoB,EAAE,2BAA2B;YACjD,mBAAmB,EAAE,0BAA0B;YAC/C,0BAA0B,EAAE,iCAAiC;YAC7D,yBAAyB,EAAE,gCAAgC;SAC9D;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;KACxB,CAAC,EACN;QACI,cAAc;QACd,2BAA2B;QAC3B,0BAA0B;QAC1B,iCAAiC;QACjC,gCAAgC;QAChC,MAAM,CAAC,MAAM;KAChB,CACJ,CAAC;IACF,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,IAAwB,EAAE,EAAE;QACzB,MAAM,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;QAC1D,gBAAgB,EAAE,CAAC;IACvB,CAAC,EACD,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAC7B,CAAC;IACF,MAAM,yBAAyB,GAAG,WAAW,CACzC,CAAC,OAAgB,EAAE,EAAE;QACjB,MAAM,CAAC,uBAAuB,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,MAAM,CAAC,CACX,CAAC;IACF,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,gBAAyB,EAAE,EAAE;QAC1B,gBAAgB,EAAE,CAAC;QACnB,MAAM,CAAC,sBAAsB,CAAC,EAAC,gBAAgB,EAAC,CAAC,CAAC;IACtD,CAAC,EACD,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAC7B,CAAC;IACF,MAAM,mBAAmB,GAAG,WAAW,CACnC,CAAC,gBAAyB,EAAE,EAAE;QAC1B,MAAM,CAAC,sBAAsB,CAAC,EAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAC;QACzD,IAAI,gBAAgB,KAAK,WAAW;YAAE,iBAAiB,EAAE,CAAC;IAC9D,CAAC,EACD,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC3C,CAAC;IACF,MAAM,gBAAgB,GAAG,OAAO,CAC5B,MAAM,CAAC,aAAa,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC9E,CAAC;IAEF,MAAM,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAC9C,CAAC,CAAC,EAAE,EAAE;QACF,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,mBAAmB,CAAC,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,EACD,EAAC,KAAK,EAAE,SAAS,EAAC,EAClB,CAAC,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CACnE,CAAC;IAEF,MAAM,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,IAAI,WAAW,IAAI,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,EACvF,GAAG,EAAE;QACD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE5B,IAAI,sBAAsB,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EACD,EAAC,KAAK,EAAE,SAAS,EAAC,EAClB,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,CAAC,CAC5E,CAAC;IAEF,MAAM,aAAa,GAAG;QAClB,IAAI,EAAE,UAAU;QAChB,YAAY;QACZ,mBAAmB;QACnB,iBAAiB;QACjB,yBAAyB;QACzB,mBAAmB,EAAE,gBAAgB;QACrC,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,aAAa;QACb,iBAAiB,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC,WAAW;KAC3D,CAAC;IAEF,OAAO,CACH,cACI,SAAS,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC9B,GAAG,EAAE,GAAG,aACC,EAAE,eACA,MAAM,CAAC,WAAW,YAE5B,WAAW,CAAC,CAAC,CAAC,CACX,8BACI,cAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,YAC/B,MAAM,CAAC,aAAa,EAAE,CAAC;wBACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,IAAI,EAAE,SAAS;wBACf,EAAE,EAAE,MAAM,CAAC,SAAS;wBACpB,eAAe,EAAE,MAAM,CAAC,eAAe;qBAC1C,CAAC,GACA,EACN,KAAC,QAAQ,OAAK,aAAa,EAAE,eAAe,EAAE,eAAe,GAAI,IAClE,CACN,CAAC,CAAC,CAAC,CACA,8BACK,UAAU,KAAK,SAAS,IAAI,CACzB,KAAC,iBAAiB,IACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,oBAAoB,EACnC,cAAc,EAAE,MAAM,CAAC,cAAc,EACrC,mBAAmB,EAAE,0BAA0B,EAC/C,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC,EAC1C,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC9B,aAAa,EAAE,aAAa,YAE5B,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,eAAe,IAAI,MAAM,CAAC,cAAc,GAC3D,GACc,CACvB,EACA,UAAU,KAAK,QAAQ,IAAI,CACxB,KAAC,gBAAgB,IACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,mBAAmB,EAClC,cAAc,EAAE,MAAM,CAAC,cAAc,EACrC,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EACzC,mBAAmB,EAAE,yBAAyB,EAC9C,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC,EAC1C,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC9B,aAAa,EAAE,aAAa,YAE5B,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,eAAe,IAAI,MAAM,CAAC,cAAc,GAC3D,GACa,CACtB,EACD,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,eAAe,EAC1D,mBAAmB,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,UAAU,KAAK,QAAQ,GACxE,IACH,CACN,GACC,CACT,CAAC;AACN,CAAC,CACJ,CAAC;AAEF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAkC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CACxC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACX,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAA6C,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,EAAE,AAAD,EAAG,gBAAgB,EAAE,iBAAiB,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEpF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE;QACX,YAAY,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAc,CAAC;IACtD,IAAI,CAAC,MAAM;QACP,MAAM,IAAI,KAAK,CACX,6FAA6F,CAChG,CAAC;IAEN,MAAM,EACF,SAAS,EACT,SAAS,EACT,qBAAqB,GAAG,IAAI,EAC5B,sBAAsB,GAAG,KAAK,EAC9B,yBAAyB,EACzB,mBAAmB,EACnB,EAAE,EACF,eAAe,GAAG,IAAI,EACtB,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,oBAAoB,GACvB,GAAG,KAAK,CAAC;IAEV,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IACtC,MAAM,eAAe,GACjB,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,SAAS,IAAI,UAAU,KAAK,QAAQ,CAAC;IAE3E,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE1B,OAAO,CACH,KAAC,aAAa,IACV,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACX,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,EACD,cAAc,EAAE,CAAC,EAAC,KAAK,EAAE,kBAAkB,EAAC,EAAE,EAAE;YAC5C,OAAO,CAAC,GAAG,CAAC;gBACR,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;aACzB,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,EAAE;gBACZ,kBAAkB,EAAE,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC;oBACpB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,gBAAgB;oBACxB,IAAI,EAAE,KAAK;iBACd,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QAChB,CAAC,YAED,eACI,GAAG,EAAE,MAAM,aACF,EAAE,EACX,SAAS,EAAE,CAAC,CACR;gBACI,QAAQ,EAAE,eAAe;gBACzB,KAAK,EAAE,eAAe,IAAI,MAAM,CAAC,SAAS;aAC7C,EACD,CAAC,SAAS,CAAC,CACd,EACD,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,aAEX,KAAC,aAAa,IACV,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC,EACnC,yBAAyB,EAAE,yBAAyB,EACpD,mBAAmB,EAAE,mBAAmB,EACxC,EAAE,EAAC,kBAAkB,EACrB,GAAG,EAAE,gBAAgB,EACrB,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,0BAA0B,EAAE,0BAA0B,EACtD,oBAAoB,EAAE,oBAAoB,GAC5C,EAED,eAAe,IAAI,CAChB,8BACK,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,CACjC,KAAC,cAAc,IACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,uBAAuB,EACnC,UAAU,EAAE,MAAM,GACpB,CACL,CAAC,CAAC,CAAC,CACA,cAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAI,CACnC,EACD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,GAAI,IAChE,CACN,IACC,GACM,CACnB,CAAC;AACN,CAAC,CACJ,CAAC;AACF,kBAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC;AAItD,MAAM,kBAAkB,GAAsC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACtE,4BAAG,IAAI,KAAK,QAAQ,IAAI,cAAK,SAAS,EAAC,oBAAoB,GAAO,GAAI,CACzE,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAqD;IACnE,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,CAAC;IAEzF,OAAO,CACH,4BACK,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CACrD,cAAK,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,YACjC,eACI,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;oBACzB,WAAW,EAAE,KAAK,CAAC,iBAAiB;oBACpC,YAAY,EAAE,QAAQ;iBACzB,CAAC,aAEF,KAAC,cAAc,OAAK,KAAK,GAAI,EAC7B,KAAC,kBAAkB,OAAK,KAAK,GAAI,IAC/B,GACJ,CACT,GACF,CACN,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAgB;IACtC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,OAAO,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuC;IAC7D,OAAO,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,OAAO,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,CAAgB;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,OAAO,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AACxC,CAAC","sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {type QAProps, useToaster} from '@gravity-ui/uikit';\nimport {ErrorBoundary} from 'react-error-boundary';\nimport {useEnsuredForwardedRef, useKey, useUpdate} from 'react-use';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/bundle';\nimport {globalLogger} from '../logger';\nimport type {ToolbarsPreset} from '../modules/toolbars/types';\nimport {useBooleanState, useSticky} from '../react-utils';\nimport {isMac} from '../utils';\n\nimport type {Editor, EditorInt} from './Editor';\nimport {HorizontalDrag} from './HorizontalDrag';\nimport {MarkupEditorView} from './MarkupEditorView';\nimport {SplitModeView} from './SplitModeView';\nimport {WysiwygEditorView} from './WysiwygEditorView';\nimport {useMarkdownEditorContext} from './context';\nimport {EditorSettings, type EditorSettingsProps} from './settings';\nimport {stickyCn} from './sticky';\nimport type {MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData} from './toolbar/types';\nimport {getToolbarsConfigs} from './toolbar/utils/toolbarsConfigs';\nimport type {MarkdownEditorMode} from './types';\n\nimport '../styles/styles.scss';\nimport './MarkdownEditorView.scss'; // eslint-disable-line import/order\n\nexport const cnEditorComponent = cn('editor-component');\nconst b = cnEditorComponent;\n\ninterface EditorWrapperProps extends QAProps, ToolbarConfigs, Omit<ViewProps, 'editor'> {\n editor: EditorInt;\n editorMode: MarkdownEditorMode;\n isFocused: boolean;\n showPreview: boolean;\n toggleShowPreview: () => void;\n unsetShowPreview: () => void;\n}\nconst EditorWrapper = forwardRef<HTMLDivElement, EditorWrapperProps>(\n (\n {\n autofocus,\n editor,\n editorMode,\n enableSubmitInPreview,\n hidePreviewAfterSubmit,\n isFocused,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n qa,\n settingsVisible,\n showPreview,\n stickyToolbar,\n toggleShowPreview,\n toolbarsPreset,\n unsetShowPreview,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n },\n ref,\n ) => {\n const {\n wysiwygToolbarConfig,\n markupToolbarConfig,\n wysiwygHiddenActionsConfig,\n markupHiddenActionsConfig,\n } = useMemo(\n () =>\n getToolbarsConfigs({\n toolbarsPreset,\n props: {\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n },\n preset: editor.preset,\n }),\n [\n toolbarsPreset,\n initialWysiwygToolbarConfig,\n initialMarkupToolbarConfig,\n initialWysiwygHiddenActionsConfig,\n initialMarkupHiddenActionsConfig,\n editor.preset,\n ],\n );\n const onModeChange = useCallback(\n (type: MarkdownEditorMode) => {\n editor.changeEditorMode({mode: type, reason: 'settings'});\n unsetShowPreview();\n },\n [editor, unsetShowPreview],\n );\n const onToolbarVisibilityChange = useCallback(\n (visible: boolean) => {\n editor.changeToolbarVisibility({visible});\n },\n [editor],\n );\n const onSplitModeChange = useCallback(\n (splitModeEnabled: boolean) => {\n unsetShowPreview();\n editor.changeSplitModeEnabled({splitModeEnabled});\n },\n [editor, unsetShowPreview],\n );\n const onShowPreviewChange = useCallback(\n (showPreviewValue: boolean) => {\n editor.changeSplitModeEnabled({splitModeEnabled: false});\n if (showPreviewValue !== showPreview) toggleShowPreview();\n },\n [editor, showPreview, toggleShowPreview],\n );\n const canRenderPreview = Boolean(\n editor.renderPreview && editorMode === 'markup' && !editor.splitModeEnabled,\n );\n\n useKey(\n (e) => canRenderPreview && isPreviewKeyDown(e),\n (e) => {\n e.preventDefault();\n onShowPreviewChange(!showPreview);\n },\n {event: 'keydown'},\n [showPreview, editorMode, onShowPreviewChange, canRenderPreview],\n );\n\n useKey(\n (e) => Boolean(enableSubmitInPreview && showPreview && isFocused && isSubmitKeyDown(e)),\n () => {\n editor.emit('submit', null);\n\n if (hidePreviewAfterSubmit) {\n onShowPreviewChange(false);\n }\n },\n {event: 'keydown'},\n [hidePreviewAfterSubmit, enableSubmitInPreview, showPreview, showPreview],\n );\n\n const settingsProps = {\n mode: editorMode,\n onModeChange,\n onShowPreviewChange,\n onSplitModeChange,\n onToolbarVisibilityChange,\n renderPreviewButton: canRenderPreview,\n showPreview,\n splitMode: editor.splitMode,\n splitModeEnabled: editor.splitModeEnabled,\n stickyToolbar,\n toolbarVisibility: editor.toolbarVisible && !showPreview,\n };\n\n return (\n <div\n className={b('editor-wrapper')}\n ref={ref}\n data-qa={qa}\n data-mode={editor.currentMode}\n >\n {showPreview ? (\n <>\n <div className={b('preview-wrapper')}>\n {editor.renderPreview?.({\n getValue: editor.getValue,\n mode: 'preview',\n md: editor.mdOptions,\n directiveSyntax: editor.directiveSyntax,\n })}\n </div>\n <Settings {...settingsProps} settingsVisible={settingsVisible} />\n </>\n ) : (\n <>\n {editorMode === 'wysiwyg' && (\n <WysiwygEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={wysiwygToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n hiddenActionsConfig={wysiwygHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n <Settings\n {...settingsProps}\n settingsVisible={settingsVisible && editor.toolbarVisible}\n />\n </WysiwygEditorView>\n )}\n {editorMode === 'markup' && (\n <MarkupEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={markupToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n splitMode={editor.splitMode}\n splitModeEnabled={editor.splitModeEnabled}\n hiddenActionsConfig={markupHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n <Settings\n {...settingsProps}\n settingsVisible={settingsVisible && editor.toolbarVisible}\n />\n </MarkupEditorView>\n )}\n <Settings\n {...settingsProps}\n settingsVisible={!editor.toolbarVisible && settingsVisible}\n renderPreviewButton={!editor.toolbarVisible && editorMode === 'markup'}\n />\n </>\n )}\n </div>\n );\n },\n);\n\nEditorWrapper.displayName = 'EditorWrapper';\n\ntype ToolbarConfigs = {\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupToolbarConfig?: MToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygToolbarConfig?: WToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupHiddenActionsConfig?: MToolbarItemData[];\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygHiddenActionsConfig?: WToolbarItemData[];\n};\n\ntype ViewProps = {\n editor?: Editor;\n autofocus?: boolean;\n /** @default true */\n settingsVisible?: boolean;\n toolbarsPreset?: ToolbarsPreset;\n stickyToolbar: boolean;\n enableSubmitInPreview?: boolean;\n hidePreviewAfterSubmit?: boolean;\n};\n\nexport type MarkdownEditorViewProps = ClassNameProps & ToolbarConfigs & ViewProps & QAProps & {};\n\nexport const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewProps>(\n (props, ref) => {\n const divRef = useEnsuredForwardedRef(ref as React.MutableRefObject<HTMLDivElement>);\n const editorWrapperRef = useRef(null);\n const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);\n\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const context = useMarkdownEditorContext();\n const editor = (props.editor ?? context) as EditorInt;\n if (!editor)\n throw new Error(\n '[MarkdownEditorView]: an instance of the editor must be passed through the props or context',\n );\n\n const {\n autofocus,\n className,\n enableSubmitInPreview = true,\n hidePreviewAfterSubmit = false,\n markupHiddenActionsConfig,\n markupToolbarConfig,\n qa,\n settingsVisible = true,\n stickyToolbar,\n toolbarsPreset,\n wysiwygHiddenActionsConfig,\n wysiwygToolbarConfig,\n } = props;\n\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender', rerender);\n return () => {\n editor.off('rerender', rerender);\n };\n }, [editor, rerender]);\n\n const editorMode = editor.currentMode;\n const markupSplitMode =\n editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';\n\n const splitModeViewWrapperRef = useRef(null);\n\n const toaster = useToaster();\n\n useEffect(() => {\n if (showPreview) {\n divRef.current.focus();\n }\n }, [divRef, showPreview]);\n\n return (\n <ErrorBoundary\n onError={(e) => {\n globalLogger.error(e);\n editor.logger.error(e);\n }}\n fallbackRender={({error, resetErrorBoundary}) => {\n toaster.add({\n theme: 'danger',\n name: 'g-md-editor-error',\n title: i18n('error-title'),\n content: error.message,\n });\n setTimeout(() => {\n resetErrorBoundary();\n editor.changeEditorMode({\n mode: 'markup',\n reason: 'error-boundary',\n emit: false,\n });\n });\n return null;\n }}\n >\n <div\n ref={divRef}\n data-qa={qa}\n className={b(\n {\n settings: settingsVisible,\n split: markupSplitMode && editor.splitMode,\n },\n [className],\n )}\n role=\"button\"\n tabIndex={0}\n >\n <EditorWrapper\n autofocus={autofocus}\n editor={editor}\n editorMode={editorMode}\n enableSubmitInPreview={enableSubmitInPreview}\n hidePreviewAfterSubmit={hidePreviewAfterSubmit}\n isFocused={isWrapperFocused(divRef)}\n markupHiddenActionsConfig={markupHiddenActionsConfig}\n markupToolbarConfig={markupToolbarConfig}\n qa=\"g-md-editor-mode\"\n ref={editorWrapperRef}\n settingsVisible={settingsVisible}\n showPreview={showPreview}\n stickyToolbar={stickyToolbar}\n toggleShowPreview={toggleShowPreview}\n toolbarsPreset={toolbarsPreset}\n unsetShowPreview={unsetShowPreview}\n wysiwygHiddenActionsConfig={wysiwygHiddenActionsConfig}\n wysiwygToolbarConfig={wysiwygToolbarConfig}\n />\n\n {markupSplitMode && (\n <>\n {editor.splitMode === 'horizontal' ? (\n <HorizontalDrag\n editor={editor}\n isMounted={isMounted}\n leftElRef={editorWrapperRef}\n rightElRef={splitModeViewWrapperRef}\n wrapperRef={divRef}\n />\n ) : (\n <div className={b('resizer')} />\n )}\n <SplitModeView editor={editor} ref={splitModeViewWrapperRef} />\n </>\n )}\n </div>\n </ErrorBoundary>\n );\n },\n);\nMarkdownEditorView.displayName = 'MarkdownEditorView';\n\ninterface MarkupSearchAnchorProps extends Pick<EditorSettingsProps, 'mode'> {}\n\nconst MarkupSearchAnchor: React.FC<MarkupSearchAnchorProps> = ({mode}) => (\n <>{mode === 'markup' && <div className=\"g-md-search-anchor\"></div>}</>\n);\n\nfunction Settings(props: EditorSettingsProps & {stickyToolbar: boolean}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isSticky = useSticky(wrapperRef) && props.toolbarVisibility && props.stickyToolbar;\n\n return (\n <>\n {(props.renderPreviewButton || props.settingsVisible) && (\n <div className={b('settings-wrapper')}>\n <div\n ref={wrapperRef}\n className={stickyCn.settings({\n withToolbar: props.toolbarVisibility,\n stickyActive: isSticky,\n })}\n >\n <EditorSettings {...props} />\n <MarkupSearchAnchor {...props} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction isPreviewKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.shiftKey && e.code === 'KeyP';\n}\n\nfunction isWrapperFocused(divRef: React.RefObject<HTMLDivElement>) {\n return document.activeElement === divRef.current;\n}\n\nfunction isSubmitKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.code === 'Enter';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarkdownEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkdownEditorView.tsx"],"names":[],"mappings":";AAAA,OAAO,EACH,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,OAAO,EACP,MAAM,EACN,QAAQ,GACX,MAAM,OAAO,CAAC;AAEf,OAAO,EAAe,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAsB,EAAE,EAAC,wBAAqB;AACrD,OAAO,EAAC,IAAI,EAAC,gCAAuB;AACpC,OAAO,EAAC,YAAY,EAAC,qBAAkB;AAEvC,OAAO,EAAC,eAAe,EAAE,SAAS,EAAC,gCAAuB;AAC1D,OAAO,EAAC,KAAK,EAAC,0BAAiB;AAG/B,OAAO,EAAC,cAAc,EAAC,4BAAyB;AAChD,OAAO,EAAC,gBAAgB,EAAC,8BAA2B;AACpD,OAAO,EAAC,aAAa,EAAC,2BAAwB;AAC9C,OAAO,EAAC,iBAAiB,EAAC,+BAA4B;AACtD,OAAO,EAAC,wBAAwB,EAAC,qBAAkB;AACnD,OAAO,EAAC,cAAc,EAA8C,4BAAmB;AACvF,OAAO,EAAC,QAAQ,EAAC,0BAAiB;AAElC,OAAO,EAAC,kBAAkB,EAAC,2CAAwC;AAGnE,8BAA+B;AAC/B,kCAAmC,CAAC,mCAAmC;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC;AACxD,MAAM,CAAC,GAAG,iBAAiB,CAAC;AAU5B,MAAM,aAAa,GAAG,UAAU,CAC5B,CACI,EACI,SAAS,EACT,MAAM,EACN,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,SAAS,EACT,yBAAyB,EAAE,gCAAgC,EAC3D,mBAAmB,EAAE,0BAA0B,EAC/C,EAAE,EACF,eAAe,EAAE,mBAAmB,EACpC,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,0BAA0B,EAAE,iCAAiC,EAC7D,oBAAoB,EAAE,2BAA2B,GACpD,EACD,GAAG,EACL,EAAE;IACA,MAAM,EACF,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,GAC5B,GAAG,OAAO,CACP,GAAG,EAAE,CACD,kBAAkB,CAAC;QACf,cAAc;QACd,KAAK,EAAE;YACH,oBAAoB,EAAE,2BAA2B;YACjD,mBAAmB,EAAE,0BAA0B;YAC/C,0BAA0B,EAAE,iCAAiC;YAC7D,yBAAyB,EAAE,gCAAgC;SAC9D;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;KACxB,CAAC,EACN;QACI,cAAc;QACd,2BAA2B;QAC3B,0BAA0B;QAC1B,iCAAiC;QACjC,gCAAgC;QAChC,MAAM,CAAC,MAAM;KAChB,CACJ,CAAC;IACF,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,IAAwB,EAAE,EAAE;QACzB,MAAM,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;QAC1D,gBAAgB,EAAE,CAAC;IACvB,CAAC,EACD,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAC7B,CAAC;IACF,MAAM,yBAAyB,GAAG,WAAW,CACzC,CAAC,OAAgB,EAAE,EAAE;QACjB,MAAM,CAAC,uBAAuB,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,MAAM,CAAC,CACX,CAAC;IACF,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,gBAAyB,EAAE,EAAE;QAC1B,gBAAgB,EAAE,CAAC;QACnB,MAAM,CAAC,sBAAsB,CAAC,EAAC,gBAAgB,EAAC,CAAC,CAAC;IACtD,CAAC,EACD,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAC7B,CAAC;IACF,MAAM,mBAAmB,GAAG,WAAW,CACnC,CAAC,gBAAyB,EAAE,EAAE;QAC1B,MAAM,CAAC,sBAAsB,CAAC,EAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAC;QACzD,IAAI,gBAAgB,KAAK,WAAW;YAAE,iBAAiB,EAAE,CAAC;IAC9D,CAAC,EACD,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC3C,CAAC;IACF,MAAM,gBAAgB,GAAG,OAAO,CAC5B,MAAM,CAAC,aAAa,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC9E,CAAC;IAEF,MAAM,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAC9C,CAAC,CAAC,EAAE,EAAE;QACF,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,mBAAmB,CAAC,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,EACD,EAAC,KAAK,EAAE,SAAS,EAAC,EAClB,CAAC,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CACnE,CAAC;IAEF,MAAM,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,IAAI,WAAW,IAAI,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,EACvF,GAAG,EAAE;QACD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE5B,IAAI,sBAAsB,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EACD,EAAC,KAAK,EAAE,SAAS,EAAC,EAClB,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,CAAC,CAC5E,CAAC;IAEF,MAAM,aAAa,GAAG;QAClB,IAAI,EAAE,UAAU;QAChB,YAAY;QACZ,mBAAmB;QACnB,iBAAiB;QACjB,yBAAyB;QACzB,mBAAmB,EAAE,gBAAgB;QACrC,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,aAAa;QACb,iBAAiB,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC,WAAW;KAC3D,CAAC;IAEF,MAAM,kBAAkB,GACpB,mBAAmB,KAAK,IAAI;QAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3E,OAAO,CACH,cACI,SAAS,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC9B,GAAG,EAAE,GAAG,aACC,EAAE,eACA,MAAM,CAAC,WAAW,YAE5B,WAAW,CAAC,CAAC,CAAC,CACX,8BACI,cAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,YAC/B,MAAM,CAAC,aAAa,EAAE,CAAC;wBACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,IAAI,EAAE,SAAS;wBACf,EAAE,EAAE,MAAM,CAAC,SAAS;wBACpB,eAAe,EAAE,MAAM,CAAC,eAAe;qBAC1C,CAAC,GACA,EACN,KAAC,QAAQ,OAAK,aAAa,EAAE,eAAe,EAAE,mBAAmB,GAAI,IACtE,CACN,CAAC,CAAC,CAAC,CACA,8BACK,UAAU,KAAK,SAAS,IAAI,CACzB,KAAC,iBAAiB,IACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,kBAAkB,EACnC,aAAa,EAAE,oBAAoB,EACnC,cAAc,EAAE,MAAM,CAAC,cAAc,EACrC,mBAAmB,EAAE,0BAA0B,EAC/C,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC,EAC1C,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC9B,aAAa,EAAE,aAAa,YAE5B,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,MAAM,CAAC,cAAc,IAAI,mBAAmB,GAC/D,GACc,CACvB,EACA,UAAU,KAAK,QAAQ,IAAI,CACxB,KAAC,gBAAgB,IACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,kBAAkB,EACnC,aAAa,EAAE,mBAAmB,EAClC,cAAc,EAAE,MAAM,CAAC,cAAc,EACrC,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EACzC,mBAAmB,EAAE,yBAAyB,EAC9C,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC,EAC1C,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC9B,aAAa,EAAE,aAAa,YAE5B,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,MAAM,CAAC,cAAc,IAAI,mBAAmB,GAC/D,GACa,CACtB,EACD,KAAC,QAAQ,OACD,aAAa,EACjB,eAAe,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,mBAAmB,EAC9D,mBAAmB,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,UAAU,KAAK,QAAQ,GACxE,IACH,CACN,GACC,CACT,CAAC;AACN,CAAC,CACJ,CAAC;AAEF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAmC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CACxC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACX,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAA6C,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,EAAE,AAAD,EAAG,gBAAgB,EAAE,iBAAiB,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEpF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE;QACX,YAAY,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAc,CAAC;IACtD,IAAI,CAAC,MAAM;QACP,MAAM,IAAI,KAAK,CACX,6FAA6F,CAChG,CAAC;IAEN,MAAM,EACF,SAAS,EACT,SAAS,EACT,qBAAqB,GAAG,IAAI,EAC5B,sBAAsB,GAAG,KAAK,EAC9B,yBAAyB,EACzB,mBAAmB,EACnB,EAAE,EACF,eAAe,GAAG,IAAI,EACtB,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,oBAAoB,GACvB,GAAG,KAAK,CAAC;IAEV,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IACtC,MAAM,eAAe,GACjB,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,SAAS,IAAI,UAAU,KAAK,QAAQ,CAAC;IAE3E,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE1B,MAAM,kBAAkB,GACpB,eAAe,KAAK,IAAI;QACxB,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEnE,OAAO,CACH,KAAC,aAAa,IACV,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACX,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,EACD,cAAc,EAAE,CAAC,EAAC,KAAK,EAAE,kBAAkB,EAAC,EAAE,EAAE;YAC5C,OAAO,CAAC,GAAG,CAAC;gBACR,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;aACzB,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,EAAE;gBACZ,kBAAkB,EAAE,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC;oBACpB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,gBAAgB;oBACxB,IAAI,EAAE,KAAK;iBACd,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QAChB,CAAC,YAED,eACI,GAAG,EAAE,MAAM,aACF,EAAE,EACX,SAAS,EAAE,CAAC,CACR;gBACI,QAAQ,EAAE,kBAAkB;gBAC5B,KAAK,EAAE,eAAe,IAAI,MAAM,CAAC,SAAS;aAC7C,EACD,CAAC,SAAS,CAAC,CACd,EACD,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,aAEX,KAAC,aAAa,IACV,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC,EACnC,yBAAyB,EAAE,yBAAyB,EACpD,mBAAmB,EAAE,mBAAmB,EACxC,EAAE,EAAC,kBAAkB,EACrB,GAAG,EAAE,gBAAgB,EACrB,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,0BAA0B,EAAE,0BAA0B,EACtD,oBAAoB,EAAE,oBAAoB,GAC5C,EAED,eAAe,IAAI,CAChB,8BACK,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,CACjC,KAAC,cAAc,IACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,uBAAuB,EACnC,UAAU,EAAE,MAAM,GACpB,CACL,CAAC,CAAC,CAAC,CACA,cAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAI,CACnC,EACD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,GAAI,IAChE,CACN,IACC,GACM,CACnB,CAAC;AACN,CAAC,CACJ,CAAC;AACF,kBAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC;AAItD,MAAM,kBAAkB,GAAsC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACtE,4BAAG,IAAI,KAAK,QAAQ,IAAI,cAAK,SAAS,EAAC,oBAAoB,GAAO,GAAI,CACzE,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAqD;IACnE,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,CAAC;IAEzF,OAAO,CACH,4BACK,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CACrD,cAAK,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,YACjC,eACI,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;oBACzB,WAAW,EAAE,KAAK,CAAC,iBAAiB;oBACpC,YAAY,EAAE,QAAQ;iBACzB,CAAC,aAEF,KAAC,cAAc,OAAK,KAAK,GAAI,EAC7B,KAAC,kBAAkB,OAAK,KAAK,GAAI,IAC/B,GACJ,CACT,GACF,CACN,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAgB;IACtC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,OAAO,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuC;IAC7D,OAAO,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,OAAO,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,CAAgB;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,OAAO,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AACxC,CAAC","sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {type QAProps, useToaster} from '@gravity-ui/uikit';\nimport {ErrorBoundary} from 'react-error-boundary';\nimport {useEnsuredForwardedRef, useKey, useUpdate} from 'react-use';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/bundle';\nimport {globalLogger} from '../logger';\nimport type {ToolbarsPreset} from '../modules/toolbars/types';\nimport {useBooleanState, useSticky} from '../react-utils';\nimport {isMac} from '../utils';\n\nimport type {Editor, EditorInt} from './Editor';\nimport {HorizontalDrag} from './HorizontalDrag';\nimport {MarkupEditorView} from './MarkupEditorView';\nimport {SplitModeView} from './SplitModeView';\nimport {WysiwygEditorView} from './WysiwygEditorView';\nimport {useMarkdownEditorContext} from './context';\nimport {EditorSettings, type EditorSettingsProps, type SettingItems} from './settings';\nimport {stickyCn} from './sticky';\nimport type {MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData} from './toolbar/types';\nimport {getToolbarsConfigs} from './toolbar/utils/toolbarsConfigs';\nimport type {MarkdownEditorMode} from './types';\n\nimport '../styles/styles.scss';\nimport './MarkdownEditorView.scss'; // eslint-disable-line import/order\n\nexport const cnEditorComponent = cn('editor-component');\nconst b = cnEditorComponent;\n\ninterface EditorWrapperProps extends QAProps, ToolbarConfigs, Omit<ViewProps, 'editor'> {\n editor: EditorInt;\n editorMode: MarkdownEditorMode;\n isFocused: boolean;\n showPreview: boolean;\n toggleShowPreview: () => void;\n unsetShowPreview: () => void;\n}\nconst EditorWrapper = forwardRef<HTMLDivElement, EditorWrapperProps>(\n (\n {\n autofocus,\n editor,\n editorMode,\n enableSubmitInPreview,\n hidePreviewAfterSubmit,\n isFocused,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n qa,\n settingsVisible: settingsVisibleProp,\n showPreview,\n stickyToolbar,\n toggleShowPreview,\n toolbarsPreset,\n unsetShowPreview,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n },\n ref,\n ) => {\n const {\n wysiwygToolbarConfig,\n markupToolbarConfig,\n wysiwygHiddenActionsConfig,\n markupHiddenActionsConfig,\n } = useMemo(\n () =>\n getToolbarsConfigs({\n toolbarsPreset,\n props: {\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n },\n preset: editor.preset,\n }),\n [\n toolbarsPreset,\n initialWysiwygToolbarConfig,\n initialMarkupToolbarConfig,\n initialWysiwygHiddenActionsConfig,\n initialMarkupHiddenActionsConfig,\n editor.preset,\n ],\n );\n const onModeChange = useCallback(\n (type: MarkdownEditorMode) => {\n editor.changeEditorMode({mode: type, reason: 'settings'});\n unsetShowPreview();\n },\n [editor, unsetShowPreview],\n );\n const onToolbarVisibilityChange = useCallback(\n (visible: boolean) => {\n editor.changeToolbarVisibility({visible});\n },\n [editor],\n );\n const onSplitModeChange = useCallback(\n (splitModeEnabled: boolean) => {\n unsetShowPreview();\n editor.changeSplitModeEnabled({splitModeEnabled});\n },\n [editor, unsetShowPreview],\n );\n const onShowPreviewChange = useCallback(\n (showPreviewValue: boolean) => {\n editor.changeSplitModeEnabled({splitModeEnabled: false});\n if (showPreviewValue !== showPreview) toggleShowPreview();\n },\n [editor, showPreview, toggleShowPreview],\n );\n const canRenderPreview = Boolean(\n editor.renderPreview && editorMode === 'markup' && !editor.splitModeEnabled,\n );\n\n useKey(\n (e) => canRenderPreview && isPreviewKeyDown(e),\n (e) => {\n e.preventDefault();\n onShowPreviewChange(!showPreview);\n },\n {event: 'keydown'},\n [showPreview, editorMode, onShowPreviewChange, canRenderPreview],\n );\n\n useKey(\n (e) => Boolean(enableSubmitInPreview && showPreview && isFocused && isSubmitKeyDown(e)),\n () => {\n editor.emit('submit', null);\n\n if (hidePreviewAfterSubmit) {\n onShowPreviewChange(false);\n }\n },\n {event: 'keydown'},\n [hidePreviewAfterSubmit, enableSubmitInPreview, showPreview, showPreview],\n );\n\n const settingsProps = {\n mode: editorMode,\n onModeChange,\n onShowPreviewChange,\n onSplitModeChange,\n onToolbarVisibilityChange,\n renderPreviewButton: canRenderPreview,\n showPreview,\n splitMode: editor.splitMode,\n splitModeEnabled: editor.splitModeEnabled,\n stickyToolbar,\n toolbarVisibility: editor.toolbarVisible && !showPreview,\n };\n\n const areSettingsVisible =\n settingsVisibleProp === true ||\n (Array.isArray(settingsVisibleProp) && settingsVisibleProp.length > 0);\n\n return (\n <div\n className={b('editor-wrapper')}\n ref={ref}\n data-qa={qa}\n data-mode={editor.currentMode}\n >\n {showPreview ? (\n <>\n <div className={b('preview-wrapper')}>\n {editor.renderPreview?.({\n getValue: editor.getValue,\n mode: 'preview',\n md: editor.mdOptions,\n directiveSyntax: editor.directiveSyntax,\n })}\n </div>\n <Settings {...settingsProps} settingsVisible={settingsVisibleProp} />\n </>\n ) : (\n <>\n {editorMode === 'wysiwyg' && (\n <WysiwygEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={areSettingsVisible}\n toolbarConfig={wysiwygToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n hiddenActionsConfig={wysiwygHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n <Settings\n {...settingsProps}\n settingsVisible={editor.toolbarVisible && settingsVisibleProp}\n />\n </WysiwygEditorView>\n )}\n {editorMode === 'markup' && (\n <MarkupEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={areSettingsVisible}\n toolbarConfig={markupToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n splitMode={editor.splitMode}\n splitModeEnabled={editor.splitModeEnabled}\n hiddenActionsConfig={markupHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n <Settings\n {...settingsProps}\n settingsVisible={editor.toolbarVisible && settingsVisibleProp}\n />\n </MarkupEditorView>\n )}\n <Settings\n {...settingsProps}\n settingsVisible={!editor.toolbarVisible && settingsVisibleProp}\n renderPreviewButton={!editor.toolbarVisible && editorMode === 'markup'}\n />\n </>\n )}\n </div>\n );\n },\n);\n\nEditorWrapper.displayName = 'EditorWrapper';\n\ntype ToolbarConfigs = {\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupToolbarConfig?: MToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygToolbarConfig?: WToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupHiddenActionsConfig?: MToolbarItemData[];\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygHiddenActionsConfig?: WToolbarItemData[];\n};\n\ntype ViewProps = {\n editor?: Editor;\n autofocus?: boolean;\n // MAJOR: rename to settings\n /** @default true */\n settingsVisible?: boolean | SettingItems[];\n toolbarsPreset?: ToolbarsPreset;\n stickyToolbar: boolean;\n enableSubmitInPreview?: boolean;\n hidePreviewAfterSubmit?: boolean;\n};\n\nexport type MarkdownEditorViewProps = ClassNameProps & ToolbarConfigs & ViewProps & QAProps & {};\n\nexport const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewProps>(\n (props, ref) => {\n const divRef = useEnsuredForwardedRef(ref as React.MutableRefObject<HTMLDivElement>);\n const editorWrapperRef = useRef(null);\n const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);\n\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const context = useMarkdownEditorContext();\n const editor = (props.editor ?? context) as EditorInt;\n if (!editor)\n throw new Error(\n '[MarkdownEditorView]: an instance of the editor must be passed through the props or context',\n );\n\n const {\n autofocus,\n className,\n enableSubmitInPreview = true,\n hidePreviewAfterSubmit = false,\n markupHiddenActionsConfig,\n markupToolbarConfig,\n qa,\n settingsVisible = true,\n stickyToolbar,\n toolbarsPreset,\n wysiwygHiddenActionsConfig,\n wysiwygToolbarConfig,\n } = props;\n\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender', rerender);\n return () => {\n editor.off('rerender', rerender);\n };\n }, [editor, rerender]);\n\n const editorMode = editor.currentMode;\n const markupSplitMode =\n editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';\n\n const splitModeViewWrapperRef = useRef(null);\n\n const toaster = useToaster();\n\n useEffect(() => {\n if (showPreview) {\n divRef.current.focus();\n }\n }, [divRef, showPreview]);\n\n const areSettingsVisible =\n settingsVisible === true ||\n (Array.isArray(settingsVisible) && settingsVisible.length > 0);\n\n return (\n <ErrorBoundary\n onError={(e) => {\n globalLogger.error(e);\n editor.logger.error(e);\n }}\n fallbackRender={({error, resetErrorBoundary}) => {\n toaster.add({\n theme: 'danger',\n name: 'g-md-editor-error',\n title: i18n('error-title'),\n content: error.message,\n });\n setTimeout(() => {\n resetErrorBoundary();\n editor.changeEditorMode({\n mode: 'markup',\n reason: 'error-boundary',\n emit: false,\n });\n });\n return null;\n }}\n >\n <div\n ref={divRef}\n data-qa={qa}\n className={b(\n {\n settings: areSettingsVisible,\n split: markupSplitMode && editor.splitMode,\n },\n [className],\n )}\n role=\"button\"\n tabIndex={0}\n >\n <EditorWrapper\n autofocus={autofocus}\n editor={editor}\n editorMode={editorMode}\n enableSubmitInPreview={enableSubmitInPreview}\n hidePreviewAfterSubmit={hidePreviewAfterSubmit}\n isFocused={isWrapperFocused(divRef)}\n markupHiddenActionsConfig={markupHiddenActionsConfig}\n markupToolbarConfig={markupToolbarConfig}\n qa=\"g-md-editor-mode\"\n ref={editorWrapperRef}\n settingsVisible={settingsVisible}\n showPreview={showPreview}\n stickyToolbar={stickyToolbar}\n toggleShowPreview={toggleShowPreview}\n toolbarsPreset={toolbarsPreset}\n unsetShowPreview={unsetShowPreview}\n wysiwygHiddenActionsConfig={wysiwygHiddenActionsConfig}\n wysiwygToolbarConfig={wysiwygToolbarConfig}\n />\n\n {markupSplitMode && (\n <>\n {editor.splitMode === 'horizontal' ? (\n <HorizontalDrag\n editor={editor}\n isMounted={isMounted}\n leftElRef={editorWrapperRef}\n rightElRef={splitModeViewWrapperRef}\n wrapperRef={divRef}\n />\n ) : (\n <div className={b('resizer')} />\n )}\n <SplitModeView editor={editor} ref={splitModeViewWrapperRef} />\n </>\n )}\n </div>\n </ErrorBoundary>\n );\n },\n);\nMarkdownEditorView.displayName = 'MarkdownEditorView';\n\ninterface MarkupSearchAnchorProps extends Pick<EditorSettingsProps, 'mode'> {}\n\nconst MarkupSearchAnchor: React.FC<MarkupSearchAnchorProps> = ({mode}) => (\n <>{mode === 'markup' && <div className=\"g-md-search-anchor\"></div>}</>\n);\n\nfunction Settings(props: EditorSettingsProps & {stickyToolbar: boolean}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isSticky = useSticky(wrapperRef) && props.toolbarVisibility && props.stickyToolbar;\n\n return (\n <>\n {(props.renderPreviewButton || props.settingsVisible) && (\n <div className={b('settings-wrapper')}>\n <div\n ref={wrapperRef}\n className={stickyCn.settings({\n withToolbar: props.toolbarVisibility,\n stickyActive: isSticky,\n })}\n >\n <EditorSettings {...props} />\n <MarkupSearchAnchor {...props} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction isPreviewKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.shiftKey && e.code === 'KeyP';\n}\n\nfunction isWrapperFocused(divRef: React.RefObject<HTMLDivElement>) {\n return document.activeElement === divRef.current;\n}\n\nfunction isSubmitKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.code === 'Enter';\n}\n"]}
|
|
@@ -4,9 +4,10 @@ import type { MarkdownEditorMode, MarkdownEditorSplitMode } from "../types.js";
|
|
|
4
4
|
import "./index.css";
|
|
5
5
|
export type EditorSettingsProps = Omit<SettingsContentProps, 'onClose'> & {
|
|
6
6
|
renderPreviewButton?: boolean;
|
|
7
|
-
settingsVisible?: boolean;
|
|
7
|
+
settingsVisible?: boolean | SettingItems[];
|
|
8
8
|
};
|
|
9
9
|
export declare const EditorSettings: import("react").NamedExoticComponent<EditorSettingsProps>;
|
|
10
|
+
export type SettingItems = 'mode' | 'toolbar' | 'split';
|
|
10
11
|
type SettingsContentProps = ClassNameProps & QAProps & {
|
|
11
12
|
mode: MarkdownEditorMode;
|
|
12
13
|
onClose: () => void;
|
|
@@ -14,6 +15,7 @@ type SettingsContentProps = ClassNameProps & QAProps & {
|
|
|
14
15
|
onShowPreviewChange: (showPreview: boolean) => void;
|
|
15
16
|
showPreview: boolean;
|
|
16
17
|
toolbarVisibility: boolean;
|
|
18
|
+
settingsVisible?: SettingItems[] | boolean;
|
|
17
19
|
onToolbarVisibilityChange: (val: boolean) => void;
|
|
18
20
|
splitMode?: MarkdownEditorSplitMode;
|
|
19
21
|
splitModeEnabled?: boolean;
|
|
@@ -20,11 +20,16 @@ export const EditorSettings = memo(function EditorSettings(props) {
|
|
|
20
20
|
const { className, onShowPreviewChange, showPreview, renderPreviewButton, settingsVisible } = props;
|
|
21
21
|
const [chevronElement, setChevronElement] = useState(null);
|
|
22
22
|
const [popupShown, , hidePopup, togglePopup] = useBooleanState(false);
|
|
23
|
-
|
|
23
|
+
const areSettingsVisible = settingsVisible === true || (Array.isArray(settingsVisible) && settingsVisible.length > 0);
|
|
24
|
+
return (_jsxs("div", { className: bSettings(null, [className]), children: [renderPreviewButton && (_jsxs(_Fragment, { children: [_jsx(ActionTooltip, { openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, title: i18n('preview_hint'), hotkey: "mod+shift+p", children: _jsx(Button, { qa: "g-md-markup-preview-button", size: "m", view: "flat", pin: "round-round", className: bSettings('preview-button'), onClick: () => onShowPreviewChange?.(!showPreview), selected: showPreview, children: _jsx(Icon, { data: Eye }) }) }), settingsVisible && _jsx("div", { className: bSettings('separator') })] })), areSettingsVisible && (_jsxs(_Fragment, { children: [_jsx(Button, { size: "m", view: "flat", pin: "round-round", onClick: togglePopup, ref: setChevronElement, qa: "g-md-settings-button", className: bSettings('dropdown-button'), children: _jsx(Icon, { data: Gear }) }), _jsx(Popup, { open: popupShown, anchorElement: chevronElement, placement: placement, onOpenChange: hidePopup, children: _jsx(SettingsContent, { ...props, qa: "g-md-settings-content", onClose: hidePopup, className: bSettings('content') }) })] }))] }));
|
|
24
25
|
});
|
|
25
26
|
const mdHelpPlacement = ['bottom', 'bottom-end', 'right-start', 'right', 'left'];
|
|
26
|
-
const SettingsContent = function SettingsContent({ mode, onClose, onModeChange, toolbarVisibility, onToolbarVisibilityChange, onSplitModeChange, splitMode = false, splitModeEnabled, className, showPreview, qa, }) {
|
|
27
|
-
|
|
27
|
+
const SettingsContent = function SettingsContent({ mode, onClose, onModeChange, toolbarVisibility, onToolbarVisibilityChange, onSplitModeChange, splitMode = false, splitModeEnabled, className, showPreview, settingsVisible, qa, }) {
|
|
28
|
+
const isSettingsArray = Array.isArray(settingsVisible);
|
|
29
|
+
const showModeSetting = isSettingsArray ? settingsVisible?.includes('mode') : true;
|
|
30
|
+
const showToolbarSetting = isSettingsArray ? settingsVisible?.includes('toolbar') : true;
|
|
31
|
+
const showSplitModeSetting = isSettingsArray ? settingsVisible?.includes('split') : true;
|
|
32
|
+
return (_jsxs("div", { className: bContent(null, [className]), "data-qa": qa, children: [showModeSetting && (_jsxs(Menu, { size: "l", className: bContent('mode'), children: [_jsx(Menu.Item, { qa: "g-md-settings-mode-wysiwyg", active: mode === 'wysiwyg', onClick: () => {
|
|
28
33
|
onModeChange('wysiwyg');
|
|
29
34
|
onClose();
|
|
30
35
|
}, iconStart: _jsx(Icon, { data: WysiwygModeIcon }), children: i18n('settings_wysiwyg') }), _jsxs(Menu.Item, { qa: "g-md-settings-mode-markup", active: mode === 'markup', onClick: () => {
|
|
@@ -37,6 +42,6 @@ const SettingsContent = function SettingsContent({ mode, onClose, onModeChange,
|
|
|
37
42
|
// stop clicks propagation
|
|
38
43
|
// because otherwise click in MarkdownHints handled as click on MenuItem
|
|
39
44
|
e.stopPropagation();
|
|
40
|
-
}, children: _jsx(MarkdownHints, {}) }) })] })] }), _jsx("div", { className: bContent('separator') }), !showPreview && (_jsxs("div", { className: bContent('toolbar'), children: [_jsx(Checkbox, { size: "m", checked: toolbarVisibility, onUpdate: onToolbarVisibilityChange, children: i18n('settings_menubar') }), _jsx("div", { className: bContent('toolbar-hint'), children: i18n('settings_hint') })] })), splitMode && (_jsxs("div", { className: bContent('split-mode'), children: [_jsx(Checkbox, { size: "m", disabled: mode !== 'markup', checked: splitModeEnabled, onUpdate: onSplitModeChange ?? noop, children: i18n('settings_split-mode') }), _jsx("div", { className: bContent('toolbar-hint'), children: i18n('settings_split-mode-hint') })] })), _jsx("span", { className: bContent('version'), children: VERSION })] }));
|
|
45
|
+
}, children: _jsx(MarkdownHints, {}) }) })] })] })), showModeSetting && (showSplitModeSetting || showToolbarSetting) && (_jsx("div", { className: bContent('separator') })), showToolbarSetting && !showPreview && (_jsxs("div", { className: bContent('toolbar'), children: [_jsx(Checkbox, { size: "m", checked: toolbarVisibility, onUpdate: onToolbarVisibilityChange, children: i18n('settings_menubar') }), _jsx("div", { className: bContent('toolbar-hint'), children: i18n('settings_hint') })] })), showSplitModeSetting && splitMode && (_jsxs("div", { className: bContent('split-mode'), children: [_jsx(Checkbox, { size: "m", disabled: mode !== 'markup', checked: splitModeEnabled, onUpdate: onSplitModeChange ?? noop, children: i18n('settings_split-mode') }), _jsx("div", { className: bContent('toolbar-hint'), children: i18n('settings_split-mode-hint') })] })), _jsx("span", { className: bContent('version'), children: VERSION })] }));
|
|
41
46
|
};
|
|
42
47
|
//# sourceMappingURL=index.js.map
|