@gravity-ui/markdown-editor 15.7.0 → 15.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/build/cjs/bundle/MarkdownEditorView.d.ts +7 -28
  2. package/build/cjs/bundle/MarkdownEditorView.js +49 -49
  3. package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
  4. package/build/cjs/bundle/MarkupEditorComponent.d.ts +2 -1
  5. package/build/cjs/bundle/MarkupEditorComponent.js +2 -2
  6. package/build/cjs/bundle/MarkupEditorComponent.js.map +1 -1
  7. package/build/cjs/bundle/MarkupEditorView.js +1 -1
  8. package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
  9. package/build/cjs/bundle/ToolbarView.d.ts +3 -2
  10. package/build/cjs/bundle/ToolbarView.js +2 -2
  11. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  12. package/build/cjs/bundle/WysiwygEditorComponent.d.ts +2 -1
  13. package/build/cjs/bundle/WysiwygEditorComponent.js +2 -2
  14. package/build/cjs/bundle/WysiwygEditorComponent.js.map +1 -1
  15. package/build/cjs/bundle/WysiwygEditorView.js +1 -1
  16. package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
  17. package/build/cjs/bundle/settings/index.d.ts +2 -1
  18. package/build/cjs/bundle/settings/index.js +3 -3
  19. package/build/cjs/bundle/settings/index.js.map +1 -1
  20. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
  21. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
  22. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
  23. package/build/cjs/bundle/toolbar/markup/MToolbarImagePopup.js +8 -1
  24. package/build/cjs/bundle/toolbar/markup/MToolbarImagePopup.js.map +1 -1
  25. package/build/cjs/extensions/additional/QuoteLink/index.css +1 -2
  26. package/build/cjs/extensions/behavior/CommandMenu/component.js +1 -1
  27. package/build/cjs/extensions/behavior/CommandMenu/component.js.map +1 -1
  28. package/build/cjs/extensions/markdown/Link/PlaceholderWidget/widget.js +1 -1
  29. package/build/cjs/extensions/markdown/Link/PlaceholderWidget/widget.js.map +1 -1
  30. package/build/cjs/forms/ImageForm.d.ts +1 -0
  31. package/build/cjs/forms/ImageForm.js +2 -2
  32. package/build/cjs/forms/ImageForm.js.map +1 -1
  33. package/build/cjs/markup/codemirror/create.js +16 -11
  34. package/build/cjs/markup/codemirror/create.js.map +1 -1
  35. package/build/cjs/modules/toolbars/items.js +2 -1
  36. package/build/cjs/modules/toolbars/items.js.map +1 -1
  37. package/build/cjs/toolbar/FlexToolbar.js +1 -1
  38. package/build/cjs/toolbar/FlexToolbar.js.map +1 -1
  39. package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
  40. package/build/cjs/toolbar/ToolbarButton.js +10 -8
  41. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  42. package/build/cjs/toolbar/ToolbarListButton.d.ts +1 -1
  43. package/build/cjs/toolbar/ToolbarListButton.js +2 -2
  44. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  45. package/build/cjs/toolbar/types.d.ts +3 -3
  46. package/build/cjs/toolbar/types.js.map +1 -1
  47. package/build/cjs/version.js +1 -1
  48. package/build/cjs/version.js.map +1 -1
  49. package/build/cjs/view/components/YfmHtml/YfmStaticView.d.ts +3 -4
  50. package/build/cjs/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  51. package/build/esm/bundle/MarkdownEditorView.d.ts +7 -28
  52. package/build/esm/bundle/MarkdownEditorView.js +49 -49
  53. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  54. package/build/esm/bundle/MarkupEditorComponent.d.ts +2 -1
  55. package/build/esm/bundle/MarkupEditorComponent.js +2 -2
  56. package/build/esm/bundle/MarkupEditorComponent.js.map +1 -1
  57. package/build/esm/bundle/MarkupEditorView.js +1 -1
  58. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  59. package/build/esm/bundle/ToolbarView.d.ts +3 -2
  60. package/build/esm/bundle/ToolbarView.js +2 -2
  61. package/build/esm/bundle/ToolbarView.js.map +1 -1
  62. package/build/esm/bundle/WysiwygEditorComponent.d.ts +2 -1
  63. package/build/esm/bundle/WysiwygEditorComponent.js +2 -2
  64. package/build/esm/bundle/WysiwygEditorComponent.js.map +1 -1
  65. package/build/esm/bundle/WysiwygEditorView.js +1 -1
  66. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  67. package/build/esm/bundle/settings/index.d.ts +2 -1
  68. package/build/esm/bundle/settings/index.js +3 -3
  69. package/build/esm/bundle/settings/index.js.map +1 -1
  70. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
  71. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
  72. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
  73. package/build/esm/bundle/toolbar/markup/MToolbarImagePopup.js +8 -1
  74. package/build/esm/bundle/toolbar/markup/MToolbarImagePopup.js.map +1 -1
  75. package/build/esm/extensions/additional/QuoteLink/index.css +1 -2
  76. package/build/esm/extensions/behavior/CommandMenu/component.js +1 -1
  77. package/build/esm/extensions/behavior/CommandMenu/component.js.map +1 -1
  78. package/build/esm/extensions/markdown/Link/PlaceholderWidget/widget.js +1 -1
  79. package/build/esm/extensions/markdown/Link/PlaceholderWidget/widget.js.map +1 -1
  80. package/build/esm/forms/ImageForm.d.ts +1 -0
  81. package/build/esm/forms/ImageForm.js +2 -2
  82. package/build/esm/forms/ImageForm.js.map +1 -1
  83. package/build/esm/markup/codemirror/create.js +16 -11
  84. package/build/esm/markup/codemirror/create.js.map +1 -1
  85. package/build/esm/modules/toolbars/items.js +2 -1
  86. package/build/esm/modules/toolbars/items.js.map +1 -1
  87. package/build/esm/toolbar/FlexToolbar.js +1 -1
  88. package/build/esm/toolbar/FlexToolbar.js.map +1 -1
  89. package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
  90. package/build/esm/toolbar/ToolbarButton.js +10 -8
  91. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  92. package/build/esm/toolbar/ToolbarListButton.d.ts +1 -1
  93. package/build/esm/toolbar/ToolbarListButton.js +2 -2
  94. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  95. package/build/esm/toolbar/types.d.ts +3 -3
  96. package/build/esm/toolbar/types.js.map +1 -1
  97. package/build/esm/version.js +1 -1
  98. package/build/esm/version.js.map +1 -1
  99. package/build/esm/view/components/YfmHtml/YfmStaticView.d.ts +3 -4
  100. package/build/esm/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  101. package/build/styles.css +1 -2
  102. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["bundle/settings/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport {memo, useState} from 'react';\n\nimport {Eye, Gear, LogoMarkdown} from '@gravity-ui/icons';\nimport {\n ActionTooltip,\n Button,\n Checkbox,\n HelpMark,\n Icon,\n Menu,\n Popup,\n type PopupPlacement,\n} from '@gravity-ui/uikit';\n\nimport {type ClassNameProps, cn} from '../../classname';\nimport {i18n} from '../../i18n/bundle';\nimport WysiwygModeIcon from '../../icons/WysiwygMode';\nimport {noop} from '../../lodash';\nimport {useBooleanState} from '../../react-utils/hooks';\nimport {ToolbarTooltipDelay} from '../../toolbar';\nimport {VERSION} from '../../version';\nimport type {MarkdownEditorMode, MarkdownEditorSplitMode} from '../types';\n\nimport {MarkdownHints} from './MarkdownHints';\n\nimport './index.scss';\n\nconst placement: PopupPlacement = ['bottom-end', 'top-end'];\n\nconst bSettings = cn('editor-settings');\nconst bContent = cn('settings-content');\n\nexport type EditorSettingsProps = Omit<SettingsContentProps, 'onClose'> & {\n renderPreviewButton?: boolean;\n settingsVisible?: boolean;\n};\n\nexport const EditorSettings = memo<EditorSettingsProps>(function EditorSettings(props) {\n const {className, onShowPreviewChange, showPreview, renderPreviewButton, settingsVisible} =\n props;\n const [chevronElement, setChevronElement] = useState<HTMLButtonElement | null>(null);\n const [popupShown, , hidePopup, togglePopup] = useBooleanState(false);\n\n return (\n <div className={bSettings(null, [className])}>\n {renderPreviewButton && (\n <>\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n title={i18n('preview_hint')}\n hotkey=\"mod+shift+p\"\n >\n <Button\n qa=\"g-md-markup-preview-button\"\n size=\"m\"\n view=\"flat\"\n pin=\"round-round\"\n className={bSettings('preview-button')}\n onClick={() => onShowPreviewChange?.(!showPreview)}\n selected={showPreview}\n >\n <Icon data={Eye} />\n </Button>\n </ActionTooltip>\n {settingsVisible && <div className={bSettings('separator')} />}\n </>\n )}\n {settingsVisible && (\n <>\n <Button\n size=\"m\"\n view=\"flat\"\n pin=\"round-round\"\n onClick={togglePopup}\n ref={setChevronElement}\n qa=\"g-md-settings-button\"\n className={bSettings('dropdown-button')}\n >\n <Icon data={Gear} />\n </Button>\n <Popup\n open={popupShown}\n anchorElement={chevronElement}\n placement={placement}\n onOpenChange={hidePopup}\n >\n <SettingsContent\n {...props}\n onClose={hidePopup}\n className={bSettings('content')}\n />\n </Popup>\n </>\n )}\n </div>\n );\n});\n\ntype SettingsContentProps = ClassNameProps & {\n mode: MarkdownEditorMode;\n onClose: () => void;\n onModeChange: (mode: MarkdownEditorMode) => void;\n onShowPreviewChange: (showPreview: boolean) => void;\n showPreview: boolean;\n toolbarVisibility: boolean;\n onToolbarVisibilityChange: (val: boolean) => void;\n splitMode?: MarkdownEditorSplitMode;\n splitModeEnabled?: boolean;\n onSplitModeChange?: (splitModeEnabled: boolean) => void;\n};\n\nconst mdHelpPlacement: PopupPlacement = ['bottom', 'bottom-end', 'right-start', 'right', 'left'];\n\nconst SettingsContent: React.FC<SettingsContentProps> = function SettingsContent({\n mode,\n onClose,\n onModeChange,\n toolbarVisibility,\n onToolbarVisibilityChange,\n onSplitModeChange,\n splitMode = false,\n splitModeEnabled,\n className,\n showPreview,\n}) {\n return (\n <div className={bContent(null, [className])} data-qa=\"g-md-settings-content\">\n <Menu size=\"l\" className={bContent('mode')}>\n <Menu.Item\n qa=\"g-md-settings-mode-wysiwyg\"\n active={mode === 'wysiwyg'}\n onClick={() => {\n onModeChange('wysiwyg');\n onClose();\n }}\n iconStart={<Icon data={WysiwygModeIcon} />}\n >\n {i18n('settings_wysiwyg')}\n </Menu.Item>\n <Menu.Item\n qa=\"g-md-settings-mode-markup\"\n active={mode === 'markup'}\n onClick={() => {\n onModeChange('markup');\n onClose();\n }}\n iconStart={<Icon data={LogoMarkdown} />}\n >\n {i18n('settings_markup')}\n <HelpMark\n popoverProps={{\n placement: mdHelpPlacement,\n modal: false,\n }}\n className={bContent('mode-help')}\n >\n <div\n onClick={(e) => {\n // stop clicks propagation\n // because otherwise click in MarkdownHints handled as click on MenuItem\n e.stopPropagation();\n }}\n >\n <MarkdownHints />\n </div>\n </HelpMark>\n </Menu.Item>\n </Menu>\n <div className={bContent('separator')} />\n {!showPreview && (\n <div className={bContent('toolbar')}>\n <Checkbox\n size=\"m\"\n checked={toolbarVisibility}\n onUpdate={onToolbarVisibilityChange}\n >\n {i18n('settings_menubar')}\n </Checkbox>\n <div className={bContent('toolbar-hint')}>{i18n('settings_hint')}</div>\n </div>\n )}\n {splitMode && (\n <div className={bContent('split-mode')}>\n <Checkbox\n size=\"m\"\n disabled={mode !== 'markup'}\n checked={splitModeEnabled}\n onUpdate={onSplitModeChange ?? noop}\n >\n {i18n('settings_split-mode')}\n </Checkbox>\n <div className={bContent('toolbar-hint')}>\n {i18n('settings_split-mode-hint')}\n </div>\n </div>\n )}\n <span className={bContent('version')}>{VERSION}</span>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["bundle/settings/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport {memo, useState} from 'react';\n\nimport {Eye, Gear, LogoMarkdown} from '@gravity-ui/icons';\nimport {\n ActionTooltip,\n Button,\n Checkbox,\n HelpMark,\n Icon,\n Menu,\n Popup,\n type PopupPlacement,\n type QAProps,\n} from '@gravity-ui/uikit';\n\nimport {type ClassNameProps, cn} from '../../classname';\nimport {i18n} from '../../i18n/bundle';\nimport WysiwygModeIcon from '../../icons/WysiwygMode';\nimport {noop} from '../../lodash';\nimport {useBooleanState} from '../../react-utils/hooks';\nimport {ToolbarTooltipDelay} from '../../toolbar';\nimport {VERSION} from '../../version';\nimport type {MarkdownEditorMode, MarkdownEditorSplitMode} from '../types';\n\nimport {MarkdownHints} from './MarkdownHints';\n\nimport './index.scss';\n\nconst placement: PopupPlacement = ['bottom-end', 'top-end'];\n\nconst bSettings = cn('editor-settings');\nconst bContent = cn('settings-content');\n\nexport type EditorSettingsProps = Omit<SettingsContentProps, 'onClose'> & {\n renderPreviewButton?: boolean;\n settingsVisible?: boolean;\n};\n\nexport const EditorSettings = memo<EditorSettingsProps>(function EditorSettings(props) {\n const {className, onShowPreviewChange, showPreview, renderPreviewButton, settingsVisible} =\n props;\n const [chevronElement, setChevronElement] = useState<HTMLButtonElement | null>(null);\n const [popupShown, , hidePopup, togglePopup] = useBooleanState(false);\n\n return (\n <div className={bSettings(null, [className])}>\n {renderPreviewButton && (\n <>\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n title={i18n('preview_hint')}\n hotkey=\"mod+shift+p\"\n >\n <Button\n qa=\"g-md-markup-preview-button\"\n size=\"m\"\n view=\"flat\"\n pin=\"round-round\"\n className={bSettings('preview-button')}\n onClick={() => onShowPreviewChange?.(!showPreview)}\n selected={showPreview}\n >\n <Icon data={Eye} />\n </Button>\n </ActionTooltip>\n {settingsVisible && <div className={bSettings('separator')} />}\n </>\n )}\n {settingsVisible && (\n <>\n <Button\n size=\"m\"\n view=\"flat\"\n pin=\"round-round\"\n onClick={togglePopup}\n ref={setChevronElement}\n qa=\"g-md-settings-button\"\n className={bSettings('dropdown-button')}\n >\n <Icon data={Gear} />\n </Button>\n <Popup\n open={popupShown}\n anchorElement={chevronElement}\n placement={placement}\n onOpenChange={hidePopup}\n >\n <SettingsContent\n {...props}\n qa=\"g-md-settings-content\"\n onClose={hidePopup}\n className={bSettings('content')}\n />\n </Popup>\n </>\n )}\n </div>\n );\n});\n\ntype SettingsContentProps = ClassNameProps &\n QAProps & {\n mode: MarkdownEditorMode;\n onClose: () => void;\n onModeChange: (mode: MarkdownEditorMode) => void;\n onShowPreviewChange: (showPreview: boolean) => void;\n showPreview: boolean;\n toolbarVisibility: boolean;\n onToolbarVisibilityChange: (val: boolean) => void;\n splitMode?: MarkdownEditorSplitMode;\n splitModeEnabled?: boolean;\n onSplitModeChange?: (splitModeEnabled: boolean) => void;\n };\n\nconst mdHelpPlacement: PopupPlacement = ['bottom', 'bottom-end', 'right-start', 'right', 'left'];\n\nconst SettingsContent: React.FC<SettingsContentProps> = function SettingsContent({\n mode,\n onClose,\n onModeChange,\n toolbarVisibility,\n onToolbarVisibilityChange,\n onSplitModeChange,\n splitMode = false,\n splitModeEnabled,\n className,\n showPreview,\n qa,\n}) {\n return (\n <div className={bContent(null, [className])} data-qa={qa}>\n <Menu size=\"l\" className={bContent('mode')}>\n <Menu.Item\n qa=\"g-md-settings-mode-wysiwyg\"\n active={mode === 'wysiwyg'}\n onClick={() => {\n onModeChange('wysiwyg');\n onClose();\n }}\n iconStart={<Icon data={WysiwygModeIcon} />}\n >\n {i18n('settings_wysiwyg')}\n </Menu.Item>\n <Menu.Item\n qa=\"g-md-settings-mode-markup\"\n active={mode === 'markup'}\n onClick={() => {\n onModeChange('markup');\n onClose();\n }}\n iconStart={<Icon data={LogoMarkdown} />}\n >\n {i18n('settings_markup')}\n <HelpMark\n popoverProps={{\n placement: mdHelpPlacement,\n modal: false,\n }}\n className={bContent('mode-help')}\n >\n <div\n onClick={(e) => {\n // stop clicks propagation\n // because otherwise click in MarkdownHints handled as click on MenuItem\n e.stopPropagation();\n }}\n >\n <MarkdownHints />\n </div>\n </HelpMark>\n </Menu.Item>\n </Menu>\n <div className={bContent('separator')} />\n {!showPreview && (\n <div className={bContent('toolbar')}>\n <Checkbox\n size=\"m\"\n checked={toolbarVisibility}\n onUpdate={onToolbarVisibilityChange}\n >\n {i18n('settings_menubar')}\n </Checkbox>\n <div className={bContent('toolbar-hint')}>{i18n('settings_hint')}</div>\n </div>\n )}\n {splitMode && (\n <div className={bContent('split-mode')}>\n <Checkbox\n size=\"m\"\n disabled={mode !== 'markup'}\n checked={splitModeEnabled}\n onUpdate={onSplitModeChange ?? noop}\n >\n {i18n('settings_split-mode')}\n </Checkbox>\n <div className={bContent('toolbar-hint')}>\n {i18n('settings_split-mode-hint')}\n </div>\n </div>\n )}\n <span className={bContent('version')}>{VERSION}</span>\n </div>\n );\n};\n"]}
@@ -6,5 +6,5 @@ export type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
6
6
  onSuccessUpload?: (res: BatchUploadResult) => void;
7
7
  hide: () => void;
8
8
  anchorElement: HTMLElement | null;
9
- } & Pick<ImageFormProps, 'onSubmit'>;
9
+ } & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;
10
10
  export declare const ToolbarImagePopup: React.FC<ToolbarImagePopuProps>;
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
6
6
  import { useBooleanState } from "../../../react-utils/hooks.js";
7
7
  import { batchUploadFiles, } from "../../../utils/upload.js";
8
8
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
9
- export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, }) => {
9
+ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, }) => {
10
10
  const toaster = useToaster();
11
11
  const [loading, showLoading, hideLoading] = useBooleanState(false);
12
12
  const handleCancel = useCallback(() => {
@@ -34,6 +34,6 @@ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, fo
34
34
  focus();
35
35
  onSubmit(data);
36
36
  onClick?.('addImage');
37
- }, loading: loading }) }));
37
+ }, loading: loading, imageTitle: imageTitle }) }));
38
38
  };
39
39
  //# sourceMappingURL=ToolbarImagePopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,GAClB,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,GAClB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n />\n </Popup>\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n />\n </Popup>\n );\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
2
3
  import isNumber from 'is-number';
3
4
  import { IMG_MAX_HEIGHT, getImageDimensions, insertImages } from "../../../markup/index.js";
4
5
  import { ToolbarImagePopup } from "../custom/ToolbarImagePopup.js";
@@ -8,7 +9,13 @@ const noop = (err) => {
8
9
  };
9
10
  export const MToolbarImagePopup = ({ focus, onClick, hide, anchorElement, editor, className, }) => {
10
11
  const { uploadHandler, needToSetDimensionsForUploadedImages } = useMarkupToolbarContext();
11
- return (_jsx(ToolbarImagePopup, { hide: hide, anchorElement: anchorElement, focus: focus, onClick: onClick, className: className, onSubmit: ({ url, name, alt, width, height }) => {
12
+ const selectedString = useMemo(() => {
13
+ const { from, to } = editor.cm.state.selection.main;
14
+ return editor.cm.state.doc.sliceString(from, to);
15
+ // we need to calculate the selection only once
16
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17
+ }, []);
18
+ return (_jsx(ToolbarImagePopup, { imageTitle: selectedString, hide: hide, anchorElement: anchorElement, focus: focus, onClick: onClick, className: className, onSubmit: ({ url, name, alt, width, height }) => {
12
19
  insertImages([
13
20
  {
14
21
  url,
@@ -1 +1 @@
1
- {"version":3,"file":"MToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/markup/MToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAC,cAAc,EAAkB,kBAAkB,EAAE,YAAY,EAAC,iCAAwB;AAEjG,OAAO,EAA6B,iBAAiB,EAAC,uCAAoC;AAG1F,OAAO,EAAC,uBAAuB,EAAC,qBAAkB;AAElD,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EAClE,KAAK,EACL,OAAO,EACP,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,GACZ,EAAE,EAAE;IACD,MAAM,EAAC,aAAa,EAAE,oCAAoC,EAAC,GAAG,uBAAuB,EAAE,CAAC;IAExF,OAAO,CACH,KAAC,iBAAiB,IACd,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAC,EAAE,EAAE;YAC1C,YAAY,CAAC;gBACT;oBACI,GAAG;oBACH,GAAG;oBACH,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC3C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;iBACjD;aACJ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,EACD,YAAY,EAAE,aAAa,EAC3B,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC7B,GAAG,CAAC,OAAO,EACX,OAAO,CAAC,oCAAoC,CAAC,CAChD,CAAC;YACF,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC,GACH,CACL,CAAC;AACN,CAAC,CAAC;AAEF,KAAK,UAAU,YAAY,CACvB,KAAmC,EACnC,cAAuB;IAEvB,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,CAAgB,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,EAAE,EAAE;QACxC,MAAM,OAAO,GAAc,EAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAC,CAAC;QAC5E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvB,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;gBAC9C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAC9D,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import isNumber from 'is-number';\n\nimport {IMG_MAX_HEIGHT, type ImageItem, getImageDimensions, insertImages} from '../../../markup';\nimport type {UploadSuccessItem} from '../../../utils';\nimport {type ToolbarImagePopuProps, ToolbarImagePopup} from '../custom/ToolbarImagePopup';\nimport type {MToolbarBaseProps} from '../types';\n\nimport {useMarkupToolbarContext} from './context';\n\nconst noop = (err: unknown) => {\n console.error(err);\n};\n\nexport type MToolbarImagePopupProps = MToolbarBaseProps &\n Pick<ToolbarImagePopuProps, 'anchorElement'> & {\n hide: () => void;\n };\n\nexport const MToolbarImagePopup: React.FC<MToolbarImagePopupProps> = ({\n focus,\n onClick,\n hide,\n anchorElement,\n editor,\n className,\n}) => {\n const {uploadHandler, needToSetDimensionsForUploadedImages} = useMarkupToolbarContext();\n\n return (\n <ToolbarImagePopup\n hide={hide}\n anchorElement={anchorElement}\n focus={focus}\n onClick={onClick}\n className={className}\n onSubmit={({url, name, alt, width, height}) => {\n insertImages([\n {\n url,\n alt,\n title: name,\n width: isNumber(width) ? String(width) : '',\n height: isNumber(height) ? String(height) : '',\n },\n ])(editor.cm);\n }}\n uploadImages={uploadHandler}\n onSuccessUpload={async (res) => {\n const images = await toImageItems(\n res.success,\n Boolean(needToSetDimensionsForUploadedImages),\n );\n insertImages(images)(editor.cm);\n }}\n />\n );\n};\n\nasync function toImageItems(\n items: readonly UploadSuccessItem[],\n withDimensions: boolean,\n): Promise<ImageItem[]> {\n const imgItems: ImageItem[] = [];\n\n await Promise.all(\n items.map<Promise<void>>(({result, file}) => {\n const imgItem: ImageItem = {url: result.url, alt: result.name ?? file.name};\n imgItems.push(imgItem);\n\n if (withDimensions) {\n return getImageDimensions(file).then(({height}) => {\n imgItem.height = String(Math.min(height, IMG_MAX_HEIGHT));\n }, noop);\n }\n return Promise.resolve();\n }),\n );\n\n return imgItems;\n}\n"]}
1
+ {"version":3,"file":"MToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/markup/MToolbarImagePopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useMemo} from 'react';\n\nimport isNumber from 'is-number';\n\nimport {IMG_MAX_HEIGHT, type ImageItem, getImageDimensions, insertImages} from '../../../markup';\nimport type {UploadSuccessItem} from '../../../utils';\nimport {type ToolbarImagePopuProps, ToolbarImagePopup} from '../custom/ToolbarImagePopup';\nimport type {MToolbarBaseProps} from '../types';\n\nimport {useMarkupToolbarContext} from './context';\n\nconst noop = (err: unknown) => {\n console.error(err);\n};\n\nexport type MToolbarImagePopupProps = MToolbarBaseProps &\n Pick<ToolbarImagePopuProps, 'anchorElement'> & {\n hide: () => void;\n };\n\nexport const MToolbarImagePopup: React.FC<MToolbarImagePopupProps> = ({\n focus,\n onClick,\n hide,\n anchorElement,\n editor,\n className,\n}) => {\n const {uploadHandler, needToSetDimensionsForUploadedImages} = useMarkupToolbarContext();\n\n const selectedString = useMemo(() => {\n const {from, to} = editor.cm.state.selection.main;\n return editor.cm.state.doc.sliceString(from, to);\n // we need to calculate the selection only once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ToolbarImagePopup\n imageTitle={selectedString}\n hide={hide}\n anchorElement={anchorElement}\n focus={focus}\n onClick={onClick}\n className={className}\n onSubmit={({url, name, alt, width, height}) => {\n insertImages([\n {\n url,\n alt,\n title: name,\n width: isNumber(width) ? String(width) : '',\n height: isNumber(height) ? String(height) : '',\n },\n ])(editor.cm);\n }}\n uploadImages={uploadHandler}\n onSuccessUpload={async (res) => {\n const images = await toImageItems(\n res.success,\n Boolean(needToSetDimensionsForUploadedImages),\n );\n insertImages(images)(editor.cm);\n }}\n />\n );\n};\n\nasync function toImageItems(\n items: readonly UploadSuccessItem[],\n withDimensions: boolean,\n): Promise<ImageItem[]> {\n const imgItems: ImageItem[] = [];\n\n await Promise.all(\n items.map<Promise<void>>(({result, file}) => {\n const imgItem: ImageItem = {url: result.url, alt: result.name ?? file.name};\n imgItems.push(imgItem);\n\n if (withDimensions) {\n return getImageDimensions(file).then(({height}) => {\n imgItem.height = String(Math.min(height, IMG_MAX_HEIGHT));\n }, noop);\n }\n return Promise.resolve();\n }),\n );\n\n return imgItems;\n}\n"]}
@@ -19,8 +19,7 @@
19
19
  .yfm-editor .yfm-quote-link {
20
20
  background-color: var(--yfm-quote-link-background);
21
21
  }
22
- .yfm-editor .yfm-quote-link .g-md-img-settings-button,
23
- .yfm-editor .yfm-quote-link .yfm-clipboard-button {
22
+ .yfm-editor .yfm-quote-link .g-md-img-settings-button {
24
23
  position: absolute;
25
24
  z-index: 2;
26
25
  }
@@ -19,7 +19,7 @@ function calcListHeight(itemsCount) {
19
19
  export const CommandMenuComponent = ({ anchorElement, currentIndex, items, onItemClick, onOpenChange, }) => {
20
20
  if (!anchorElement)
21
21
  return null;
22
- return (_jsx(Popup, { open: true, anchorElement: anchorElement, placement: placement, onOpenChange: onOpenChange, children: _jsx("div", { className: b(), children: _jsx(List, { virtualized: true, items: items, sortable: false, filterable: false, emptyPlaceholder: i18n('empty-msg'), itemHeight: ITEM_HEIGHT, itemsHeight: calcListHeight(items.length), renderItem: renderItem, deactivateOnLeave: false, activeItemIndex: currentIndex, onItemClick: (_item, index) => onItemClick(index), className: b('list'), itemClassName: b('list-item') }) }) }));
22
+ return (_jsx(Popup, { open: true, anchorElement: anchorElement, placement: placement, onOpenChange: onOpenChange, qa: "g-md-command-menu", children: _jsx("div", { className: b(), children: _jsx(List, { virtualized: true, items: items, sortable: false, filterable: false, emptyPlaceholder: i18n('empty-msg'), itemHeight: ITEM_HEIGHT, itemsHeight: calcListHeight(items.length), renderItem: renderItem, deactivateOnLeave: false, activeItemIndex: currentIndex, onItemClick: (_item, index) => onItemClick(index), className: b('list'), itemClassName: b('list-item') }) }) }));
23
23
  };
24
24
  function renderItem({ id, title, icon, hotkey, hint, preview }) {
25
25
  const titleText = isFunction(title) ? title() : title;
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/component.tsx"],"names":[],"mappings":"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","sourcesContent":["import {HelpMark, Hotkey, Icon, List, Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../classname';\nimport {i18n} from '../../../i18n/suggest';\nimport {isFunction} from '../../../lodash';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {PreviewTooltip} from '../../../toolbar/PreviewTooltip';\nimport type {AutocompletePopupProps} from '../../../utils/autocomplete-popup';\n\nimport type {CommandAction} from './types';\n\nimport './component.scss';\n\nconst b = cn('command-menu');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nconst ITEM_HEIGHT = 28; // px\nconst VISIBLE_ITEMS_COUNT = 10;\nconst MAX_LIST_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS_COUNT; // px\nfunction calcListHeight(itemsCount: number): number | undefined {\n if (itemsCount <= 0) return undefined;\n return Math.min(MAX_LIST_HEIGHT, itemsCount * ITEM_HEIGHT);\n}\n\nexport type CommandMenuItem = Pick<\n CommandAction,\n 'id' | 'title' | 'icon' | 'hotkey' | 'hint' | 'preview'\n>;\n\nexport type CommandMenuComponentProps = AutocompletePopupProps & {\n currentIndex?: number;\n items: readonly CommandMenuItem[];\n onItemClick(itemIndex: number): void;\n};\n\nexport const CommandMenuComponent: React.FC<CommandMenuComponentProps> = ({\n anchorElement,\n currentIndex,\n items,\n onItemClick,\n onOpenChange,\n}) => {\n if (!anchorElement) return null;\n\n return (\n <Popup open anchorElement={anchorElement} placement={placement} onOpenChange={onOpenChange}>\n <div className={b()}>\n <List<CommandMenuItem>\n virtualized\n items={items as CommandMenuItem[]}\n sortable={false}\n filterable={false}\n emptyPlaceholder={i18n('empty-msg')}\n itemHeight={ITEM_HEIGHT}\n itemsHeight={calcListHeight(items.length)}\n renderItem={renderItem}\n deactivateOnLeave={false}\n activeItemIndex={currentIndex}\n onItemClick={(_item, index) => onItemClick(index)}\n className={b('list')}\n itemClassName={b('list-item')}\n />\n </div>\n </Popup>\n );\n};\n\nfunction renderItem({id, title, icon, hotkey, hint, preview}: CommandMenuItem): React.ReactNode {\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n return (\n <PreviewTooltip preview={preview}>\n <div key={id} className={b('item', {id})}>\n <Icon data={icon.data} size={20} className={b('item-icon')} />\n <div className={b('item-body')}>\n <span className={b('item-title')}>{titleText}</span>\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} className={b('item-hotkey')} />}\n {hintText && <HelpMark className={b('item-hint')}>{hintText}</HelpMark>}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n}\n\nexport function render(props: CommandMenuComponentProps): React.ReactNode {\n return (\n <ErrorLoggerBoundary>\n <CommandMenuComponent {...props} />\n </ErrorLoggerBoundary>\n );\n}\n"]}
1
+ {"version":3,"file":"component.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/component.tsx"],"names":[],"mappings":"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","sourcesContent":["import {HelpMark, Hotkey, Icon, List, Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../classname';\nimport {i18n} from '../../../i18n/suggest';\nimport {isFunction} from '../../../lodash';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {PreviewTooltip} from '../../../toolbar/PreviewTooltip';\nimport type {AutocompletePopupProps} from '../../../utils/autocomplete-popup';\n\nimport type {CommandAction} from './types';\n\nimport './component.scss';\n\nconst b = cn('command-menu');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nconst ITEM_HEIGHT = 28; // px\nconst VISIBLE_ITEMS_COUNT = 10;\nconst MAX_LIST_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS_COUNT; // px\nfunction calcListHeight(itemsCount: number): number | undefined {\n if (itemsCount <= 0) return undefined;\n return Math.min(MAX_LIST_HEIGHT, itemsCount * ITEM_HEIGHT);\n}\n\nexport type CommandMenuItem = Pick<\n CommandAction,\n 'id' | 'title' | 'icon' | 'hotkey' | 'hint' | 'preview'\n>;\n\nexport type CommandMenuComponentProps = AutocompletePopupProps & {\n currentIndex?: number;\n items: readonly CommandMenuItem[];\n onItemClick(itemIndex: number): void;\n};\n\nexport const CommandMenuComponent: React.FC<CommandMenuComponentProps> = ({\n anchorElement,\n currentIndex,\n items,\n onItemClick,\n onOpenChange,\n}) => {\n if (!anchorElement) return null;\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n placement={placement}\n onOpenChange={onOpenChange}\n qa=\"g-md-command-menu\"\n >\n <div className={b()}>\n <List<CommandMenuItem>\n virtualized\n items={items as CommandMenuItem[]}\n sortable={false}\n filterable={false}\n emptyPlaceholder={i18n('empty-msg')}\n itemHeight={ITEM_HEIGHT}\n itemsHeight={calcListHeight(items.length)}\n renderItem={renderItem}\n deactivateOnLeave={false}\n activeItemIndex={currentIndex}\n onItemClick={(_item, index) => onItemClick(index)}\n className={b('list')}\n itemClassName={b('list-item')}\n />\n </div>\n </Popup>\n );\n};\n\nfunction renderItem({id, title, icon, hotkey, hint, preview}: CommandMenuItem): React.ReactNode {\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n return (\n <PreviewTooltip preview={preview}>\n <div key={id} className={b('item', {id})}>\n <Icon data={icon.data} size={20} className={b('item-icon')} />\n <div className={b('item-body')}>\n <span className={b('item-title')}>{titleText}</span>\n <div className={b('item-extra')}>\n {hotkey && <Hotkey value={hotkey} className={b('item-hotkey')} />}\n {hintText && <HelpMark className={b('item-hint')}>{hintText}</HelpMark>}\n </div>\n </div>\n </div>\n </PreviewTooltip>\n );\n}\n\nexport function render(props: CommandMenuComponentProps): React.ReactNode {\n return (\n <ErrorLoggerBoundary>\n <CommandMenuComponent {...props} />\n </ErrorLoggerBoundary>\n );\n}\n"]}
@@ -9,6 +9,6 @@ const b = cn('link-placeholder-widget');
9
9
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
10
10
  export const LinkPlaceholderWidget = ({ onCancel, onSubmit, }) => {
11
11
  const [anchor, setAnchor] = useElementState();
12
- return (_jsxs(_Fragment, { children: [_jsx("span", { ref: setAnchor, className: b(), children: _jsx("a", { href: "#", children: i18n('link') }) }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: _jsx(LinkForm, { autoFocus: true, onSubmit: onSubmit, onCancel: onCancel }) })] }));
12
+ return (_jsxs(_Fragment, { children: [_jsx("span", { ref: setAnchor, className: b(), children: _jsx("a", { href: "#", children: i18n('link') }) }), _jsx(Popup, { qa: "g-md-link-form", open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: _jsx(LinkForm, { autoFocus: true, onSubmit: onSubmit, onCancel: onCancel }) })] }));
13
13
  };
14
14
  //# sourceMappingURL=widget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Link/PlaceholderWidget/widget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,QAAQ,EAAqB,sCAAmC;AACxE,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAC,yCAAgC;AAExD,sBAAuB;AAEvB,MAAM,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC;AACxC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAOzF,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EACxE,QAAQ,EACR,QAAQ,GACX,EAAE,EAAE;IACD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,OAAO,CACH,8BACI,eAAM,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,YAEhC,YAAG,IAAI,EAAC,GAAG,YAAE,IAAI,CAAC,MAAM,CAAC,GAAK,GAC3B,EACP,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YACjF,KAAC,QAAQ,IAAC,SAAS,QAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAC1D,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {LinkForm, type LinkFormProps} from '../../../../forms/LinkForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useElementState} from '../../../../react-utils';\n\nimport './widget.scss';\n\nconst b = cn('link-placeholder-widget');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type LinkPlaceholderWidgetProps = {\n onCancel: () => void;\n onSubmit: LinkFormProps['onSubmit'];\n};\n\nexport const LinkPlaceholderWidget: React.FC<LinkPlaceholderWidgetProps> = ({\n onCancel,\n onSubmit,\n}) => {\n const [anchor, setAnchor] = useElementState();\n return (\n <>\n <span ref={setAnchor} className={b()}>\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n <a href=\"#\">{i18n('link')}</a>\n </span>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n <LinkForm autoFocus onSubmit={onSubmit} onCancel={onCancel} />\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Link/PlaceholderWidget/widget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,QAAQ,EAAqB,sCAAmC;AACxE,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAC,yCAAgC;AAExD,sBAAuB;AAEvB,MAAM,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC;AACxC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAOzF,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EACxE,QAAQ,EACR,QAAQ,GACX,EAAE,EAAE;IACD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,OAAO,CACH,8BACI,eAAM,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,YAEhC,YAAG,IAAI,EAAC,GAAG,YAAE,IAAI,CAAC,MAAM,CAAC,GAAK,GAC3B,EACP,KAAC,KAAK,IACF,EAAE,EAAC,gBAAgB,EACnB,IAAI,QACJ,KAAK,QACL,YAAY,EAAE,QAAQ,EACtB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,SAAS,YAEpB,KAAC,QAAQ,IAAC,SAAS,QAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAC1D,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Popup, type PopupPlacement} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {LinkForm, type LinkFormProps} from '../../../../forms/LinkForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useElementState} from '../../../../react-utils';\n\nimport './widget.scss';\n\nconst b = cn('link-placeholder-widget');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type LinkPlaceholderWidgetProps = {\n onCancel: () => void;\n onSubmit: LinkFormProps['onSubmit'];\n};\n\nexport const LinkPlaceholderWidget: React.FC<LinkPlaceholderWidgetProps> = ({\n onCancel,\n onSubmit,\n}) => {\n const [anchor, setAnchor] = useElementState();\n return (\n <>\n <span ref={setAnchor} className={b()}>\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n <a href=\"#\">{i18n('link')}</a>\n </span>\n <Popup\n qa=\"g-md-link-form\"\n open\n modal\n onOpenChange={onCancel}\n anchorElement={anchor}\n placement={placement}\n >\n <LinkForm autoFocus onSubmit={onSubmit} onCancel={onCancel} />\n </Popup>\n </>\n );\n};\n"]}
@@ -13,5 +13,6 @@ export type ImageFormProps = ClassNameProps & {
13
13
  onCancel(): void;
14
14
  onAttach?: (files: File[]) => void;
15
15
  loading?: boolean;
16
+ imageTitle?: string;
16
17
  };
17
18
  export declare const ImageForm: React.FC<ImageFormProps>;
@@ -16,10 +16,10 @@ var ImageTabId;
16
16
  ImageTabId["Attach"] = "attach";
17
17
  ImageTabId["Link"] = "link";
18
18
  })(ImageTabId || (ImageTabId = {}));
19
- export const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, }) => {
19
+ export const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, }) => {
20
20
  const [tabId, setTabId] = useState(() => isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link);
21
21
  const [url, setUrl] = useState('');
22
- const [name, setName] = useState('');
22
+ const [name, setName] = useState(providedName ?? '');
23
23
  const [alt, setAlt] = useState('');
24
24
  const [width, setWidth] = useState();
25
25
  const [height, setHeight] = useState();
@@ -1 +1 @@
1
- {"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState('');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
1
+ {"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n imageTitle?: string;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n imageTitle: providedName,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState(providedName ?? '');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
@@ -17,6 +17,7 @@ import { ReactRendererFacet } from "./react-facet.js";
17
17
  import { SearchPanelPlugin } from "./search-plugin/plugin.js";
18
18
  import { smartReindent } from "./smart-reindent/index.js";
19
19
  import { yfmLang } from "./yfm.js";
20
+ const linkRegex = /\[[\s\S]*?]\([\s\S]*?\)/g;
20
21
  export function createCodemirror(params) {
21
22
  const { logger, doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, } = params;
22
23
  const extensions = [gravityTheme, placeholder(placeholderContent)];
@@ -118,17 +119,21 @@ export function createCodemirror(params) {
118
119
  }
119
120
  }
120
121
  if (parseInsertedUrlAsImage) {
121
- const { imageUrl, title } = parseInsertedUrlAsImage(event.clipboardData.getData(DataTransferType.Text) ?? '') || {};
122
- if (imageUrl) {
123
- event.preventDefault();
124
- logger.event({ event: 'paste-url-as-image' });
125
- insertImages([
126
- {
127
- url: imageUrl,
128
- alt: title,
129
- title,
130
- },
131
- ])(editor);
122
+ const linkMatches = currentLine.matchAll(linkRegex);
123
+ const isInsertedInsideLink = linkMatches.some((item) => from >= item.index && from <= item.index + (item[0]?.length ?? 0));
124
+ if (!isInsertedInsideLink) {
125
+ const { imageUrl, title } = parseInsertedUrlAsImage(event.clipboardData.getData(DataTransferType.Text) ?? '') || {};
126
+ if (imageUrl) {
127
+ event.preventDefault();
128
+ logger.event({ event: 'paste-url-as-image' });
129
+ insertImages([
130
+ {
131
+ url: imageUrl,
132
+ alt: title,
133
+ title,
134
+ },
135
+ ])(editor);
136
+ }
132
137
  }
133
138
  }
134
139
  // Reindenting pasted plain text
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":"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","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {type Logger2, globalLogger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {LoggerFacet} from './logger-facet';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n logger: Logger2.ILogger;\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n logger,\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n LoggerFacet.of(logger),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: event.clipboardData.types,\n });\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n logger.event({event: 'paste-markup'});\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n pasteLogger.error(e, {event: 'parse-html-to-md'});\n globalLogger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n logger.event({event: 'paste-parsed-html'});\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return;\n }\n }\n\n if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n logger.event({event: 'paste-url-as-image'});\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n }\n },\n }),\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n const {state} = args[0];\n state.facet(LoggerFacet).action({source: 'keymap', action});\n globalLogger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
1
+ {"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":"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","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {type Logger2, globalLogger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {LoggerFacet} from './logger-facet';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nconst linkRegex = /\\[[\\s\\S]*?]\\([\\s\\S]*?\\)/g;\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n logger: Logger2.ILogger;\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n logger,\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n LoggerFacet.of(logger),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: event.clipboardData.types,\n });\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n logger.event({event: 'paste-markup'});\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n pasteLogger.error(e, {event: 'parse-html-to-md'});\n globalLogger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n logger.event({event: 'paste-parsed-html'});\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return;\n }\n }\n\n if (parseInsertedUrlAsImage) {\n const linkMatches = currentLine.matchAll(linkRegex);\n const isInsertedInsideLink = linkMatches.some(\n (item) => from >= item.index && from <= item.index + (item[0]?.length ?? 0),\n );\n if (!isInsertedInsideLink) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n logger.event({event: 'paste-url-as-image'});\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n }\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n }\n },\n }),\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n const {state} = args[0];\n state.facet(LoggerFacet).action({source: 'keymap', action});\n globalLogger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
@@ -7,6 +7,7 @@ import { MToolbarFilePopup } from "../../bundle/toolbar/markup/MToolbarFilePopup
7
7
  import { MToolbarImagePopup } from "../../bundle/toolbar/markup/MToolbarImagePopup.js";
8
8
  import { WToolbarColors } from "../../bundle/toolbar/wysiwyg/WToolbarColors.js";
9
9
  import { WToolbarTextSelect } from "../../bundle/toolbar/wysiwyg/WToolbarTextSelect.js";
10
+ import { showMarkupGpt } from "../../extensions/additional/GPT/index.js";
10
11
  import { gptHotKeys } from "../../extensions/additional/GPT/constants.js";
11
12
  import { headingType, pType } from "../../extensions/specs.js";
12
13
  import { i18n as i18nHint } from "../../i18n/hints/index.js";
@@ -717,7 +718,7 @@ export const gptItemWysiwyg = {
717
718
  isEnable: (e) => e.actions.addGptWidget.isEnable(),
718
719
  };
719
720
  export const gptItemMarkup = {
720
- exec: (e) => insertMermaidDiagram(e.cm),
721
+ exec: (e) => showMarkupGpt(e.cm),
721
722
  isActive: inactive,
722
723
  isEnable: enable,
723
724
  };