@gravity-ui/markdown-editor 15.8.1 → 15.10.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.
Files changed (55) hide show
  1. package/build/cjs/bundle/Editor.js +1 -0
  2. package/build/cjs/bundle/Editor.js.map +1 -1
  3. package/build/cjs/bundle/types.d.ts +5 -0
  4. package/build/cjs/bundle/types.js.map +1 -1
  5. package/build/cjs/extensions/behavior/SelectionContext/index.d.ts +12 -0
  6. package/build/cjs/extensions/behavior/SelectionContext/index.js +5 -4
  7. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  8. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +11 -5
  9. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +30 -32
  10. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  11. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js +2 -2
  12. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  13. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +2 -2
  14. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  15. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js +2 -2
  16. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  17. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js +2 -3
  18. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  19. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -2
  20. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  21. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js +2 -2
  22. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  23. package/build/cjs/markup/codemirror/create.d.ts +1 -0
  24. package/build/cjs/markup/codemirror/create.js +7 -4
  25. package/build/cjs/markup/codemirror/create.js.map +1 -1
  26. package/build/cjs/version.js +1 -1
  27. package/build/cjs/version.js.map +1 -1
  28. package/build/esm/bundle/Editor.js +1 -0
  29. package/build/esm/bundle/Editor.js.map +1 -1
  30. package/build/esm/bundle/types.d.ts +5 -0
  31. package/build/esm/bundle/types.js.map +1 -1
  32. package/build/esm/extensions/behavior/SelectionContext/index.d.ts +12 -0
  33. package/build/esm/extensions/behavior/SelectionContext/index.js +5 -4
  34. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  35. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +11 -5
  36. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +30 -32
  37. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  38. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js +1 -1
  39. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  40. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +1 -1
  41. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  42. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js +1 -1
  43. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  44. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js +1 -1
  45. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  46. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +1 -1
  47. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  48. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js +1 -1
  49. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  50. package/build/esm/markup/codemirror/create.d.ts +1 -0
  51. package/build/esm/markup/codemirror/create.js +7 -4
  52. package/build/esm/markup/codemirror/create.js.map +1 -1
  53. package/build/esm/version.js +1 -1
  54. package/build/esm/version.js.map +1 -1
  55. package/package.json +2 -1
@@ -169,6 +169,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
169
169
  autocompletion: this.#markupConfig.autocompletion,
170
170
  directiveSyntax: this.directiveSyntax,
171
171
  receiver: this,
172
+ searchPanel: this.#markupConfig.searchPanel,
172
173
  }));
173
174
  }
174
175
  return this.#markupEditor;
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["bundle/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ReactNode} from 'react';\n\nimport {EditorView as CMEditorView} from '@codemirror/view';\nimport {TextSelection} from 'prosemirror-state';\nimport type {EditorView as PMEditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, MarkupString} from '../common';\nimport {\n type ActionStorage,\n type EscapeConfig,\n WysiwygEditor,\n type WysiwygEditorOptions,\n} from '../core';\nimport type {TransformFn} from '../core/markdown/ProseMirrorTransformer';\nimport type {DynamicModifiers} from '../core/types/dynamicModifiers';\nimport type {ReactRenderStorage, RenderStorage} from '../extensions';\nimport {i18n} from '../i18n/bundle';\nimport {type Logger2, globalLogger} from '../logger';\nimport {createCodemirror} from '../markup';\nimport {getAutocompleteConfig} from '../markup/codemirror/autocomplete';\nimport {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';\nimport {type Emitter, type FileUploadHandler, type Receiver, SafeEventEmitter} from '../utils';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\n\nimport {MarkupManager} from './MarkupManager';\nimport {createDynamicModifiers} from './config/dynamicModifiers';\nimport type {\n MarkdownEditorMode as EditorMode,\n MarkdownEditorPreset as EditorPreset,\n MarkdownEditorMdOptions,\n MarkdownEditorOptions,\n MarkdownEditorMarkupConfig as MarkupConfig,\n ParseInsertedUrlAsImage,\n RenderPreview,\n MarkdownEditorSplitMode as SplitMode,\n} from './types';\n\nexport type ToolbarActionData = {\n editorMode: EditorMode;\n id: string;\n attrs?: {[key: string]: any};\n};\n\nexport interface EventMap {\n change: null;\n cancel: null;\n submit: null;\n\n 'toolbar-action': ToolbarActionData;\n\n 'change-editor-mode': {mode: EditorMode};\n 'change-toolbar-visibility': {visible: boolean};\n 'change-split-mode-enabled': {splitModeEnabled: boolean};\n}\n\n// internal events\ninterface EventMapInt extends EventMap {\n rerender: null;\n 'rerender-toolbar': null;\n 'cm-scroll': {event: Event};\n}\n\nexport interface Editor extends Receiver<EventMap>, CommonEditor {\n readonly logger: Logger2.LogReceiver;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n}\n\n/** @internal */\nexport interface EditorInt\n extends CommonEditor,\n Emitter<EventMapInt>,\n Receiver<EventMapInt>,\n ActionStorage,\n CodeEditor {\n readonly logger: Logger2.ILogger;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n readonly splitModeEnabled: boolean;\n readonly splitMode: SplitMode;\n readonly preset: EditorPreset;\n readonly mdOptions: Readonly<MarkdownEditorMdOptions>;\n readonly directiveSyntax: DirectiveSyntaxContext;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n\n readonly currentEditor: CommonEditor;\n readonly wysiwygEditor: WysiwygEditor;\n readonly markupEditor: MarkupEditor;\n\n readonly renderStorage: RenderStorage<ReactNode>;\n readonly fileUploadHandler?: FileUploadHandler;\n readonly needToSetDimensionsForUploadedImages: boolean;\n readonly disableHTMLParsingInMd?: boolean;\n\n readonly renderPreview?: RenderPreview;\n\n changeEditorMode(opts: ChangeEditorModeOptions): void;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n changeToolbarVisibility(opts: {visible: boolean}): void;\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void;\n\n destroy(): void;\n}\n\ntype SetEditorModeOptions = Pick<ChangeEditorModeOptions, 'emit'>;\n\nexport type ChangeEditorModeOptions = {\n mode: EditorMode;\n reason: 'error-boundary' | 'settings' | 'manually';\n emit?: boolean;\n};\n\nexport type EditorOptions = Pick<\n MarkdownEditorOptions,\n 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'\n> & {\n logger: Logger2.ILogger;\n renderStorage: ReactRenderStorage;\n preset: EditorPreset;\n directiveSyntax: DirectiveSyntaxContext;\n pmTransformers: TransformFn[];\n};\n\n/** @internal */\nexport class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorInt {\n #logger: Logger2.ILogger;\n #markup: MarkupString;\n #editorMode: EditorMode;\n #toolbarVisible: boolean;\n #splitModeEnabled: boolean;\n #splitMode: SplitMode;\n #renderPreview?: RenderPreview;\n #wysiwygEditor?: WysiwygEditor;\n #markupEditor?: MarkupEditor;\n #markupConfig: MarkupConfig;\n #escapeConfig?: EscapeConfig;\n #mdOptions: Readonly<MarkdownEditorMdOptions>;\n #pmTransformers: TransformFn[] = [];\n #preserveEmptyRows: boolean;\n #modifiers?: DynamicModifiers[];\n\n readonly #preset: EditorPreset;\n #extensions?: WysiwygEditorOptions['extensions'];\n #renderStorage: ReactRenderStorage;\n #fileUploadHandler?: FileUploadHandler;\n #parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n #needToSetDimensionsForUploadedImages: boolean;\n #enableNewImageSizeCalculation: boolean;\n #directiveSyntax: DirectiveSyntaxContext;\n #prepareRawMarkup?: (value: MarkupString) => MarkupString;\n #beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n\n get _wysiwygView(): PMEditorView {\n // @ts-expect-error internal typing\n return this.#wysiwygEditor?.view;\n }\n\n get logger(): Logger2.ILogger {\n return this.#logger;\n }\n\n get currentMode(): EditorMode {\n return this.#editorMode;\n }\n\n private set currentMode(newMode: EditorMode) {\n switch (newMode) {\n case 'markup': {\n this.#editorMode = newMode;\n if (this.#wysiwygEditor) {\n const markupEditorValue = this.#markupEditor?.getValue();\n const wysiwygEditorValue = this.#wysiwygEditor.getValue();\n if (\n !markupEditorValue ||\n this.shouldReplaceMarkupEditorValue(markupEditorValue, wysiwygEditorValue)\n ) {\n this.#markup = wysiwygEditorValue;\n } else {\n this.#markup = markupEditorValue;\n }\n }\n if (this.#markupEditor) this.#markupEditor.replace(this.#markup);\n break;\n }\n case 'wysiwyg': {\n this.#editorMode = newMode;\n if (this.#markupEditor) {\n const value = this.#markupEditor.getValue();\n this.#markup = this.#prepareRawMarkup?.(value) ?? value;\n } else if (this.#prepareRawMarkup) {\n this.#markup = this.#prepareRawMarkup(this.#markup);\n }\n if (this.#wysiwygEditor) this.#wysiwygEditor.replace(this.#markup);\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + newMode);\n }\n setTimeout(() => {\n this.currentEditor.focus();\n }, 30);\n }\n\n get toolbarVisible(): boolean {\n return this.#toolbarVisible;\n }\n\n get splitModeEnabled(): boolean {\n return this.#splitModeEnabled;\n }\n\n get splitMode(): SplitMode {\n return this.#splitMode;\n }\n\n get preset(): EditorPreset {\n return this.#preset;\n }\n\n get mdOptions(): Readonly<MarkdownEditorMdOptions> {\n return this.#mdOptions;\n }\n\n get directiveSyntax(): DirectiveSyntaxContext {\n return this.#directiveSyntax;\n }\n\n get renderPreview(): RenderPreview | undefined {\n return this.#renderPreview;\n }\n\n get currentEditor(): CommonEditor {\n const mode = this.currentMode;\n switch (mode) {\n case 'markup':\n return this.markupEditor;\n case 'wysiwyg':\n return this.wysiwygEditor;\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n get wysiwygEditor(): WysiwygEditor {\n if (!this.#wysiwygEditor) {\n const mdPreset: NonNullable<WysiwygEditorOptions['mdPreset']> =\n this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';\n this.#wysiwygEditor = new WysiwygEditor({\n mdPreset,\n logger: this.logger.nested({mode: 'wysiwyg'}),\n initialContent: this.#markup,\n extensions: this.#extensions,\n pmTransformers: this.#pmTransformers,\n modifiers: this.#modifiers,\n allowHTML: this.#mdOptions.html,\n linkify: this.#mdOptions.linkify,\n linkifyTlds: this.#mdOptions.linkifyTlds,\n escapeConfig: this.#escapeConfig,\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n });\n }\n return this.#wysiwygEditor;\n }\n\n get markupEditor(): MarkupEditor {\n if (!this.#markupEditor) {\n this.#markupEditor = new MarkupEditor(\n createCodemirror({\n doc: this.#markup,\n logger: this.logger.nested({mode: 'markup'}),\n placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),\n onCancel: () => this.emit('cancel', null),\n onSubmit: () => this.emit('submit', null),\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n onScroll: (event) => this.emit('cm-scroll', {event}),\n reactRenderer: this.#renderStorage,\n uploadHandler: this.fileUploadHandler,\n parseInsertedUrlAsImage: this.parseInsertedUrlAsImage,\n needImageDimensions: this.needToSetDimensionsForUploadedImages,\n parseHtmlOnPaste: this.#markupConfig.parseHtmlOnPaste,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n extensions: this.#markupConfig.extensions,\n disabledExtensions: this.#markupConfig.disabledExtensions,\n keymaps: this.#markupConfig.keymaps,\n preserveEmptyRows: this.#preserveEmptyRows,\n yfmLangOptions: {\n languageData: getAutocompleteConfig({\n preserveEmptyRows: this.#preserveEmptyRows,\n }).concat(this.#markupConfig?.languageData || []),\n },\n autocompletion: this.#markupConfig.autocompletion,\n directiveSyntax: this.directiveSyntax,\n receiver: this,\n }),\n );\n }\n return this.#markupEditor;\n }\n\n get renderStorage(): RenderStorage<ReactNode> {\n return this.#renderStorage;\n }\n\n get fileUploadHandler(): FileUploadHandler | undefined {\n return this.#fileUploadHandler;\n }\n\n get parseInsertedUrlAsImage() {\n return this.#parseInsertedUrlAsImage;\n }\n\n get needToSetDimensionsForUploadedImages(): boolean {\n return this.#needToSetDimensionsForUploadedImages;\n }\n\n get enableNewImageSizeCalculation(): boolean {\n return this.#enableNewImageSizeCalculation;\n }\n\n constructor(opts: EditorOptions) {\n const {logger} = opts;\n\n super({\n onError: (error) => {\n logger.error(error);\n globalLogger.error(error);\n },\n });\n\n const {\n md = {},\n initial = {},\n handlers = {},\n experimental = {},\n markupConfig = {},\n wysiwygConfig = {},\n } = opts;\n\n this.#logger = logger;\n this.#modifiers = experimental.preserveMarkupFormatting\n ? createDynamicModifiers(\n new MarkupManager(this.logger.nested({module: 'markup-manager'})),\n )\n : undefined;\n\n this.#editorMode = initial.mode ?? 'wysiwyg';\n this.#toolbarVisible = initial.toolbarVisible ?? true;\n this.#splitMode = (markupConfig.renderPreview && markupConfig.splitMode) ?? false;\n this.#splitModeEnabled = (this.#splitMode && initial.splitModeEnabled) ?? false;\n this.#renderPreview = markupConfig.renderPreview;\n\n this.#markup = initial.markup ?? '';\n\n this.#preset = opts.preset ?? 'full';\n this.#pmTransformers = opts.pmTransformers;\n this.#mdOptions = md;\n this.#extensions = wysiwygConfig.extensions;\n this.#markupConfig = {...opts.markupConfig};\n\n this.#renderStorage = opts.renderStorage;\n this.#fileUploadHandler = handlers.uploadFile;\n this.#parseInsertedUrlAsImage = markupConfig.parseInsertedUrlAsImage;\n this.#needToSetDimensionsForUploadedImages = Boolean(\n experimental.needToSetDimensionsForUploadedImages,\n );\n this.#directiveSyntax = opts.directiveSyntax;\n this.#enableNewImageSizeCalculation = Boolean(experimental.enableNewImageSizeCalculation);\n this.#preserveEmptyRows = experimental.preserveEmptyRows || false;\n this.#prepareRawMarkup = experimental.prepareRawMarkup;\n this.#escapeConfig = wysiwygConfig.escapeConfig;\n this.#beforeEditorModeChange = experimental.beforeEditorModeChange;\n }\n\n // ---> implements CodeEditor\n\n get cm() {\n return this.markupEditor.cm;\n }\n\n // <--- implements CodeEditor\n\n // ---> implements ActionStorage\n get actions(): WysiwygEditor.Actions {\n return this.wysiwygEditor.actions;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.wysiwygEditor.action(actionName);\n }\n\n // <--- implements ActionStorage\n\n destroy() {\n this.#wysiwygEditor?.destroy();\n this.#markupEditor?.codemirror.destroy();\n\n this.#markupEditor = undefined;\n this.#markupEditor = undefined;\n this.#wysiwygEditor = undefined;\n }\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void {\n this.changeEditorMode({mode, reason: 'manually', emit: opts?.emit});\n }\n\n changeEditorMode({emit = true, ...opts}: ChangeEditorModeOptions): void {\n if (this.#editorMode === opts.mode) return;\n\n if (this.#beforeEditorModeChange?.({mode: opts.mode, reason: opts.reason}) === false) {\n return;\n }\n\n this.logger.event({\n event: 'mode-change',\n prevMode: this.#editorMode,\n nextMode: opts.mode,\n reason: opts.reason,\n });\n\n this.currentMode = opts.mode;\n this.emit('rerender', null);\n\n if (emit) {\n this.emit('change-editor-mode', opts);\n }\n }\n\n changeToolbarVisibility(opts: {visible: boolean}): void {\n this.#toolbarVisible = opts.visible;\n this.emit('rerender', null);\n this.emit('change-toolbar-visibility', opts);\n }\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void {\n if (this.#splitModeEnabled === opts.splitModeEnabled) return;\n this.#splitModeEnabled = opts.splitModeEnabled;\n this.emit('rerender', null);\n this.emit('change-split-mode-enabled', opts);\n }\n\n focus(): void {\n return this.currentEditor.focus();\n }\n\n hasFocus(): boolean {\n return this.currentEditor.hasFocus();\n }\n\n getValue: () => MarkupString = () => this.currentEditor.getValue();\n\n isEmpty(): boolean {\n return this.currentEditor.isEmpty();\n }\n\n clear(): void {\n return this.currentEditor.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.currentEditor.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.currentEditor.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.currentEditor.append(markup);\n }\n\n moveCursor(\n position:\n | 'start'\n | 'end'\n | {\n /** 0-based line number */\n line: number;\n },\n ): void {\n if (typeof position === 'object') {\n return this.moveCursorToLine(position.line);\n }\n\n return this.currentEditor.moveCursor(position);\n }\n\n private moveCursorToLine(/** 0-based line number */ line: number): void {\n const mode = this.currentMode;\n\n switch (mode) {\n case 'markup': {\n const view = this.markupEditor.cm;\n\n let cmLine = line + 1; // lines in codemirror is 1-based\n cmLine = Math.max(cmLine, 1);\n cmLine = Math.min(cmLine, view.state.doc.lines);\n\n const yMargin = getTopOffset(view.dom);\n const anchor = view.state.doc.line(cmLine).from;\n view.dispatch({\n scrollIntoView: true,\n selection: {anchor},\n effects: [\n CMEditorView.scrollIntoView(anchor, {y: 'start', x: 'start', yMargin}),\n ],\n });\n\n break;\n\n // eslint-disable-next-line no-inner-declarations\n }\n case 'wysiwyg': {\n const elem = this.wysiwygEditor.dom.querySelector(`[data-line=\"${line}\"]`);\n\n if (elem) {\n const elemTop = elem.getBoundingClientRect().top;\n const topOffset = getTopOffset(this.wysiwygEditor.dom);\n window.scrollTo({top: elemTop + window.scrollY - topOffset});\n\n const position = this._wysiwygView.posAtDOM(elem, 0);\n const {tr} = this._wysiwygView.state;\n this._wysiwygView.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, position)),\n );\n }\n\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n private shouldReplaceMarkupEditorValue(markupValue: string, wysiwygValue: string) {\n const serializedEditorMarkup = this.#wysiwygEditor?.serializer.serialize(\n this.#wysiwygEditor.parser.parse(markupValue),\n this.#escapeConfig,\n );\n return serializedEditorMarkup?.trim() !== wysiwygValue.trim();\n }\n}\n\nfunction getTopOffset(elem: Element) {\n const TOOLBAR_HEIGHT = 36; //px\n const TOOLBAR_BOTTOM_OFFSET = 8; // px\n const TOOLBAR_TOP_ADDITIONAL_OFFSET = 8; // px\n const TOOLBAR_TOP_OFFSET_VAR = '--g-md-toolbar-sticky-offset';\n\n const topOffsetValue = window.getComputedStyle(elem).getPropertyValue(TOOLBAR_TOP_OFFSET_VAR);\n const toolbarTopOffset =\n calculateCSSNumberValue(topOffsetValue) + TOOLBAR_TOP_ADDITIONAL_OFFSET;\n\n return toolbarTopOffset + TOOLBAR_HEIGHT + TOOLBAR_BOTTOM_OFFSET;\n}\n\nfunction calculateCSSNumberValue(cssValue: string): number {\n const tmp = document.createElement('div');\n tmp.style.position = 'absolute';\n tmp.style.top = '-99999px';\n tmp.style.left = '-99999px';\n tmp.style.width = `calc(${cssValue})`;\n\n document.body.appendChild(tmp);\n const value = tmp.getBoundingClientRect().width;\n tmp.remove();\n\n return value;\n}\n"]}
1
+ {"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["bundle/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ReactNode} from 'react';\n\nimport {EditorView as CMEditorView} from '@codemirror/view';\nimport {TextSelection} from 'prosemirror-state';\nimport type {EditorView as PMEditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, MarkupString} from '../common';\nimport {\n type ActionStorage,\n type EscapeConfig,\n WysiwygEditor,\n type WysiwygEditorOptions,\n} from '../core';\nimport type {TransformFn} from '../core/markdown/ProseMirrorTransformer';\nimport type {DynamicModifiers} from '../core/types/dynamicModifiers';\nimport type {ReactRenderStorage, RenderStorage} from '../extensions';\nimport {i18n} from '../i18n/bundle';\nimport {type Logger2, globalLogger} from '../logger';\nimport {createCodemirror} from '../markup';\nimport {getAutocompleteConfig} from '../markup/codemirror/autocomplete';\nimport {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';\nimport {type Emitter, type FileUploadHandler, type Receiver, SafeEventEmitter} from '../utils';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\n\nimport {MarkupManager} from './MarkupManager';\nimport {createDynamicModifiers} from './config/dynamicModifiers';\nimport type {\n MarkdownEditorMode as EditorMode,\n MarkdownEditorPreset as EditorPreset,\n MarkdownEditorMdOptions,\n MarkdownEditorOptions,\n MarkdownEditorMarkupConfig as MarkupConfig,\n ParseInsertedUrlAsImage,\n RenderPreview,\n MarkdownEditorSplitMode as SplitMode,\n} from './types';\n\nexport type ToolbarActionData = {\n editorMode: EditorMode;\n id: string;\n attrs?: {[key: string]: any};\n};\n\nexport interface EventMap {\n change: null;\n cancel: null;\n submit: null;\n\n 'toolbar-action': ToolbarActionData;\n\n 'change-editor-mode': {mode: EditorMode};\n 'change-toolbar-visibility': {visible: boolean};\n 'change-split-mode-enabled': {splitModeEnabled: boolean};\n}\n\n// internal events\ninterface EventMapInt extends EventMap {\n rerender: null;\n 'rerender-toolbar': null;\n 'cm-scroll': {event: Event};\n}\n\nexport interface Editor extends Receiver<EventMap>, CommonEditor {\n readonly logger: Logger2.LogReceiver;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n}\n\n/** @internal */\nexport interface EditorInt\n extends CommonEditor,\n Emitter<EventMapInt>,\n Receiver<EventMapInt>,\n ActionStorage,\n CodeEditor {\n readonly logger: Logger2.ILogger;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n readonly splitModeEnabled: boolean;\n readonly splitMode: SplitMode;\n readonly preset: EditorPreset;\n readonly mdOptions: Readonly<MarkdownEditorMdOptions>;\n readonly directiveSyntax: DirectiveSyntaxContext;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n\n readonly currentEditor: CommonEditor;\n readonly wysiwygEditor: WysiwygEditor;\n readonly markupEditor: MarkupEditor;\n\n readonly renderStorage: RenderStorage<ReactNode>;\n readonly fileUploadHandler?: FileUploadHandler;\n readonly needToSetDimensionsForUploadedImages: boolean;\n readonly disableHTMLParsingInMd?: boolean;\n\n readonly renderPreview?: RenderPreview;\n\n changeEditorMode(opts: ChangeEditorModeOptions): void;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n changeToolbarVisibility(opts: {visible: boolean}): void;\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void;\n\n destroy(): void;\n}\n\ntype SetEditorModeOptions = Pick<ChangeEditorModeOptions, 'emit'>;\n\nexport type ChangeEditorModeOptions = {\n mode: EditorMode;\n reason: 'error-boundary' | 'settings' | 'manually';\n emit?: boolean;\n};\n\nexport type EditorOptions = Pick<\n MarkdownEditorOptions,\n 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'\n> & {\n logger: Logger2.ILogger;\n renderStorage: ReactRenderStorage;\n preset: EditorPreset;\n directiveSyntax: DirectiveSyntaxContext;\n pmTransformers: TransformFn[];\n};\n\n/** @internal */\nexport class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorInt {\n #logger: Logger2.ILogger;\n #markup: MarkupString;\n #editorMode: EditorMode;\n #toolbarVisible: boolean;\n #splitModeEnabled: boolean;\n #splitMode: SplitMode;\n #renderPreview?: RenderPreview;\n #wysiwygEditor?: WysiwygEditor;\n #markupEditor?: MarkupEditor;\n #markupConfig: MarkupConfig;\n #escapeConfig?: EscapeConfig;\n #mdOptions: Readonly<MarkdownEditorMdOptions>;\n #pmTransformers: TransformFn[] = [];\n #preserveEmptyRows: boolean;\n #modifiers?: DynamicModifiers[];\n\n readonly #preset: EditorPreset;\n #extensions?: WysiwygEditorOptions['extensions'];\n #renderStorage: ReactRenderStorage;\n #fileUploadHandler?: FileUploadHandler;\n #parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n #needToSetDimensionsForUploadedImages: boolean;\n #enableNewImageSizeCalculation: boolean;\n #directiveSyntax: DirectiveSyntaxContext;\n #prepareRawMarkup?: (value: MarkupString) => MarkupString;\n #beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n\n get _wysiwygView(): PMEditorView {\n // @ts-expect-error internal typing\n return this.#wysiwygEditor?.view;\n }\n\n get logger(): Logger2.ILogger {\n return this.#logger;\n }\n\n get currentMode(): EditorMode {\n return this.#editorMode;\n }\n\n private set currentMode(newMode: EditorMode) {\n switch (newMode) {\n case 'markup': {\n this.#editorMode = newMode;\n if (this.#wysiwygEditor) {\n const markupEditorValue = this.#markupEditor?.getValue();\n const wysiwygEditorValue = this.#wysiwygEditor.getValue();\n if (\n !markupEditorValue ||\n this.shouldReplaceMarkupEditorValue(markupEditorValue, wysiwygEditorValue)\n ) {\n this.#markup = wysiwygEditorValue;\n } else {\n this.#markup = markupEditorValue;\n }\n }\n if (this.#markupEditor) this.#markupEditor.replace(this.#markup);\n break;\n }\n case 'wysiwyg': {\n this.#editorMode = newMode;\n if (this.#markupEditor) {\n const value = this.#markupEditor.getValue();\n this.#markup = this.#prepareRawMarkup?.(value) ?? value;\n } else if (this.#prepareRawMarkup) {\n this.#markup = this.#prepareRawMarkup(this.#markup);\n }\n if (this.#wysiwygEditor) this.#wysiwygEditor.replace(this.#markup);\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + newMode);\n }\n setTimeout(() => {\n this.currentEditor.focus();\n }, 30);\n }\n\n get toolbarVisible(): boolean {\n return this.#toolbarVisible;\n }\n\n get splitModeEnabled(): boolean {\n return this.#splitModeEnabled;\n }\n\n get splitMode(): SplitMode {\n return this.#splitMode;\n }\n\n get preset(): EditorPreset {\n return this.#preset;\n }\n\n get mdOptions(): Readonly<MarkdownEditorMdOptions> {\n return this.#mdOptions;\n }\n\n get directiveSyntax(): DirectiveSyntaxContext {\n return this.#directiveSyntax;\n }\n\n get renderPreview(): RenderPreview | undefined {\n return this.#renderPreview;\n }\n\n get currentEditor(): CommonEditor {\n const mode = this.currentMode;\n switch (mode) {\n case 'markup':\n return this.markupEditor;\n case 'wysiwyg':\n return this.wysiwygEditor;\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n get wysiwygEditor(): WysiwygEditor {\n if (!this.#wysiwygEditor) {\n const mdPreset: NonNullable<WysiwygEditorOptions['mdPreset']> =\n this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';\n this.#wysiwygEditor = new WysiwygEditor({\n mdPreset,\n logger: this.logger.nested({mode: 'wysiwyg'}),\n initialContent: this.#markup,\n extensions: this.#extensions,\n pmTransformers: this.#pmTransformers,\n modifiers: this.#modifiers,\n allowHTML: this.#mdOptions.html,\n linkify: this.#mdOptions.linkify,\n linkifyTlds: this.#mdOptions.linkifyTlds,\n escapeConfig: this.#escapeConfig,\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n });\n }\n return this.#wysiwygEditor;\n }\n\n get markupEditor(): MarkupEditor {\n if (!this.#markupEditor) {\n this.#markupEditor = new MarkupEditor(\n createCodemirror({\n doc: this.#markup,\n logger: this.logger.nested({mode: 'markup'}),\n placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),\n onCancel: () => this.emit('cancel', null),\n onSubmit: () => this.emit('submit', null),\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n onScroll: (event) => this.emit('cm-scroll', {event}),\n reactRenderer: this.#renderStorage,\n uploadHandler: this.fileUploadHandler,\n parseInsertedUrlAsImage: this.parseInsertedUrlAsImage,\n needImageDimensions: this.needToSetDimensionsForUploadedImages,\n parseHtmlOnPaste: this.#markupConfig.parseHtmlOnPaste,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n extensions: this.#markupConfig.extensions,\n disabledExtensions: this.#markupConfig.disabledExtensions,\n keymaps: this.#markupConfig.keymaps,\n preserveEmptyRows: this.#preserveEmptyRows,\n yfmLangOptions: {\n languageData: getAutocompleteConfig({\n preserveEmptyRows: this.#preserveEmptyRows,\n }).concat(this.#markupConfig?.languageData || []),\n },\n autocompletion: this.#markupConfig.autocompletion,\n directiveSyntax: this.directiveSyntax,\n receiver: this,\n searchPanel: this.#markupConfig.searchPanel,\n }),\n );\n }\n return this.#markupEditor;\n }\n\n get renderStorage(): RenderStorage<ReactNode> {\n return this.#renderStorage;\n }\n\n get fileUploadHandler(): FileUploadHandler | undefined {\n return this.#fileUploadHandler;\n }\n\n get parseInsertedUrlAsImage() {\n return this.#parseInsertedUrlAsImage;\n }\n\n get needToSetDimensionsForUploadedImages(): boolean {\n return this.#needToSetDimensionsForUploadedImages;\n }\n\n get enableNewImageSizeCalculation(): boolean {\n return this.#enableNewImageSizeCalculation;\n }\n\n constructor(opts: EditorOptions) {\n const {logger} = opts;\n\n super({\n onError: (error) => {\n logger.error(error);\n globalLogger.error(error);\n },\n });\n\n const {\n md = {},\n initial = {},\n handlers = {},\n experimental = {},\n markupConfig = {},\n wysiwygConfig = {},\n } = opts;\n\n this.#logger = logger;\n this.#modifiers = experimental.preserveMarkupFormatting\n ? createDynamicModifiers(\n new MarkupManager(this.logger.nested({module: 'markup-manager'})),\n )\n : undefined;\n\n this.#editorMode = initial.mode ?? 'wysiwyg';\n this.#toolbarVisible = initial.toolbarVisible ?? true;\n this.#splitMode = (markupConfig.renderPreview && markupConfig.splitMode) ?? false;\n this.#splitModeEnabled = (this.#splitMode && initial.splitModeEnabled) ?? false;\n this.#renderPreview = markupConfig.renderPreview;\n\n this.#markup = initial.markup ?? '';\n\n this.#preset = opts.preset ?? 'full';\n this.#pmTransformers = opts.pmTransformers;\n this.#mdOptions = md;\n this.#extensions = wysiwygConfig.extensions;\n this.#markupConfig = {...opts.markupConfig};\n\n this.#renderStorage = opts.renderStorage;\n this.#fileUploadHandler = handlers.uploadFile;\n this.#parseInsertedUrlAsImage = markupConfig.parseInsertedUrlAsImage;\n this.#needToSetDimensionsForUploadedImages = Boolean(\n experimental.needToSetDimensionsForUploadedImages,\n );\n this.#directiveSyntax = opts.directiveSyntax;\n this.#enableNewImageSizeCalculation = Boolean(experimental.enableNewImageSizeCalculation);\n this.#preserveEmptyRows = experimental.preserveEmptyRows || false;\n this.#prepareRawMarkup = experimental.prepareRawMarkup;\n this.#escapeConfig = wysiwygConfig.escapeConfig;\n this.#beforeEditorModeChange = experimental.beforeEditorModeChange;\n }\n\n // ---> implements CodeEditor\n\n get cm() {\n return this.markupEditor.cm;\n }\n\n // <--- implements CodeEditor\n\n // ---> implements ActionStorage\n get actions(): WysiwygEditor.Actions {\n return this.wysiwygEditor.actions;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.wysiwygEditor.action(actionName);\n }\n\n // <--- implements ActionStorage\n\n destroy() {\n this.#wysiwygEditor?.destroy();\n this.#markupEditor?.codemirror.destroy();\n\n this.#markupEditor = undefined;\n this.#markupEditor = undefined;\n this.#wysiwygEditor = undefined;\n }\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void {\n this.changeEditorMode({mode, reason: 'manually', emit: opts?.emit});\n }\n\n changeEditorMode({emit = true, ...opts}: ChangeEditorModeOptions): void {\n if (this.#editorMode === opts.mode) return;\n\n if (this.#beforeEditorModeChange?.({mode: opts.mode, reason: opts.reason}) === false) {\n return;\n }\n\n this.logger.event({\n event: 'mode-change',\n prevMode: this.#editorMode,\n nextMode: opts.mode,\n reason: opts.reason,\n });\n\n this.currentMode = opts.mode;\n this.emit('rerender', null);\n\n if (emit) {\n this.emit('change-editor-mode', opts);\n }\n }\n\n changeToolbarVisibility(opts: {visible: boolean}): void {\n this.#toolbarVisible = opts.visible;\n this.emit('rerender', null);\n this.emit('change-toolbar-visibility', opts);\n }\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void {\n if (this.#splitModeEnabled === opts.splitModeEnabled) return;\n this.#splitModeEnabled = opts.splitModeEnabled;\n this.emit('rerender', null);\n this.emit('change-split-mode-enabled', opts);\n }\n\n focus(): void {\n return this.currentEditor.focus();\n }\n\n hasFocus(): boolean {\n return this.currentEditor.hasFocus();\n }\n\n getValue: () => MarkupString = () => this.currentEditor.getValue();\n\n isEmpty(): boolean {\n return this.currentEditor.isEmpty();\n }\n\n clear(): void {\n return this.currentEditor.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.currentEditor.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.currentEditor.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.currentEditor.append(markup);\n }\n\n moveCursor(\n position:\n | 'start'\n | 'end'\n | {\n /** 0-based line number */\n line: number;\n },\n ): void {\n if (typeof position === 'object') {\n return this.moveCursorToLine(position.line);\n }\n\n return this.currentEditor.moveCursor(position);\n }\n\n private moveCursorToLine(/** 0-based line number */ line: number): void {\n const mode = this.currentMode;\n\n switch (mode) {\n case 'markup': {\n const view = this.markupEditor.cm;\n\n let cmLine = line + 1; // lines in codemirror is 1-based\n cmLine = Math.max(cmLine, 1);\n cmLine = Math.min(cmLine, view.state.doc.lines);\n\n const yMargin = getTopOffset(view.dom);\n const anchor = view.state.doc.line(cmLine).from;\n view.dispatch({\n scrollIntoView: true,\n selection: {anchor},\n effects: [\n CMEditorView.scrollIntoView(anchor, {y: 'start', x: 'start', yMargin}),\n ],\n });\n\n break;\n\n // eslint-disable-next-line no-inner-declarations\n }\n case 'wysiwyg': {\n const elem = this.wysiwygEditor.dom.querySelector(`[data-line=\"${line}\"]`);\n\n if (elem) {\n const elemTop = elem.getBoundingClientRect().top;\n const topOffset = getTopOffset(this.wysiwygEditor.dom);\n window.scrollTo({top: elemTop + window.scrollY - topOffset});\n\n const position = this._wysiwygView.posAtDOM(elem, 0);\n const {tr} = this._wysiwygView.state;\n this._wysiwygView.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, position)),\n );\n }\n\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n private shouldReplaceMarkupEditorValue(markupValue: string, wysiwygValue: string) {\n const serializedEditorMarkup = this.#wysiwygEditor?.serializer.serialize(\n this.#wysiwygEditor.parser.parse(markupValue),\n this.#escapeConfig,\n );\n return serializedEditorMarkup?.trim() !== wysiwygValue.trim();\n }\n}\n\nfunction getTopOffset(elem: Element) {\n const TOOLBAR_HEIGHT = 36; //px\n const TOOLBAR_BOTTOM_OFFSET = 8; // px\n const TOOLBAR_TOP_ADDITIONAL_OFFSET = 8; // px\n const TOOLBAR_TOP_OFFSET_VAR = '--g-md-toolbar-sticky-offset';\n\n const topOffsetValue = window.getComputedStyle(elem).getPropertyValue(TOOLBAR_TOP_OFFSET_VAR);\n const toolbarTopOffset =\n calculateCSSNumberValue(topOffsetValue) + TOOLBAR_TOP_ADDITIONAL_OFFSET;\n\n return toolbarTopOffset + TOOLBAR_HEIGHT + TOOLBAR_BOTTOM_OFFSET;\n}\n\nfunction calculateCSSNumberValue(cssValue: string): number {\n const tmp = document.createElement('div');\n tmp.style.position = 'absolute';\n tmp.style.top = '-99999px';\n tmp.style.left = '-99999px';\n tmp.style.width = `calc(${cssValue})`;\n\n document.body.appendChild(tmp);\n const value = tmp.getBoundingClientRect().width;\n tmp.remove();\n\n return value;\n}\n"]}
@@ -151,6 +151,11 @@ export type MarkdownEditorMarkupConfig = {
151
151
  * The function, used to determine if the pasted text is the image url and should be inserted as an image
152
152
  */
153
153
  parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;
154
+ /**
155
+ * Show search panel in the editor.
156
+ * @default true
157
+ */
158
+ searchPanel?: boolean;
154
159
  };
155
160
  type ExtensionsOptions<T extends object = {}> = Omit<WysiwygPresetExtensionsOptions, 'reactRenderer'> & T;
156
161
  export type MarkdownEditorWysiwygConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {Logger2} from '../logger';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /** Default – empty-doc\n Values:\n - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n *\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n *\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n *\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n // MAJOR: remove markdown-it-attrs\n /**\n * Disable the markdown-it-attrs plugin in the markup parser.\n *\n * Note: The use of the markdown-it-attrs plugin will be removed in the next major version.\n */\n disableMarkdownAttrs?: boolean;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n *\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n logger?: Logger2.ILogger;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {Logger2} from '../logger';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /** Default – empty-doc\n Values:\n - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n *\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n *\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n *\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n /**\n * Show search panel in the editor.\n * @default true\n */\n searchPanel?: boolean;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n // MAJOR: remove markdown-it-attrs\n /**\n * Disable the markdown-it-attrs plugin in the markup parser.\n *\n * Note: The use of the markdown-it-attrs plugin will be removed in the next major version.\n */\n disableMarkdownAttrs?: boolean;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n *\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n logger?: Logger2.ILogger;\n};\n"]}
@@ -3,5 +3,17 @@ import { type ContextConfig } from "./tooltip.js";
3
3
  export type { ContextConfig as SelectionContextConfig, ContextGroupItemData as SelectionContextItemData, } from "./tooltip.js";
4
4
  export type SelectionContextOptions = {
5
5
  config?: ContextConfig;
6
+ /**
7
+ * Placement of context popup
8
+ *
9
+ * @default 'bottom'
10
+ */
11
+ placement?: 'top' | 'bottom';
12
+ /**
13
+ * Prevents context popup from overflowing
14
+ *
15
+ * @default false
16
+ */
17
+ flip?: boolean;
6
18
  };
7
19
  export declare const SelectionContext: ExtensionAuto<SelectionContextOptions>;
@@ -5,9 +5,10 @@ const prosemirror_keymap_1 = require("prosemirror-keymap");
5
5
  const prosemirror_state_1 = require("prosemirror-state");
6
6
  const nodes_1 = require("../../../utils/nodes.js");
7
7
  const tooltip_1 = require("./tooltip.js");
8
- const SelectionContext = (builder, { config }) => {
8
+ const SelectionContext = (builder, opts) => {
9
+ const { config } = opts;
9
10
  if (Array.isArray(config) && config.length > 0) {
10
- builder.addPlugin(({ actions }) => new prosemirror_state_1.Plugin(new SelectionTooltip(actions, config, builder.logger)));
11
+ builder.addPlugin(({ actions }) => new prosemirror_state_1.Plugin(new SelectionTooltip(actions, config, builder.logger, opts)));
11
12
  }
12
13
  };
13
14
  exports.SelectionContext = SelectionContext;
@@ -16,8 +17,8 @@ class SelectionTooltip {
16
17
  tooltip;
17
18
  hideTimeoutRef = null;
18
19
  _isMousePressed = false;
19
- constructor(actions, menuConfig, logger) {
20
- this.tooltip = new tooltip_1.TooltipView(actions, menuConfig, logger);
20
+ constructor(actions, menuConfig, logger, options) {
21
+ this.tooltip = new tooltip_1.TooltipView(actions, menuConfig, logger, options);
21
22
  }
22
23
  get props() {
23
24
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n type PluginSpec,\n TextSelection,\n} from 'prosemirror-state';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, {config}) => {\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(\n ({actions}) => new Plugin(new SelectionTooltip(actions, config, builder.logger)),\n );\n }\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<unknown> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger) {\n this.tooltip = new TooltipView(actions, menuConfig, logger);\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (!view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n // Hide the tooltip when one side of selection inside codeblock\n if (isCodeBlock(selection.$from.parent) || isCodeBlock(selection.$to.parent)) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n type PluginSpec,\n TextSelection,\n} from 'prosemirror-state';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n /**\n * Placement of context popup\n *\n * @default 'bottom'\n */\n placement?: 'top' | 'bottom';\n /**\n * Prevents context popup from overflowing\n *\n * @default false\n */\n flip?: boolean;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, opts) => {\n const {config} = opts;\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(\n ({actions}) => new Plugin(new SelectionTooltip(actions, config, builder.logger, opts)),\n );\n }\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<unknown> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n options: SelectionContextOptions,\n ) {\n this.tooltip = new TooltipView(actions, menuConfig, logger, options);\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (!view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n // Hide the tooltip when one side of selection inside codeblock\n if (isCodeBlock(selection.$from.parent) || isCodeBlock(selection.$to.parent)) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n"]}
@@ -11,15 +11,22 @@ export type ContextGroupItemData = (ToolbarGroupItemData<ActionStorage> & {
11
11
  });
12
12
  export type ContextGroupData = ContextGroupItemData[];
13
13
  export type ContextConfig = ContextGroupData[];
14
+ export type TooltipViewParams = {
15
+ /** @default 'bottom' */
16
+ placement?: 'top' | 'bottom';
17
+ /** @default false */
18
+ flip?: boolean;
19
+ };
14
20
  export declare class TooltipView {
15
21
  #private;
16
- private logger;
17
- private actions;
18
- private menuConfig;
22
+ private readonly logger;
23
+ private readonly actions;
24
+ private readonly menuConfig;
25
+ private readonly placement;
19
26
  private view;
20
27
  private baseProps;
21
28
  private _tooltipRenderItem;
22
- constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger);
29
+ constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger, params: TooltipViewParams);
23
30
  get isTooltipOpen(): boolean;
24
31
  show(view: EditorView, popupProps?: PopupProps): void;
25
32
  hide(view: EditorView): void;
@@ -29,5 +36,4 @@ export declare class TooltipView {
29
36
  private renderPopup;
30
37
  private get tooltipRenderItem();
31
38
  private calcPosition;
32
- private get popupTextOffset();
33
39
  }
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TooltipView = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("@floating-ui/react"); // eslint-disable-line import/no-extraneous-dependencies
6
5
  const uikit_1 = require("@gravity-ui/uikit");
7
6
  const lodash_1 = require("../../../lodash.js");
8
7
  const logger_1 = require("../../../logger.js");
@@ -19,13 +18,16 @@ class TooltipView {
19
18
  logger;
20
19
  actions;
21
20
  menuConfig;
21
+ placement;
22
22
  view;
23
23
  baseProps = { show: false, poppupProps: {} };
24
24
  _tooltipRenderItem = null;
25
- constructor(actions, menuConfig, logger) {
25
+ constructor(actions, menuConfig, logger, params) {
26
26
  this.logger = logger;
27
27
  this.actions = actions;
28
28
  this.menuConfig = menuConfig;
29
+ const { flip, placement = 'bottom' } = params;
30
+ this.placement = flip ? placement : [placement];
29
31
  }
30
32
  get isTooltipOpen() {
31
33
  return this.#isTooltipOpen;
@@ -91,39 +93,35 @@ class TooltipView {
91
93
  return this._tooltipRenderItem;
92
94
  }
93
95
  calcPosition(view) {
94
- const viewDom = view.dom;
95
- // The box in which the tooltip is positioned, to use as base
96
- const viewBox = viewDom.getBoundingClientRect();
97
- const viewWidth = viewBox.right - viewBox.left;
98
- const viewHalfWidth = viewWidth / 2;
99
- // These are in screen coordinates
100
- const start = view.coordsAtPos(view.state.selection.from);
101
- const end = view.coordsAtPos(view.state.selection.to);
102
- // Find a center-ish x position from the selection endpoints (when
103
- // crossing lines, end may be more to the left)
104
- const left = Math.max((start.left + end.left) / 2, start.left + 3);
105
- const leftOffset = left - (viewBox.left + viewHalfWidth);
106
- const bottomOffset = -(viewBox.bottom - end.bottom) + this.popupTextOffset;
96
+ const virtualElem = {
97
+ getBoundingClientRect() {
98
+ // These are in screen coordinates
99
+ const start = view.coordsAtPos(view.state.selection.from);
100
+ const end = view.coordsAtPos(view.state.selection.to);
101
+ // Find a center-ish x position from the selection endpoints (when
102
+ // crossing lines, end may be more to the left)
103
+ const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);
104
+ const top = start.top;
105
+ const left = yCenter - 1;
106
+ const width = 2;
107
+ const height = end.bottom - start.top;
108
+ return {
109
+ top,
110
+ left,
111
+ right: left + width,
112
+ bottom: top + height,
113
+ y: top,
114
+ x: left,
115
+ height,
116
+ width,
117
+ };
118
+ },
119
+ };
107
120
  return {
108
- placement: 'bottom',
109
- anchorElement: viewDom,
110
- // override floating middlewares
111
- floatingMiddlewares: [
112
- (0, react_1.offset)({
113
- mainAxis: bottomOffset,
114
- crossAxis: leftOffset,
115
- }),
116
- (0, react_1.shift)({
117
- mainAxis: true,
118
- crossAxis: false,
119
- padding: 4,
120
- }),
121
- ],
121
+ placement: this.placement,
122
+ anchorElement: virtualElem,
122
123
  };
123
124
  }
124
- get popupTextOffset() {
125
- return 4; // 4px offset from text selection
126
- }
127
125
  }
128
126
  exports.TooltipView = TooltipView;
129
127
  //# sourceMappingURL=tooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import {offset, shift} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private logger: Logger2.ILogger;\n private actions: ActionStorage;\n private menuConfig: ContextConfig;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const viewDom = view.dom as Element;\n // The box in which the tooltip is positioned, to use as base\n const viewBox = viewDom.getBoundingClientRect();\n\n const viewWidth = viewBox.right - viewBox.left;\n const viewHalfWidth = viewWidth / 2;\n\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const left = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const leftOffset = left - (viewBox.left + viewHalfWidth);\n const bottomOffset = -(viewBox.bottom - end.bottom) + this.popupTextOffset;\n\n return {\n placement: 'bottom',\n anchorElement: viewDom,\n // override floating middlewares\n floatingMiddlewares: [\n offset({\n mainAxis: bottomOffset,\n crossAxis: leftOffset,\n }),\n shift({\n mainAxis: true,\n crossAxis: false,\n padding: 4,\n }),\n ],\n };\n }\n\n private get popupTextOffset() {\n return 4; // 4px offset from text selection\n }\n}\n"]}
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SuperscriptSpecs = exports.superscriptType = exports.superscriptMarkName = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const log_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/log.js"));
5
+ const log_js_1 = require("@diplodoc/transform/lib/log.js");
6
6
  const sup_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/plugins/sup.js"));
7
7
  const schema_1 = require("../../../../utils/schema.js");
8
8
  exports.superscriptMarkName = 'sup';
9
9
  exports.superscriptType = (0, schema_1.markTypeFactory)(exports.superscriptMarkName);
10
10
  const SuperscriptSpecs = (builder) => {
11
11
  builder
12
- .configureMd((md) => md.use(sup_js_1.default, { log: log_js_1.default }))
12
+ .configureMd((md) => md.use(sup_js_1.default, { log: log_js_1.log }))
13
13
  .addMark(exports.superscriptMarkName, () => ({
14
14
  spec: {
15
15
  excludes: '_',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Superscript/SuperscriptSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,oFAAiD;AACjD,4FAAyD;AAGzD,wDAAyD;AAE5C,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,eAAe,GAAG,IAAA,wBAAe,EAAC,2BAAmB,CAAC,CAAC;AAE7D,MAAM,gBAAgB,GAAkB,CAAC,OAAO,EAAE,EAAE;IACvD,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAG,EAAE,EAAC,GAAG,EAAH,gBAAG,EAAC,CAAC,CAAC;SACvC,OAAO,CAAC,2BAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE;YACF,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC;YACxB,KAAK;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;SACJ;QACD,IAAI,EAAE;YACF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBACZ,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC9B,OAAO,GAAG,CAAC;YACf,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAC/B,OAAO,GAAG,CAAC;YACf,CAAC;YACD,OAAO,EAAE,IAAI;YACb,wBAAwB,EAAE,IAAI;SACjC;QACD,MAAM,EAAE,EAAC,SAAS,EAAE,EAAC,IAAI,EAAE,2BAAmB,EAAE,IAAI,EAAE,MAAM,EAAC,EAAC;KACjE,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B","sourcesContent":["import log from '@diplodoc/transform/lib/log.js';\nimport sup from '@diplodoc/transform/lib/plugins/sup.js';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {markTypeFactory} from '../../../../utils/schema';\n\nexport const superscriptMarkName = 'sup';\nexport const superscriptType = markTypeFactory(superscriptMarkName);\n\nexport const SuperscriptSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) => md.use(sup, {log}))\n .addMark(superscriptMarkName, () => ({\n spec: {\n excludes: '_',\n parseDOM: [{tag: 'sup'}],\n toDOM() {\n return ['sup'];\n },\n },\n toMd: {\n open: (state) => {\n state.escapeWhitespace = true;\n return '^';\n },\n close: (state) => {\n state.escapeWhitespace = false;\n return '^';\n },\n mixable: true,\n expelEnclosingWhitespace: true,\n },\n fromMd: {tokenSpec: {name: superscriptMarkName, type: 'mark'}},\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Superscript/SuperscriptSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAmD;AACnD,4FAAyD;AAGzD,wDAAyD;AAE5C,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,eAAe,GAAG,IAAA,wBAAe,EAAC,2BAAmB,CAAC,CAAC;AAE7D,MAAM,gBAAgB,GAAkB,CAAC,OAAO,EAAE,EAAE;IACvD,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAG,EAAE,EAAC,GAAG,EAAH,YAAG,EAAC,CAAC,CAAC;SACvC,OAAO,CAAC,2BAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE;YACF,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC;YACxB,KAAK;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;SACJ;QACD,IAAI,EAAE;YACF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBACZ,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC9B,OAAO,GAAG,CAAC;YACf,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAC/B,OAAO,GAAG,CAAC;YACf,CAAC;YACD,OAAO,EAAE,IAAI;YACb,wBAAwB,EAAE,IAAI;SACjC;QACD,MAAM,EAAE,EAAC,SAAS,EAAE,EAAC,IAAI,EAAE,2BAAmB,EAAE,IAAI,EAAE,MAAM,EAAC,EAAC;KACjE,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport sup from '@diplodoc/transform/lib/plugins/sup.js';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {markTypeFactory} from '../../../../utils/schema';\n\nexport const superscriptMarkName = 'sup';\nexport const superscriptType = markTypeFactory(superscriptMarkName);\n\nexport const SuperscriptSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) => md.use(sup, {log}))\n .addMark(superscriptMarkName, () => ({\n spec: {\n excludes: '_',\n parseDOM: [{tag: 'sup'}],\n toDOM() {\n return ['sup'];\n },\n },\n toMd: {\n open: (state) => {\n state.escapeWhitespace = true;\n return '^';\n },\n close: (state) => {\n state.escapeWhitespace = false;\n return '^';\n },\n mixable: true,\n expelEnclosingWhitespace: true,\n },\n fromMd: {tokenSpec: {name: superscriptMarkName, type: 'mark'}},\n }));\n};\n"]}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ImgSizeSpecs = exports.ImgSizeAttr = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const log_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/log.js"));
5
+ const log_js_1 = require("@diplodoc/transform/lib/log.js");
6
6
  const index_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/plugins/imsize/index.js"));
7
7
  const is_number_1 = tslib_1.__importDefault(require("is-number"));
8
8
  const const_1 = require("../../../markdown/Image/const.js");
@@ -10,7 +10,7 @@ const const_2 = require("./const.js");
10
10
  Object.defineProperty(exports, "ImgSizeAttr", { enumerable: true, get: function () { return const_2.ImgSizeAttr; } });
11
11
  const ImgSizeSpecs = (builder, opts) => {
12
12
  const placeholderContent = builder.context.get('placeholder')?.imgSize;
13
- builder.configureMd((md) => md.use(index_js_1.default, { log: log_js_1.default, enableInlineStyling: true }));
13
+ builder.configureMd((md) => md.use(index_js_1.default, { log: log_js_1.log, enableInlineStyling: true }));
14
14
  builder.addNode(const_1.imageNodeName, () => ({
15
15
  spec: {
16
16
  inline: true,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import log from '@diplodoc/transform/lib/log.js';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize/index.js';\nimport isNumber from 'is-number';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {imageNodeName} from '../../../markdown/Image/const';\n\nimport {ImgSizeAttr} from './const';\n\ntype ImsizeTypedAttributes = {\n [ImgSizeAttr.Src]: string;\n [ImgSizeAttr.Title]: string | null;\n [ImgSizeAttr.Alt]: string | null;\n [ImgSizeAttr.Width]: string | null;\n [ImgSizeAttr.Height]: string | null;\n [ImgSizeAttr.Loading]: string | null;\n};\n\nexport {ImgSizeAttr};\n\nexport type ImgSizeSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n placeholder?: NodeSpec['placeholder'];\n};\n\nexport const ImgSizeSpecs: ExtensionAuto<ImgSizeSpecsOptions> = (builder, opts) => {\n const placeholderContent = builder.context.get('placeholder')?.imgSize;\n\n builder.configureMd((md) => md.use(imsize, {log, enableInlineStyling: true}));\n builder.addNode(imageNodeName, () => ({\n spec: {\n inline: true,\n attrs: {\n [ImgSizeAttr.Src]: {},\n [ImgSizeAttr.Alt]: {default: null},\n [ImgSizeAttr.Title]: {default: null},\n [ImgSizeAttr.Height]: {default: null},\n [ImgSizeAttr.Width]: {default: null},\n [ImgSizeAttr.Loading]: {default: null},\n },\n placeholder: placeholderContent ? {content: placeholderContent} : opts.placeholder,\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const height = (dom as Element).getAttribute(ImgSizeAttr.Height);\n const width = (dom as Element).getAttribute(ImgSizeAttr.Width);\n\n return {\n [ImgSizeAttr.Src]: (dom as Element).getAttribute(ImgSizeAttr.Src),\n [ImgSizeAttr.Alt]: (dom as Element).getAttribute(ImgSizeAttr.Alt),\n [ImgSizeAttr.Title]: (dom as Element).getAttribute(ImgSizeAttr.Title),\n [ImgSizeAttr.Loading]: (dom as Element).getAttribute(\n ImgSizeAttr.Loading,\n ),\n [ImgSizeAttr.Height]: isNumber(height) ? height : null,\n [ImgSizeAttr.Width]: isNumber(width) ? height : null,\n };\n },\n },\n ],\n toDOM(node) {\n return ['img', node.attrs];\n },\n },\n fromMd: {\n tokenSpec: {\n name: imageNodeName,\n type: 'node',\n getAttrs: (tok): ImsizeTypedAttributes => ({\n [ImgSizeAttr.Src]: tok.attrGet(ImgSizeAttr.Src)!,\n [ImgSizeAttr.Title]: tok.attrGet(ImgSizeAttr.Title),\n [ImgSizeAttr.Height]: tok.attrGet(ImgSizeAttr.Height),\n [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),\n [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),\n [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,\n }),\n },\n },\n toMd: (state, node) => {\n const attrs = node.attrs as ImsizeTypedAttributes;\n let result = '![';\n\n if (attrs.alt) {\n result += state.esc(attrs.alt);\n }\n\n result += '](';\n\n if (attrs.src) {\n result += state.esc(attrs.src);\n }\n\n if (attrs.title) {\n result += ` ${state.quote(attrs.title)}`;\n }\n\n result += getSize(attrs);\n result += ')';\n\n state.write(result);\n },\n }));\n};\n\nfunction getSize({width, height}: ImsizeTypedAttributes): string {\n if (width || height) {\n return ` =${width || ''}x${height || ''}`;\n }\n\n return '';\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize/index.js';\nimport isNumber from 'is-number';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {imageNodeName} from '../../../markdown/Image/const';\n\nimport {ImgSizeAttr} from './const';\n\ntype ImsizeTypedAttributes = {\n [ImgSizeAttr.Src]: string;\n [ImgSizeAttr.Title]: string | null;\n [ImgSizeAttr.Alt]: string | null;\n [ImgSizeAttr.Width]: string | null;\n [ImgSizeAttr.Height]: string | null;\n [ImgSizeAttr.Loading]: string | null;\n};\n\nexport {ImgSizeAttr};\n\nexport type ImgSizeSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n placeholder?: NodeSpec['placeholder'];\n};\n\nexport const ImgSizeSpecs: ExtensionAuto<ImgSizeSpecsOptions> = (builder, opts) => {\n const placeholderContent = builder.context.get('placeholder')?.imgSize;\n\n builder.configureMd((md) => md.use(imsize, {log, enableInlineStyling: true}));\n builder.addNode(imageNodeName, () => ({\n spec: {\n inline: true,\n attrs: {\n [ImgSizeAttr.Src]: {},\n [ImgSizeAttr.Alt]: {default: null},\n [ImgSizeAttr.Title]: {default: null},\n [ImgSizeAttr.Height]: {default: null},\n [ImgSizeAttr.Width]: {default: null},\n [ImgSizeAttr.Loading]: {default: null},\n },\n placeholder: placeholderContent ? {content: placeholderContent} : opts.placeholder,\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const height = (dom as Element).getAttribute(ImgSizeAttr.Height);\n const width = (dom as Element).getAttribute(ImgSizeAttr.Width);\n\n return {\n [ImgSizeAttr.Src]: (dom as Element).getAttribute(ImgSizeAttr.Src),\n [ImgSizeAttr.Alt]: (dom as Element).getAttribute(ImgSizeAttr.Alt),\n [ImgSizeAttr.Title]: (dom as Element).getAttribute(ImgSizeAttr.Title),\n [ImgSizeAttr.Loading]: (dom as Element).getAttribute(\n ImgSizeAttr.Loading,\n ),\n [ImgSizeAttr.Height]: isNumber(height) ? height : null,\n [ImgSizeAttr.Width]: isNumber(width) ? height : null,\n };\n },\n },\n ],\n toDOM(node) {\n return ['img', node.attrs];\n },\n },\n fromMd: {\n tokenSpec: {\n name: imageNodeName,\n type: 'node',\n getAttrs: (tok): ImsizeTypedAttributes => ({\n [ImgSizeAttr.Src]: tok.attrGet(ImgSizeAttr.Src)!,\n [ImgSizeAttr.Title]: tok.attrGet(ImgSizeAttr.Title),\n [ImgSizeAttr.Height]: tok.attrGet(ImgSizeAttr.Height),\n [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),\n [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),\n [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,\n }),\n },\n },\n toMd: (state, node) => {\n const attrs = node.attrs as ImsizeTypedAttributes;\n let result = '![';\n\n if (attrs.alt) {\n result += state.esc(attrs.alt);\n }\n\n result += '](';\n\n if (attrs.src) {\n result += state.esc(attrs.src);\n }\n\n if (attrs.title) {\n result += ` ${state.quote(attrs.title)}`;\n }\n\n result += getSize(attrs);\n result += ')';\n\n state.write(result);\n },\n }));\n};\n\nfunction getSize({width, height}: ImsizeTypedAttributes): string {\n if (width || height) {\n return ` =${width || ''}x${height || ''}`;\n }\n\n return '';\n}\n"]}
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MonospaceSpecs = exports.monospaceType = exports.monospaceMarkName = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const log_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/log.js"));
5
+ const log_js_1 = require("@diplodoc/transform/lib/log.js");
6
6
  const monospace_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/plugins/monospace.js"));
7
7
  const schema_1 = require("../../../../utils/schema.js");
8
8
  exports.monospaceMarkName = 'monospace';
9
9
  exports.monospaceType = (0, schema_1.markTypeFactory)(exports.monospaceMarkName);
10
10
  const MonospaceSpecs = (builder) => {
11
11
  builder
12
- .configureMd((md) => md.use(monospace_js_1.default, { log: log_js_1.default }))
12
+ .configureMd((md) => md.use(monospace_js_1.default, { log: log_js_1.log }))
13
13
  .addMark(exports.monospaceMarkName, () => ({
14
14
  spec: {
15
15
  parseDOM: [{ tag: 'samp' }],