@gravity-ui/markdown-editor 15.7.0 → 15.8.0
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 +7 -28
- package/build/cjs/bundle/MarkdownEditorView.js +49 -49
- package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
- package/build/cjs/bundle/toolbar/markup/MToolbarImagePopup.js +8 -1
- package/build/cjs/bundle/toolbar/markup/MToolbarImagePopup.js.map +1 -1
- package/build/cjs/extensions/additional/QuoteLink/index.css +1 -2
- package/build/cjs/forms/ImageForm.d.ts +1 -0
- package/build/cjs/forms/ImageForm.js +2 -2
- package/build/cjs/forms/ImageForm.js.map +1 -1
- package/build/cjs/markup/codemirror/create.js +16 -11
- package/build/cjs/markup/codemirror/create.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/MarkdownEditorView.d.ts +7 -28
- package/build/esm/bundle/MarkdownEditorView.js +49 -49
- package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
- package/build/esm/bundle/toolbar/markup/MToolbarImagePopup.js +8 -1
- package/build/esm/bundle/toolbar/markup/MToolbarImagePopup.js.map +1 -1
- package/build/esm/extensions/additional/QuoteLink/index.css +1 -2
- package/build/esm/forms/ImageForm.d.ts +1 -0
- package/build/esm/forms/ImageForm.js +2 -2
- package/build/esm/forms/ImageForm.js.map +1 -1
- package/build/esm/markup/codemirror/create.js +16 -11
- package/build/esm/markup/codemirror/create.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +1 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":";;AA0FA,4CAmNC;AAED,gCAOC;AAtTD,2DAAwD;AACxD,mDAO8B;AAC9B,mDAAwD;AAExD,2CAM0B;AAI1B,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;AAiCnD,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,GACpB,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,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,KAAK,CAAC,KAAK,EAAE,MAAM;YACf,IAAI,CAAC,KAAK,CAAC,aAAa;gBAAE,OAAO;YAEjC,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;YACX,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;gBACX,CAAC;YACL,CAAC;YAED,IAAI,uBAAuB,EAAE,CAAC;gBAC1B,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;gBAEZ,IAAI,QAAQ,EAAE,CAAC;oBACX,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,oBAAoB,EAAC,CAAC,CAAC;oBAC5C,IAAA,uBAAY,EAAC;wBACT;4BACI,GAAG,EAAE,QAAQ;4BACb,GAAG,EAAE,KAAK;4BACV,KAAK;yBACR;qBACJ,CAAC,CAAC,MAAM,CAAC,CAAC;gBACf,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;YAC3B,CAAC;QACL,CAAC;KACJ,CAAC,EACF,IAAA,0BAAiB,EAAC;QACd,cAAc,EAAE,qBAAqB;QACrC,QAAQ;KACX,CAAC,CACL,CAAC;IAEF,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 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\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};\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 } = 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 {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 // 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 SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\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":"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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};\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 } = 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 isInsertedInsideLink = linkMatches.some(\n (item) => from >= item.index && from <= item.index + (item[0]?.length ?? 0),\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 SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\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"]}
|
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.8.0' !== 'undefined' ? '15.8.0' : '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.8.0' !== 'undefined' ? '15.8.0' : 'unknown';\n"]}
|
|
@@ -6,10 +6,7 @@ import type { MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData } f
|
|
|
6
6
|
import "../styles/styles.css";
|
|
7
7
|
import "./MarkdownEditorView.css";
|
|
8
8
|
export declare const cnEditorComponent: import("@bem-react/classname").ClassNameFormatter;
|
|
9
|
-
|
|
10
|
-
editor?: Editor;
|
|
11
|
-
autofocus?: boolean;
|
|
12
|
-
toolbarsPreset?: ToolbarsPreset;
|
|
9
|
+
type ToolbarConfigs = {
|
|
13
10
|
/**
|
|
14
11
|
* @deprecated use `toolbarsPreset` instead
|
|
15
12
|
*/
|
|
@@ -26,35 +23,17 @@ export type MarkdownEditorViewProps = ClassNameProps & QAProps & {
|
|
|
26
23
|
* @deprecated use `toolbarsPreset` instead
|
|
27
24
|
*/
|
|
28
25
|
wysiwygHiddenActionsConfig?: WToolbarItemData[];
|
|
29
|
-
/** @default true */
|
|
30
|
-
settingsVisible?: boolean;
|
|
31
|
-
stickyToolbar: boolean;
|
|
32
|
-
enableSubmitInPreview?: boolean;
|
|
33
|
-
hidePreviewAfterSubmit?: boolean;
|
|
34
26
|
};
|
|
35
|
-
|
|
27
|
+
type ViewProps = {
|
|
36
28
|
editor?: Editor;
|
|
37
29
|
autofocus?: boolean;
|
|
38
|
-
toolbarsPreset?: ToolbarsPreset;
|
|
39
|
-
/**
|
|
40
|
-
* @deprecated use `toolbarsPreset` instead
|
|
41
|
-
*/
|
|
42
|
-
markupToolbarConfig?: MToolbarData;
|
|
43
|
-
/**
|
|
44
|
-
* @deprecated use `toolbarsPreset` instead
|
|
45
|
-
*/
|
|
46
|
-
wysiwygToolbarConfig?: WToolbarData;
|
|
47
|
-
/**
|
|
48
|
-
* @deprecated use `toolbarsPreset` instead
|
|
49
|
-
*/
|
|
50
|
-
markupHiddenActionsConfig?: MToolbarItemData[];
|
|
51
|
-
/**
|
|
52
|
-
* @deprecated use `toolbarsPreset` instead
|
|
53
|
-
*/
|
|
54
|
-
wysiwygHiddenActionsConfig?: WToolbarItemData[];
|
|
55
30
|
/** @default true */
|
|
56
31
|
settingsVisible?: boolean;
|
|
32
|
+
toolbarsPreset?: ToolbarsPreset;
|
|
57
33
|
stickyToolbar: boolean;
|
|
58
34
|
enableSubmitInPreview?: boolean;
|
|
59
35
|
hidePreviewAfterSubmit?: boolean;
|
|
60
|
-
}
|
|
36
|
+
};
|
|
37
|
+
export type MarkdownEditorViewProps = ClassNameProps & ToolbarConfigs & ViewProps & QAProps & {};
|
|
38
|
+
export declare const MarkdownEditorView: import("react").ForwardRefExoticComponent<ClassNameProps & ToolbarConfigs & ViewProps & QAProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
39
|
+
export {};
|
|
@@ -20,18 +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
|
-
|
|
24
|
-
const divRef = useEnsuredForwardedRef(ref);
|
|
25
|
-
const [isMounted, setIsMounted] = useState(false);
|
|
26
|
-
useEffect(() => {
|
|
27
|
-
setIsMounted(true);
|
|
28
|
-
}, []);
|
|
29
|
-
const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);
|
|
30
|
-
const context = useMarkdownEditorContext();
|
|
31
|
-
const editor = (props.editor ?? context);
|
|
32
|
-
if (!editor)
|
|
33
|
-
throw new Error('[MarkdownEditorView]: an instance of the editor must be passed through the props or context');
|
|
34
|
-
const { qa, autofocus, className, settingsVisible = true, toolbarsPreset, stickyToolbar, wysiwygToolbarConfig: initialWysiwygToolbarConfig, markupToolbarConfig: initialMarkupToolbarConfig, wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig, markupHiddenActionsConfig: initialMarkupHiddenActionsConfig, enableSubmitInPreview = true, hidePreviewAfterSubmit = false, } = props;
|
|
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) => {
|
|
35
24
|
const { wysiwygToolbarConfig, markupToolbarConfig, wysiwygHiddenActionsConfig, markupHiddenActionsConfig, } = useMemo(() => getToolbarsConfigs({
|
|
36
25
|
toolbarsPreset,
|
|
37
26
|
props: {
|
|
@@ -49,13 +38,6 @@ export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
|
49
38
|
initialMarkupHiddenActionsConfig,
|
|
50
39
|
editor.preset,
|
|
51
40
|
]);
|
|
52
|
-
const rerender = useUpdate();
|
|
53
|
-
useLayoutEffect(() => {
|
|
54
|
-
editor.on('rerender', rerender);
|
|
55
|
-
return () => {
|
|
56
|
-
editor.off('rerender', rerender);
|
|
57
|
-
};
|
|
58
|
-
}, [editor, rerender]);
|
|
59
41
|
const onModeChange = useCallback((type) => {
|
|
60
42
|
editor.changeEditorMode({ mode: type, reason: 'settings' });
|
|
61
43
|
unsetShowPreview();
|
|
@@ -72,44 +54,67 @@ export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
|
72
54
|
if (showPreviewValue !== showPreview)
|
|
73
55
|
toggleShowPreview();
|
|
74
56
|
}, [editor, showPreview, toggleShowPreview]);
|
|
75
|
-
const editorMode = editor.currentMode;
|
|
76
|
-
const markupSplitMode = editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';
|
|
77
57
|
const canRenderPreview = Boolean(editor.renderPreview && editorMode === 'markup' && !editor.splitModeEnabled);
|
|
78
58
|
useKey((e) => canRenderPreview && isPreviewKeyDown(e), (e) => {
|
|
79
59
|
e.preventDefault();
|
|
80
60
|
onShowPreviewChange(!showPreview);
|
|
81
61
|
}, { event: 'keydown' }, [showPreview, editorMode, onShowPreviewChange, canRenderPreview]);
|
|
82
|
-
|
|
83
|
-
const splitModeViewWrapperRef = useRef(null);
|
|
84
|
-
useEffect(() => {
|
|
85
|
-
if (showPreview) {
|
|
86
|
-
divRef.current.focus();
|
|
87
|
-
}
|
|
88
|
-
}, [divRef, showPreview]);
|
|
89
|
-
useKey((e) => enableSubmitInPreview &&
|
|
90
|
-
showPreview &&
|
|
91
|
-
isWrapperFocused(divRef) &&
|
|
92
|
-
isSubmitKeyDown(e), () => {
|
|
62
|
+
useKey((e) => Boolean(enableSubmitInPreview && showPreview && isFocused && isSubmitKeyDown(e)), () => {
|
|
93
63
|
editor.emit('submit', null);
|
|
94
64
|
if (hidePreviewAfterSubmit) {
|
|
95
65
|
onShowPreviewChange(false);
|
|
96
66
|
}
|
|
97
67
|
}, { event: 'keydown' }, [hidePreviewAfterSubmit, enableSubmitInPreview, showPreview, showPreview]);
|
|
98
|
-
const
|
|
99
|
-
editorMode,
|
|
100
|
-
settingsVisible,
|
|
101
|
-
editor.toolbarVisible,
|
|
102
|
-
editor.splitModeEnabled,
|
|
103
|
-
editor.splitMode,
|
|
68
|
+
const settingsProps = {
|
|
69
|
+
mode: editorMode,
|
|
104
70
|
onModeChange,
|
|
105
|
-
|
|
106
|
-
onToolbarVisibilityChange,
|
|
71
|
+
onShowPreviewChange,
|
|
107
72
|
onSplitModeChange,
|
|
73
|
+
onToolbarVisibilityChange,
|
|
74
|
+
renderPreviewButton: canRenderPreview,
|
|
75
|
+
showPreview,
|
|
76
|
+
splitMode: editor.splitMode,
|
|
77
|
+
splitModeEnabled: editor.splitModeEnabled,
|
|
108
78
|
stickyToolbar,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
79
|
+
toolbarVisibility: editor.toolbarVisible && !showPreview,
|
|
80
|
+
};
|
|
81
|
+
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
|
+
getValue: editor.getValue,
|
|
83
|
+
mode: 'preview',
|
|
84
|
+
md: editor.mdOptions,
|
|
85
|
+
directiveSyntax: editor.directiveSyntax,
|
|
86
|
+
}) }), _jsx(Settings, { ...settingsProps, settingsVisible: settingsVisible })] })) : (_jsxs(_Fragment, { children: [editorMode === 'wysiwyg' && (_jsx(WysiwygEditorView, { editor: editor, autofocus: autofocus, settingsVisible: settingsVisible, toolbarConfig: wysiwygToolbarConfig, toolbarVisible: editor.toolbarVisible, hiddenActionsConfig: wysiwygHiddenActionsConfig, className: b('editor', { mode: editorMode }), toolbarClassName: b('toolbar'), stickyToolbar: stickyToolbar, children: _jsx(Settings, { ...settingsProps, settingsVisible: settingsVisible && editor.toolbarVisible }) })), editorMode === 'markup' && (_jsx(MarkupEditorView, { editor: editor, autofocus: autofocus, settingsVisible: settingsVisible, 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: settingsVisible && editor.toolbarVisible }) })), _jsx(Settings, { ...settingsProps, settingsVisible: !editor.toolbarVisible && settingsVisible, renderPreviewButton: !editor.toolbarVisible && editorMode === 'markup' })] })) }));
|
|
87
|
+
});
|
|
88
|
+
EditorWrapper.displayName = 'EditorWrapper';
|
|
89
|
+
export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
90
|
+
const divRef = useEnsuredForwardedRef(ref);
|
|
91
|
+
const editorWrapperRef = useRef(null);
|
|
92
|
+
const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);
|
|
93
|
+
const [isMounted, setIsMounted] = useState(false);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
setIsMounted(true);
|
|
96
|
+
}, []);
|
|
97
|
+
const context = useMarkdownEditorContext();
|
|
98
|
+
const editor = (props.editor ?? context);
|
|
99
|
+
if (!editor)
|
|
100
|
+
throw new Error('[MarkdownEditorView]: an instance of the editor must be passed through the props or context');
|
|
101
|
+
const { autofocus, className, enableSubmitInPreview = true, hidePreviewAfterSubmit = false, markupHiddenActionsConfig, markupToolbarConfig, qa, settingsVisible = true, stickyToolbar, toolbarsPreset, wysiwygHiddenActionsConfig, wysiwygToolbarConfig, } = props;
|
|
102
|
+
const rerender = useUpdate();
|
|
103
|
+
useLayoutEffect(() => {
|
|
104
|
+
editor.on('rerender', rerender);
|
|
105
|
+
return () => {
|
|
106
|
+
editor.off('rerender', rerender);
|
|
107
|
+
};
|
|
108
|
+
}, [editor, rerender]);
|
|
109
|
+
const editorMode = editor.currentMode;
|
|
110
|
+
const markupSplitMode = editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';
|
|
111
|
+
const splitModeViewWrapperRef = useRef(null);
|
|
112
112
|
const toaster = useToaster();
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (showPreview) {
|
|
115
|
+
divRef.current.focus();
|
|
116
|
+
}
|
|
117
|
+
}, [divRef, showPreview]);
|
|
113
118
|
return (_jsx(ErrorBoundary, { onError: (e) => {
|
|
114
119
|
globalLogger.error(e);
|
|
115
120
|
editor.logger.error(e);
|
|
@@ -132,12 +137,7 @@ export const MarkdownEditorView = forwardRef((props, ref) => {
|
|
|
132
137
|
}, children: _jsxs("div", { ref: divRef, "data-qa": qa, className: b({
|
|
133
138
|
settings: settingsVisible,
|
|
134
139
|
split: markupSplitMode && editor.splitMode,
|
|
135
|
-
}, [className]), role: "button", tabIndex: 0, children: [_jsx(
|
|
136
|
-
getValue: editor.getValue,
|
|
137
|
-
mode: 'preview',
|
|
138
|
-
md: editor.mdOptions,
|
|
139
|
-
directiveSyntax: editor.directiveSyntax,
|
|
140
|
-
}) }), settings] })) : (_jsxs(_Fragment, { children: [editorMode === 'wysiwyg' && (_jsx(WysiwygEditorView, { editor: editor, autofocus: autofocus, settingsVisible: settingsVisible, toolbarConfig: wysiwygToolbarConfig, toolbarVisible: editor.toolbarVisible, hiddenActionsConfig: wysiwygHiddenActionsConfig, className: b('editor', { mode: editorMode }), toolbarClassName: b('toolbar'), stickyToolbar: stickyToolbar, children: editor.toolbarVisible && settingsVisible && settings })), editorMode === 'markup' && (_jsx(MarkupEditorView, { editor: editor, autofocus: autofocus, settingsVisible: settingsVisible, toolbarConfig: markupToolbarConfig, toolbarVisible: editor.toolbarVisible, splitMode: editor.splitMode, splitModeEnabled: editor.splitModeEnabled, hiddenActionsConfig: markupHiddenActionsConfig, className: b('editor', { mode: editorMode }), toolbarClassName: b('toolbar'), stickyToolbar: stickyToolbar, children: editor.toolbarVisible && settings })), !editor.toolbarVisible && settings] })) }), 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 })] }))] }) }));
|
|
140
|
+
}, [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
141
|
});
|
|
142
142
|
MarkdownEditorView.displayName = 'MarkdownEditorView';
|
|
143
143
|
const MarkupSearchAnchor = ({ mode }) => (_jsx(_Fragment, { children: mode === 'markup' && _jsx("div", { className: "g-md-search-anchor" }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkdownEditorView.tsx"],"names":[],"mappings":"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","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\nexport type MarkdownEditorViewProps = ClassNameProps &\n QAProps & {\n editor?: Editor;\n autofocus?: boolean;\n toolbarsPreset?: ToolbarsPreset;\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 /** @default true */\n settingsVisible?: boolean;\n stickyToolbar: boolean;\n enableSubmitInPreview?: boolean;\n hidePreviewAfterSubmit?: boolean;\n };\n\nexport const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewProps>(\n (props, ref) => {\n const divRef = useEnsuredForwardedRef(ref as React.MutableRefObject<HTMLDivElement>);\n\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);\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 qa,\n autofocus,\n className,\n settingsVisible = true,\n toolbarsPreset,\n stickyToolbar,\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n enableSubmitInPreview = true,\n hidePreviewAfterSubmit = false,\n } = props;\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\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 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\n const onShowPreviewChange = useCallback(\n (showPreviewValue: boolean) => {\n editor.changeSplitModeEnabled({splitModeEnabled: false});\n if (showPreviewValue !== showPreview) toggleShowPreview();\n },\n [editor, showPreview, toggleShowPreview],\n );\n\n const editorMode = editor.currentMode;\n const markupSplitMode =\n editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';\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 const editorWrapperRef = useRef(null);\n const splitModeViewWrapperRef = useRef(null);\n\n useEffect(() => {\n if (showPreview) {\n divRef.current.focus();\n }\n }, [divRef, showPreview]);\n\n useKey(\n (e) =>\n enableSubmitInPreview &&\n showPreview &&\n isWrapperFocused(divRef) &&\n 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 settings = useMemo(\n () => (\n <Settings\n mode={editorMode}\n settingsVisible={settingsVisible}\n onModeChange={onModeChange}\n toolbarVisibility={editor.toolbarVisible && !showPreview}\n onToolbarVisibilityChange={onToolbarVisibilityChange}\n onSplitModeChange={onSplitModeChange}\n splitModeEnabled={editor.splitModeEnabled}\n splitMode={editor.splitMode}\n stickyToolbar={stickyToolbar}\n onShowPreviewChange={onShowPreviewChange}\n showPreview={showPreview}\n renderPreviewButton={canRenderPreview}\n />\n ),\n [\n editorMode,\n settingsVisible,\n editor.toolbarVisible,\n editor.splitModeEnabled,\n editor.splitMode,\n onModeChange,\n showPreview,\n onToolbarVisibilityChange,\n onSplitModeChange,\n stickyToolbar,\n onShowPreviewChange,\n canRenderPreview,\n ],\n );\n\n const toaster = useToaster();\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 <div\n className={b('editor-wrapper')}\n ref={editorWrapperRef}\n data-qa=\"g-md-editor-mode\"\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}\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 {editor.toolbarVisible && settingsVisible && settings}\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 {editor.toolbarVisible && settings}\n </MarkupEditorView>\n )}\n {!editor.toolbarVisible && settings}\n </>\n )}\n </div>\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,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"]}
|
|
@@ -6,5 +6,5 @@ export type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
|
|
|
6
6
|
onSuccessUpload?: (res: BatchUploadResult) => void;
|
|
7
7
|
hide: () => void;
|
|
8
8
|
anchorElement: HTMLElement | null;
|
|
9
|
-
} & Pick<ImageFormProps, 'onSubmit'>;
|
|
9
|
+
} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;
|
|
10
10
|
export declare const ToolbarImagePopup: React.FC<ToolbarImagePopuProps>;
|
|
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
|
|
|
6
6
|
import { useBooleanState } from "../../../react-utils/hooks.js";
|
|
7
7
|
import { batchUploadFiles, } from "../../../utils/upload.js";
|
|
8
8
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
9
|
-
export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, }) => {
|
|
9
|
+
export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, }) => {
|
|
10
10
|
const toaster = useToaster();
|
|
11
11
|
const [loading, showLoading, hideLoading] = useBooleanState(false);
|
|
12
12
|
const handleCancel = useCallback(() => {
|
|
@@ -34,6 +34,6 @@ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, fo
|
|
|
34
34
|
focus();
|
|
35
35
|
onSubmit(data);
|
|
36
36
|
onClick?.('addImage');
|
|
37
|
-
}, loading: loading }) }));
|
|
37
|
+
}, loading: loading, imageTitle: imageTitle }) }));
|
|
38
38
|
};
|
|
39
39
|
//# sourceMappingURL=ToolbarImagePopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n />\n </Popup>\n );\n};\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
2
3
|
import isNumber from 'is-number';
|
|
3
4
|
import { IMG_MAX_HEIGHT, getImageDimensions, insertImages } from "../../../markup/index.js";
|
|
4
5
|
import { ToolbarImagePopup } from "../custom/ToolbarImagePopup.js";
|
|
@@ -8,7 +9,13 @@ const noop = (err) => {
|
|
|
8
9
|
};
|
|
9
10
|
export const MToolbarImagePopup = ({ focus, onClick, hide, anchorElement, editor, className, }) => {
|
|
10
11
|
const { uploadHandler, needToSetDimensionsForUploadedImages } = useMarkupToolbarContext();
|
|
11
|
-
|
|
12
|
+
const selectedString = useMemo(() => {
|
|
13
|
+
const { from, to } = editor.cm.state.selection.main;
|
|
14
|
+
return editor.cm.state.doc.sliceString(from, to);
|
|
15
|
+
// we need to calculate the selection only once
|
|
16
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
17
|
+
}, []);
|
|
18
|
+
return (_jsx(ToolbarImagePopup, { imageTitle: selectedString, hide: hide, anchorElement: anchorElement, focus: focus, onClick: onClick, className: className, onSubmit: ({ url, name, alt, width, height }) => {
|
|
12
19
|
insertImages([
|
|
13
20
|
{
|
|
14
21
|
url,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/markup/MToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAC,cAAc,EAAkB,kBAAkB,EAAE,YAAY,EAAC,iCAAwB;AAEjG,OAAO,EAA6B,iBAAiB,EAAC,uCAAoC;AAG1F,OAAO,EAAC,uBAAuB,EAAC,qBAAkB;AAElD,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EAClE,KAAK,EACL,OAAO,EACP,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,GACZ,EAAE,EAAE;IACD,MAAM,EAAC,aAAa,EAAE,oCAAoC,EAAC,GAAG,uBAAuB,EAAE,CAAC;IAExF,OAAO,CACH,KAAC,iBAAiB,IACd,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAC,EAAE,EAAE;YAC1C,YAAY,CAAC;gBACT;oBACI,GAAG;oBACH,GAAG;oBACH,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC3C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;iBACjD;aACJ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,EACD,YAAY,EAAE,aAAa,EAC3B,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC7B,GAAG,CAAC,OAAO,EACX,OAAO,CAAC,oCAAoC,CAAC,CAChD,CAAC;YACF,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,GACH,CACL,CAAC;AACN,CAAC,CAAC;AAEF,KAAK,UAAU,YAAY,CACvB,KAAmC,EACnC,cAAuB;IAEvB,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,CAAgB,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,EAAE,EAAE;QACxC,MAAM,OAAO,GAAc,EAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAC,CAAC;QAC5E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvB,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;gBAC9C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAC9D,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import isNumber from 'is-number';\n\nimport {IMG_MAX_HEIGHT, type ImageItem, getImageDimensions, insertImages} from '../../../markup';\nimport type {UploadSuccessItem} from '../../../utils';\nimport {type ToolbarImagePopuProps, ToolbarImagePopup} from '../custom/ToolbarImagePopup';\nimport type {MToolbarBaseProps} from '../types';\n\nimport {useMarkupToolbarContext} from './context';\n\nconst noop = (err: unknown) => {\n console.error(err);\n};\n\nexport type MToolbarImagePopupProps = MToolbarBaseProps &\n Pick<ToolbarImagePopuProps, 'anchorElement'> & {\n hide: () => void;\n };\n\nexport const MToolbarImagePopup: React.FC<MToolbarImagePopupProps> = ({\n focus,\n onClick,\n hide,\n anchorElement,\n editor,\n className,\n}) => {\n const {uploadHandler, needToSetDimensionsForUploadedImages} = useMarkupToolbarContext();\n\n return (\n <ToolbarImagePopup\n hide={hide}\n anchorElement={anchorElement}\n focus={focus}\n onClick={onClick}\n className={className}\n onSubmit={({url, name, alt, width, height}) => {\n insertImages([\n {\n url,\n alt,\n title: name,\n width: isNumber(width) ? String(width) : '',\n height: isNumber(height) ? String(height) : '',\n },\n ])(editor.cm);\n }}\n uploadImages={uploadHandler}\n onSuccessUpload={async (res) => {\n const images = await toImageItems(\n res.success,\n Boolean(needToSetDimensionsForUploadedImages),\n );\n insertImages(images)(editor.cm);\n }}\n />\n );\n};\n\nasync function toImageItems(\n items: readonly UploadSuccessItem[],\n withDimensions: boolean,\n): Promise<ImageItem[]> {\n const imgItems: ImageItem[] = [];\n\n await Promise.all(\n items.map<Promise<void>>(({result, file}) => {\n const imgItem: ImageItem = {url: result.url, alt: result.name ?? file.name};\n imgItems.push(imgItem);\n\n if (withDimensions) {\n return getImageDimensions(file).then(({height}) => {\n imgItem.height = String(Math.min(height, IMG_MAX_HEIGHT));\n }, noop);\n }\n return Promise.resolve();\n }),\n );\n\n return imgItems;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/markup/MToolbarImagePopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useMemo} from 'react';\n\nimport isNumber from 'is-number';\n\nimport {IMG_MAX_HEIGHT, type ImageItem, getImageDimensions, insertImages} from '../../../markup';\nimport type {UploadSuccessItem} from '../../../utils';\nimport {type ToolbarImagePopuProps, ToolbarImagePopup} from '../custom/ToolbarImagePopup';\nimport type {MToolbarBaseProps} from '../types';\n\nimport {useMarkupToolbarContext} from './context';\n\nconst noop = (err: unknown) => {\n console.error(err);\n};\n\nexport type MToolbarImagePopupProps = MToolbarBaseProps &\n Pick<ToolbarImagePopuProps, 'anchorElement'> & {\n hide: () => void;\n };\n\nexport const MToolbarImagePopup: React.FC<MToolbarImagePopupProps> = ({\n focus,\n onClick,\n hide,\n anchorElement,\n editor,\n className,\n}) => {\n const {uploadHandler, needToSetDimensionsForUploadedImages} = useMarkupToolbarContext();\n\n const selectedString = useMemo(() => {\n const {from, to} = editor.cm.state.selection.main;\n return editor.cm.state.doc.sliceString(from, to);\n // we need to calculate the selection only once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ToolbarImagePopup\n imageTitle={selectedString}\n hide={hide}\n anchorElement={anchorElement}\n focus={focus}\n onClick={onClick}\n className={className}\n onSubmit={({url, name, alt, width, height}) => {\n insertImages([\n {\n url,\n alt,\n title: name,\n width: isNumber(width) ? String(width) : '',\n height: isNumber(height) ? String(height) : '',\n },\n ])(editor.cm);\n }}\n uploadImages={uploadHandler}\n onSuccessUpload={async (res) => {\n const images = await toImageItems(\n res.success,\n Boolean(needToSetDimensionsForUploadedImages),\n );\n insertImages(images)(editor.cm);\n }}\n />\n );\n};\n\nasync function toImageItems(\n items: readonly UploadSuccessItem[],\n withDimensions: boolean,\n): Promise<ImageItem[]> {\n const imgItems: ImageItem[] = [];\n\n await Promise.all(\n items.map<Promise<void>>(({result, file}) => {\n const imgItem: ImageItem = {url: result.url, alt: result.name ?? file.name};\n imgItems.push(imgItem);\n\n if (withDimensions) {\n return getImageDimensions(file).then(({height}) => {\n imgItem.height = String(Math.min(height, IMG_MAX_HEIGHT));\n }, noop);\n }\n return Promise.resolve();\n }),\n );\n\n return imgItems;\n}\n"]}
|
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
.yfm-editor .yfm-quote-link {
|
|
20
20
|
background-color: var(--yfm-quote-link-background);
|
|
21
21
|
}
|
|
22
|
-
.yfm-editor .yfm-quote-link .g-md-img-settings-button
|
|
23
|
-
.yfm-editor .yfm-quote-link .yfm-clipboard-button {
|
|
22
|
+
.yfm-editor .yfm-quote-link .g-md-img-settings-button {
|
|
24
23
|
position: absolute;
|
|
25
24
|
z-index: 2;
|
|
26
25
|
}
|
|
@@ -16,10 +16,10 @@ var ImageTabId;
|
|
|
16
16
|
ImageTabId["Attach"] = "attach";
|
|
17
17
|
ImageTabId["Link"] = "link";
|
|
18
18
|
})(ImageTabId || (ImageTabId = {}));
|
|
19
|
-
export const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, }) => {
|
|
19
|
+
export const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, }) => {
|
|
20
20
|
const [tabId, setTabId] = useState(() => isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link);
|
|
21
21
|
const [url, setUrl] = useState('');
|
|
22
|
-
const [name, setName] = useState('');
|
|
22
|
+
const [name, setName] = useState(providedName ?? '');
|
|
23
23
|
const [alt, setAlt] = useState('');
|
|
24
24
|
const [width, setWidth] = useState();
|
|
25
25
|
const [height, setHeight] = useState();
|