@gravity-ui/markdown-editor 15.0.2 → 15.1.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 (32) hide show
  1. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
  2. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
  3. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
  4. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
  5. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js +16 -8
  6. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
  7. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
  8. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js +13 -2
  9. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
  10. package/build/cjs/extensions/yfm/ImgSize/index.d.ts +2 -1
  11. package/build/cjs/extensions/yfm/ImgSize/index.js +2 -0
  12. package/build/cjs/extensions/yfm/ImgSize/index.js.map +1 -1
  13. package/build/cjs/extensions/yfm/YfmCut/index.css +1 -1
  14. package/build/cjs/version.js +1 -1
  15. package/build/cjs/version.js.map +1 -1
  16. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
  17. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
  18. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
  19. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
  20. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js +15 -7
  21. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
  22. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
  23. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js +14 -3
  24. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
  25. package/build/esm/extensions/yfm/ImgSize/index.d.ts +2 -1
  26. package/build/esm/extensions/yfm/ImgSize/index.js +2 -0
  27. package/build/esm/extensions/yfm/ImgSize/index.js.map +1 -1
  28. package/build/esm/extensions/yfm/YfmCut/index.css +1 -1
  29. package/build/esm/version.js +1 -1
  30. package/build/esm/version.js.map +1 -1
  31. package/build/styles.css +1 -1
  32. package/package.json +2 -2
@@ -1,9 +1,11 @@
1
1
  import type { Action, ExtensionAuto } from "../../../../core/index.js";
2
2
  import type { FileUploadHandler } from "../../../../utils/upload.js";
3
+ import type { RenderImageWidgetFormFn } from "./view.js";
3
4
  import type { ImageWidgetDescriptorOpts } from "./widget.js";
4
5
  declare const addImageWidgetAction = "addImageWidget";
5
- export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
6
+ export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
6
7
  imageUploadHandler?: FileUploadHandler;
8
+ renderImageWidgetForm?: RenderImageWidgetFormFn;
7
9
  };
8
10
  export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
9
11
  declare global {
@@ -6,7 +6,9 @@ const addImageWidgetAction = 'addImageWidget';
6
6
  const ImageWidget = (builder, opts) => {
7
7
  builder.addAction(addImageWidgetAction, (deps) => (0, actions_1.addImageWidget)(deps, {
8
8
  uploadImages: opts.imageUploadHandler,
9
+ renderImageForm: opts.renderImageWidgetForm,
9
10
  needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
11
+ enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
10
12
  }));
11
13
  };
12
14
  exports.ImageWidget = ImageWidget;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;AAGzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AASvC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAA,wBAAc,EAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;KAClF,CAAC,CACL,CAAC;AACN,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages'\n> & {\n imageUploadHandler?: FileUploadHandler;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAUvC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAA,wBAAc,EAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC;AATW,QAAA,WAAW,eAStB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
@@ -1,8 +1,20 @@
1
- import { type ImageFormProps } from "../../../../forms/ImageForm.js";
1
+ import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
2
2
  import "./view.css";
3
- export type FilePlaceholderProps = {
3
+ export type RenderImageWidgetFormProps = {
4
+ /** Handler for submitting form */
5
+ onSubmit: (params: ImageFormSubmitParams) => void;
6
+ /** Handler for cancellation */
7
+ onCancel: () => void;
8
+ /** Handler for attach file from device */
9
+ onAttach?: (files: File[]) => void;
10
+ /** Uploading attached file */
11
+ uploading?: boolean;
12
+ };
13
+ export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
14
+ export type ImagePlaceholderProps = {
4
15
  onCancel: () => void;
5
16
  onSubmit: ImageFormProps['onSubmit'];
6
17
  onAttach?: (files: File[]) => Promise<void>;
18
+ renderForm?: RenderImageWidgetFormFn;
7
19
  };
8
- export declare const FilePlaceholder: React.FC<FilePlaceholderProps>;
20
+ export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilePlaceholder = void 0;
3
+ exports.ImagePlaceholder = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const icons_1 = require("@gravity-ui/icons");
@@ -13,23 +13,31 @@ const hooks_1 = require("../../../../react-utils/hooks.js");
13
13
  require("./view.css");
14
14
  const b = (0, classname_1.cn)('image-placeholder');
15
15
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
16
- const FilePlaceholder = ({ onCancel, onSubmit, onAttach }) => {
16
+ const defaultFormRenderer = (props) => {
17
+ return ((0, jsx_runtime_1.jsx)(ImageForm_1.ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
18
+ };
19
+ const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
17
20
  const isMounted = (0, react_use_1.useMountedState)();
18
- const [loading, showLoading, hideLoading] = (0, hooks_1.useBooleanState)(false);
21
+ const [uploading, startUploading, stopUploading] = (0, hooks_1.useBooleanState)(false);
19
22
  const [anchor, setAnchor] = (0, hooks_1.useElementState)();
20
23
  const attachHandler = (0, react_1.useCallback)((files) => {
21
24
  if (!onAttach)
22
25
  return;
23
26
  if (isMounted()) {
24
- showLoading();
27
+ startUploading();
25
28
  onAttach(files).finally(() => {
26
29
  if (isMounted()) {
27
- hideLoading();
30
+ stopUploading();
28
31
  }
29
32
  });
30
33
  }
31
- }, [isMounted, onAttach, showLoading, hideLoading]);
32
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (0, jsx_runtime_1.jsx)(ImageForm_1.ImageForm, { autoFocus: true, loading: loading, onCancel: onCancel, onSubmit: onSubmit, onAttach: onAttach && attachHandler }) })] }));
34
+ }, [isMounted, onAttach, startUploading, stopUploading]);
35
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
36
+ onCancel,
37
+ onSubmit,
38
+ uploading,
39
+ onAttach: onAttach && attachHandler,
40
+ }) })] }));
33
41
  };
34
- exports.FilePlaceholder = FilePlaceholder;
42
+ exports.ImagePlaceholder = ImagePlaceholder;
35
43
  //# sourceMappingURL=view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,8DAA2E;AAC3E,+DAA8C;AAC9C,4DAA+E;AAE/E,sBAAqB;AAErB,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAQlF,MAAM,eAAe,GAAmC,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC9F,MAAM,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,uBAAe,GAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAClD,CAAC;IAEF,OAAO,CACH,6DACI,iCAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,uBAAC,YAAI,IAAC,IAAI,EAAE,eAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAA,cAAI,EAAC,OAAO,CAAC,IACZ,EACN,uBAAC,aAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YACjF,uBAAC,qBAAS,IACN,SAAS,QACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,IAAI,aAAa,GACrC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC;AApCW,QAAA,eAAe,mBAoC1B","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {ImageForm, type ImageFormProps} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type FilePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n};\n\nexport const FilePlaceholder: React.FC<FilePlaceholderProps> = ({onCancel, onSubmit, onAttach}) => {\n const isMounted = useMountedState();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n showLoading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n hideLoading();\n }\n });\n }\n },\n [isMounted, onAttach, showLoading, hideLoading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n <ImageForm\n autoFocus\n loading={loading}\n onCancel={onCancel}\n onSubmit={onSubmit}\n onAttach={onAttach && attachHandler}\n />\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,8DAIqC;AACrC,+DAA8C;AAC9C,4DAA+E;AAE/E,sBAAqB;AAErB,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,uBAAC,qBAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASK,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,uBAAe,GAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,6DACI,iCAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,uBAAC,YAAI,IAAC,IAAI,EAAE,eAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAA,cAAI,EAAC,OAAO,CAAC,IACZ,EACN,uBAAC,aAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC;AAxCW,QAAA,gBAAgB,oBAwC3B","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
@@ -1,9 +1,12 @@
1
1
  import type { Transaction } from 'prosemirror-state';
2
2
  import type { ExtensionDeps } from "../../../../core/index.js";
3
3
  import type { FileUploadHandler } from "../../../../utils/upload.js";
4
+ import { type RenderImageWidgetFormFn } from "./view.js";
4
5
  export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
5
6
  export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
6
7
  export type ImageWidgetDescriptorOpts = {
7
8
  needToSetDimensionsForUploadedImages: boolean;
8
9
  uploadImages?: FileUploadHandler;
10
+ enableNewImageSizeCalculation?: boolean;
11
+ renderImageForm?: RenderImageWidgetFormFn;
9
12
  };
@@ -19,13 +19,17 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
19
19
  deps;
20
20
  uploadImages;
21
21
  needToSetDimensionsForUploadedImages;
22
+ enableNewImageSizeCalculation;
23
+ renderImageForm;
22
24
  widgetHandler = null;
23
25
  constructor(initPos, deps, opts) {
24
26
  super(initPos, 'image_placeholder');
25
27
  this.domElem = document.createElement('span');
26
28
  this.deps = deps;
27
29
  this.uploadImages = opts.uploadImages;
30
+ this.renderImageForm = opts.renderImageForm;
28
31
  this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
32
+ this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
29
33
  }
30
34
  getWidgetHandler(view, getPos) {
31
35
  if (!this.widgetHandler) {
@@ -34,7 +38,9 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
34
38
  getPos,
35
39
  decoId: this.id,
36
40
  uploadImages: this.uploadImages,
41
+ renderImageForm: this.renderImageForm,
37
42
  needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
43
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
38
44
  }, this.deps);
39
45
  }
40
46
  return this.widgetHandler;
@@ -58,14 +64,18 @@ class ImageWidgetHandler {
58
64
  uploadImages;
59
65
  normalizeUrl;
60
66
  needToSetDimensionsForUploadedImages;
67
+ enableNewImageSizeCalculation;
68
+ renderImageForm;
61
69
  cancelled = false;
62
- constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
70
+ constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
63
71
  this.decoId = decoId;
64
72
  this.view = view;
65
73
  this.getPos = getPos;
66
74
  this.uploadImages = uploadImages;
67
75
  this.normalizeUrl = (0, markdown_1.normalizeUrlFactory)(deps);
76
+ this.renderImageForm = renderImageForm;
68
77
  this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
78
+ this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
69
79
  }
70
80
  destruct() {
71
81
  this.cancelled = true;
@@ -73,7 +83,7 @@ class ImageWidgetHandler {
73
83
  renderWidgetView(view, getPos) {
74
84
  this.view = view;
75
85
  this.getPos = getPos;
76
- return ((0, jsx_runtime_1.jsx)(view_1.FilePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach }));
86
+ return ((0, jsx_runtime_1.jsx)(view_1.ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
77
87
  }
78
88
  onCancel = () => {
79
89
  this.cancelled = true;
@@ -102,6 +112,7 @@ class ImageWidgetHandler {
102
112
  const { view } = this;
103
113
  new upload_1.ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
104
114
  needDimensions: this.needToSetDimensionsForUploadedImages,
115
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
105
116
  }).run();
106
117
  view.dispatch((0, exports.removeWidget)(view.state.tr, this.decoId));
107
118
  view.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
1
+ {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { Action, ExtensionAuto } from "../../../core/index.js";
2
2
  import { type ImagePasteOptions } from "./ImagePaste/index.js";
3
+ import { type ImageWidgetOptions } from "./ImageWidget/index.js";
3
4
  import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
4
5
  import { type AddImageAttrs } from "./actions.js";
5
6
  import { addImageAction } from "./const.js";
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
10
11
  * @default false
11
12
  */
12
13
  needToSetDimensionsForUploadedImages?: boolean;
13
- } & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
14
+ } & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
14
15
  export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
15
16
  declare global {
16
17
  namespace WysiwygEditor {
@@ -11,7 +11,9 @@ const ImgSize = (builder, opts) => {
11
11
  builder.use(ImgSizeSpecs_1.ImgSizeSpecs, opts);
12
12
  builder.use(ImageWidget_1.ImageWidget, {
13
13
  imageUploadHandler: opts.imageUploadHandler,
14
+ renderImageWidgetForm: opts.renderImageWidgetForm,
14
15
  needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
16
+ enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
15
17
  });
16
18
  if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
17
19
  builder.use(ImagePaste_1.ImagePaste, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,wDAA0C;AAC1C,0DAAsE;AACtE,0CAAuD;AACvD,sCAAuC;AACvC,wEAAgE;AAczD,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,2BAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;KAC3F,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,sBAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC;AApBW,QAAA,OAAO,WAoBlB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n >;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,wDAAmE;AACnE,0DAAsE;AACtE,0CAAuD;AACvD,sCAAuC;AACvC,wEAAgE;AAezD,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,2BAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,sBAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAtBW,QAAA,OAAO,WAsBlB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
@@ -11,6 +11,6 @@
11
11
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
12
12
  outline: 0;
13
13
  }
14
- .ProseMirror.yfm .yfm-cut.open .yfm-cut-title:before {
14
+ .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
15
15
  transform: translateY(-50%);
16
16
  }
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.0.2' !== 'undefined' ? '15.0.2' : 'unknown';
5
+ exports.VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0.2' !== 'undefined' ? '15.0.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
@@ -1,9 +1,11 @@
1
1
  import type { Action, ExtensionAuto } from "../../../../core/index.js";
2
2
  import type { FileUploadHandler } from "../../../../utils/upload.js";
3
+ import type { RenderImageWidgetFormFn } from "./view.js";
3
4
  import type { ImageWidgetDescriptorOpts } from "./widget.js";
4
5
  declare const addImageWidgetAction = "addImageWidget";
5
- export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
6
+ export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
6
7
  imageUploadHandler?: FileUploadHandler;
8
+ renderImageWidgetForm?: RenderImageWidgetFormFn;
7
9
  };
8
10
  export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
9
11
  declare global {
@@ -3,7 +3,9 @@ const addImageWidgetAction = 'addImageWidget';
3
3
  export const ImageWidget = (builder, opts) => {
4
4
  builder.addAction(addImageWidgetAction, (deps) => addImageWidget(deps, {
5
5
  uploadImages: opts.imageUploadHandler,
6
+ renderImageForm: opts.renderImageWidgetForm,
6
7
  needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
8
+ enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
7
9
  }));
8
10
  };
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAGzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAS9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;KAClF,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages'\n> & {\n imageUploadHandler?: FileUploadHandler;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAU9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
@@ -1,8 +1,20 @@
1
- import { type ImageFormProps } from "../../../../forms/ImageForm.js";
1
+ import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
2
2
  import "./view.css";
3
- export type FilePlaceholderProps = {
3
+ export type RenderImageWidgetFormProps = {
4
+ /** Handler for submitting form */
5
+ onSubmit: (params: ImageFormSubmitParams) => void;
6
+ /** Handler for cancellation */
7
+ onCancel: () => void;
8
+ /** Handler for attach file from device */
9
+ onAttach?: (files: File[]) => void;
10
+ /** Uploading attached file */
11
+ uploading?: boolean;
12
+ };
13
+ export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
14
+ export type ImagePlaceholderProps = {
4
15
  onCancel: () => void;
5
16
  onSubmit: ImageFormProps['onSubmit'];
6
17
  onAttach?: (files: File[]) => Promise<void>;
18
+ renderForm?: RenderImageWidgetFormFn;
7
19
  };
8
- export declare const FilePlaceholder: React.FC<FilePlaceholderProps>;
20
+ export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
@@ -4,28 +4,36 @@ import { Picture as ImageIcon } from '@gravity-ui/icons';
4
4
  import { Icon, Popup } from '@gravity-ui/uikit';
5
5
  import { useMountedState } from 'react-use';
6
6
  import { cn } from "../../../../classname.js";
7
- import { ImageForm } from "../../../../forms/ImageForm.js";
7
+ import { ImageForm, } from "../../../../forms/ImageForm.js";
8
8
  import { i18n } from "../../../../i18n/widgets/index.js";
9
9
  import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
10
10
  import "./view.css";
11
11
  const b = cn('image-placeholder');
12
12
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
13
- export const FilePlaceholder = ({ onCancel, onSubmit, onAttach }) => {
13
+ const defaultFormRenderer = (props) => {
14
+ return (_jsx(ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
15
+ };
16
+ export const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
14
17
  const isMounted = useMountedState();
15
- const [loading, showLoading, hideLoading] = useBooleanState(false);
18
+ const [uploading, startUploading, stopUploading] = useBooleanState(false);
16
19
  const [anchor, setAnchor] = useElementState();
17
20
  const attachHandler = useCallback((files) => {
18
21
  if (!onAttach)
19
22
  return;
20
23
  if (isMounted()) {
21
- showLoading();
24
+ startUploading();
22
25
  onAttach(files).finally(() => {
23
26
  if (isMounted()) {
24
- hideLoading();
27
+ stopUploading();
25
28
  }
26
29
  });
27
30
  }
28
- }, [isMounted, onAttach, showLoading, hideLoading]);
29
- return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: _jsx(ImageForm, { autoFocus: true, loading: loading, onCancel: onCancel, onSubmit: onSubmit, onAttach: onAttach && attachHandler }) })] }));
31
+ }, [isMounted, onAttach, startUploading, stopUploading]);
32
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
33
+ onCancel,
34
+ onSubmit,
35
+ uploading,
36
+ onAttach: onAttach && attachHandler,
37
+ }) })] }));
30
38
  };
31
39
  //# sourceMappingURL=view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,SAAS,EAAsB,uCAAoC;AAC3E,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAQzF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC9F,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAClD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YACjF,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,IAAI,aAAa,GACrC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {ImageForm, type ImageFormProps} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type FilePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n};\n\nexport const FilePlaceholder: React.FC<FilePlaceholderProps> = ({onCancel, onSubmit, onAttach}) => {\n const isMounted = useMountedState();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n showLoading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n hideLoading();\n }\n });\n }\n },\n [isMounted, onAttach, showLoading, hideLoading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n <ImageForm\n autoFocus\n loading={loading}\n onCancel={onCancel}\n onSubmit={onSubmit}\n onAttach={onAttach && attachHandler}\n />\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EACH,SAAS,GAGZ,uCAAoC;AACrC,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
@@ -1,9 +1,12 @@
1
1
  import type { Transaction } from 'prosemirror-state';
2
2
  import type { ExtensionDeps } from "../../../../core/index.js";
3
3
  import type { FileUploadHandler } from "../../../../utils/upload.js";
4
+ import { type RenderImageWidgetFormFn } from "./view.js";
4
5
  export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
5
6
  export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
6
7
  export type ImageWidgetDescriptorOpts = {
7
8
  needToSetDimensionsForUploadedImages: boolean;
8
9
  uploadImages?: FileUploadHandler;
10
+ enableNewImageSizeCalculation?: boolean;
11
+ renderImageForm?: RenderImageWidgetFormFn;
9
12
  };
@@ -4,7 +4,7 @@ import { ReactWidgetDescriptor, removeDecoration } from "../../../behavior/Widge
4
4
  import { imageType, normalizeUrlFactory } from "../../../markdown/index.js";
5
5
  import { ImgSizeAttr } from "../../../specs.js";
6
6
  import { ImagesUploadProcess } from "../ImagePaste/upload.js";
7
- import { FilePlaceholder } from "./view.js";
7
+ import { ImagePlaceholder } from "./view.js";
8
8
  export const addWidget = (tr, deps, opts) => {
9
9
  return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);
10
10
  };
@@ -14,13 +14,17 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
14
14
  deps;
15
15
  uploadImages;
16
16
  needToSetDimensionsForUploadedImages;
17
+ enableNewImageSizeCalculation;
18
+ renderImageForm;
17
19
  widgetHandler = null;
18
20
  constructor(initPos, deps, opts) {
19
21
  super(initPos, 'image_placeholder');
20
22
  this.domElem = document.createElement('span');
21
23
  this.deps = deps;
22
24
  this.uploadImages = opts.uploadImages;
25
+ this.renderImageForm = opts.renderImageForm;
23
26
  this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
27
+ this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
24
28
  }
25
29
  getWidgetHandler(view, getPos) {
26
30
  if (!this.widgetHandler) {
@@ -29,7 +33,9 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
29
33
  getPos,
30
34
  decoId: this.id,
31
35
  uploadImages: this.uploadImages,
36
+ renderImageForm: this.renderImageForm,
32
37
  needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
38
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
33
39
  }, this.deps);
34
40
  }
35
41
  return this.widgetHandler;
@@ -53,14 +59,18 @@ class ImageWidgetHandler {
53
59
  uploadImages;
54
60
  normalizeUrl;
55
61
  needToSetDimensionsForUploadedImages;
62
+ enableNewImageSizeCalculation;
63
+ renderImageForm;
56
64
  cancelled = false;
57
- constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
65
+ constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
58
66
  this.decoId = decoId;
59
67
  this.view = view;
60
68
  this.getPos = getPos;
61
69
  this.uploadImages = uploadImages;
62
70
  this.normalizeUrl = normalizeUrlFactory(deps);
71
+ this.renderImageForm = renderImageForm;
63
72
  this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
73
+ this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
64
74
  }
65
75
  destruct() {
66
76
  this.cancelled = true;
@@ -68,7 +78,7 @@ class ImageWidgetHandler {
68
78
  renderWidgetView(view, getPos) {
69
79
  this.view = view;
70
80
  this.getPos = getPos;
71
- return (_jsx(FilePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach }));
81
+ return (_jsx(ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
72
82
  }
73
83
  onCancel = () => {
74
84
  this.cancelled = true;
@@ -97,6 +107,7 @@ class ImageWidgetHandler {
97
107
  const { view } = this;
98
108
  new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
99
109
  needDimensions: this.needToSetDimensionsForUploadedImages,
110
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
100
111
  }).run();
101
112
  view.dispatch(removeWidget(view.state.tr, this.decoId));
102
113
  view.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
1
+ {"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { Action, ExtensionAuto } from "../../../core/index.js";
2
2
  import { type ImagePasteOptions } from "./ImagePaste/index.js";
3
+ import { type ImageWidgetOptions } from "./ImageWidget/index.js";
3
4
  import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
4
5
  import { type AddImageAttrs } from "./actions.js";
5
6
  import { addImageAction } from "./const.js";
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
10
11
  * @default false
11
12
  */
12
13
  needToSetDimensionsForUploadedImages?: boolean;
13
- } & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
14
+ } & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
14
15
  export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
15
16
  declare global {
16
17
  namespace WysiwygEditor {
@@ -8,7 +8,9 @@ export const ImgSize = (builder, opts) => {
8
8
  builder.use(ImgSizeSpecs, opts);
9
9
  builder.use(ImageWidget, {
10
10
  imageUploadHandler: opts.imageUploadHandler,
11
+ renderImageWidgetForm: opts.renderImageWidgetForm,
11
12
  needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
13
+ enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
12
14
  });
13
15
  if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
14
16
  builder.use(ImagePaste, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAC,YAAY,EAA2B,gCAAuB;AACtE,OAAO,EAAqB,QAAQ,EAAC,qBAAkB;AACvD,OAAO,EAAC,cAAc,EAAC,mBAAgB;AACvC,OAAO,EAAC,qBAAqB,EAAC,2CAAkC;AAchE,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;KAC3F,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n >;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,YAAY,EAA2B,gCAAuB;AACtE,OAAO,EAAqB,QAAQ,EAAC,qBAAkB;AACvD,OAAO,EAAC,cAAc,EAAC,mBAAgB;AACvC,OAAO,EAAC,qBAAqB,EAAC,2CAAkC;AAehE,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
@@ -11,6 +11,6 @@
11
11
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
12
12
  outline: 0;
13
13
  }
14
- .ProseMirror.yfm .yfm-cut.open .yfm-cut-title:before {
14
+ .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
15
15
  transform: translateY(-50%);
16
16
  }
@@ -1,3 +1,3 @@
1
1
  /** During build process, the current version will be injected here */
2
- export const VERSION = typeof '15.0.2' !== 'undefined' ? '15.0.2' : 'unknown';
2
+ export const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0.2' !== 'undefined' ? '15.0.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
package/build/styles.css CHANGED
@@ -1162,7 +1162,7 @@ body :has(.g-md-resizable_resizing) {
1162
1162
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
1163
1163
  outline: 0;
1164
1164
  }
1165
- .ProseMirror.yfm .yfm-cut.open .yfm-cut-title:before {
1165
+ .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
1166
1166
  transform: translateY(-50%);
1167
1167
  }
1168
1168
  .yfm-editor .yfm-file {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/markdown-editor",
3
- "version": "15.0.2",
3
+ "version": "15.1.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -259,7 +259,7 @@
259
259
  "jsdom": "25.0.1",
260
260
  "lowlight": "3.0.0",
261
261
  "markdown-it-testgen": "^0.1.6",
262
- "mermaid": "10.9.3",
262
+ "mermaid": "11.4.1",
263
263
  "npm-run-all": "^4.1.5",
264
264
  "postcss": "^8.4.27",
265
265
  "prettier": "3.1.1",