@mdxeditor/editor 3.29.3 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="react" />
2
+
1
3
  import { Config } from 'mdast-util-from-markdown/lib';
2
4
  import { ContentEditable } from '@lexical/react/LexicalContentEditable';
3
5
  import { DecoratorNode } from 'lexical';
@@ -1068,6 +1070,20 @@ export declare const disableImageResize$: NodeRef<boolean>;
1068
1070
 
1069
1071
  export declare const disableImageSettingsButton$: NodeRef<boolean>;
1070
1072
 
1073
+ /**
1074
+ * Holds the custom EditImageToolbar component.
1075
+ * @group Image
1076
+ */
1077
+ export declare const editImageToolbarComponent$: NodeRef<FC<EditImageToolbarProps>>;
1078
+
1079
+ declare interface EditImageToolbarProps {
1080
+ nodeKey: string;
1081
+ imageSource: string;
1082
+ initialImagePath: string | null;
1083
+ title: string;
1084
+ alt: string;
1085
+ }
1086
+
1071
1087
  /**
1072
1088
  * The state of the image dialog when it is in editing an existing node.
1073
1089
  * @group Image
@@ -1324,7 +1340,7 @@ export declare const imageAutocompleteSuggestions$: NodeRef<string[]>;
1324
1340
  * Holds the current state of the image dialog.
1325
1341
  * @group Image
1326
1342
  */
1327
- export declare const imageDialogState$: NodeRef<InactiveImageDialogState | NewImageDialogState | EditingImageDialogState>;
1343
+ export declare const imageDialogState$: NodeRef<EditingImageDialogState | InactiveImageDialogState | NewImageDialogState>;
1328
1344
 
1329
1345
  /**
1330
1346
  * A lexical node that represents an image. Use {@link "$createImageNode"} to construct one.
@@ -1378,6 +1394,7 @@ export declare const imagePlugin: (params?: {
1378
1394
  disableImageSettingsButton?: boolean | undefined;
1379
1395
  imagePreviewHandler?: ImagePreviewHandler | undefined;
1380
1396
  ImageDialog?: FC<{}> | (() => JSX.Element) | undefined;
1397
+ EditImageToolbar?: FC<{}> | (() => JSX.Element) | undefined;
1381
1398
  } | undefined) => RealmPlugin;
1382
1399
 
1383
1400
  /**
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import { insertThematicBreak$, thematicBreakPlugin } from "./plugins/thematic-br
10
10
  import { applyListType$, currentListType$, listsPlugin } from "./plugins/lists/index.js";
11
11
  import { insertTable$, tablePlugin } from "./plugins/table/index.js";
12
12
  import { disableAutoLink$, linkPlugin } from "./plugins/link/index.js";
13
- import { INSERT_IMAGE_COMMAND, closeImageDialog$, disableImageResize$, disableImageSettingsButton$, imageAutocompleteSuggestions$, imageDialogState$, imagePlugin, imagePreviewHandler$, imageUploadHandler$, insertImage$, openEditImageDialog$, openNewImageDialog$, saveImage$ } from "./plugins/image/index.js";
13
+ import { INSERT_IMAGE_COMMAND, closeImageDialog$, disableImageResize$, disableImageSettingsButton$, editImageToolbarComponent$, imageAutocompleteSuggestions$, imageDialogState$, imagePlugin, imagePreviewHandler$, imageUploadHandler$, insertImage$, openEditImageDialog$, openNewImageDialog$, saveImage$ } from "./plugins/image/index.js";
14
14
  import { frontmatterDialogOpen$, frontmatterPlugin, hasFrontmatter$, insertFrontmatter$, removeFrontmatter$ } from "./plugins/frontmatter/index.js";
15
15
  import { quotePlugin } from "./plugins/quote/index.js";
16
16
  import { maxLengthPlugin } from "./plugins/maxlength/index.js";
@@ -216,6 +216,7 @@ export {
216
216
  disableAutoLink$,
217
217
  disableImageResize$,
218
218
  disableImageSettingsButton$,
219
+ editImageToolbarComponent$,
219
220
  editorInFocus$,
220
221
  editorRootElementRef$,
221
222
  editorWrappers$,
@@ -0,0 +1,53 @@
1
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
2
+ import { useCellValues, usePublisher } from "@mdxeditor/gurx";
3
+ import classNames from "classnames";
4
+ import { $getNodeByKey } from "lexical";
5
+ import React__default from "react";
6
+ import { disableImageSettingsButton$, openEditImageDialog$ } from "./index.js";
7
+ import styles from "../../styles/ui.module.css.js";
8
+ import { iconComponentFor$, readOnly$, useTranslation } from "../core/index.js";
9
+ function EditImageToolbar({ nodeKey, imageSource, initialImagePath, title, alt }) {
10
+ const [disableImageSettingsButton, iconComponentFor, readOnly] = useCellValues(disableImageSettingsButton$, iconComponentFor$, readOnly$);
11
+ const [editor] = useLexicalComposerContext();
12
+ const openEditImageDialog = usePublisher(openEditImageDialog$);
13
+ const t = useTranslation();
14
+ return /* @__PURE__ */ React__default.createElement("div", { className: styles.editImageToolbar }, /* @__PURE__ */ React__default.createElement(
15
+ "button",
16
+ {
17
+ className: styles.iconButton,
18
+ type: "button",
19
+ title: t("imageEditor.deleteImage", "Delete image"),
20
+ disabled: readOnly,
21
+ onClick: (e) => {
22
+ e.preventDefault();
23
+ editor.update(() => {
24
+ var _a;
25
+ (_a = $getNodeByKey(nodeKey)) == null ? void 0 : _a.remove();
26
+ });
27
+ }
28
+ },
29
+ iconComponentFor("delete_small")
30
+ ), !disableImageSettingsButton && /* @__PURE__ */ React__default.createElement(
31
+ "button",
32
+ {
33
+ type: "button",
34
+ className: classNames(styles.iconButton, styles.editImageButton),
35
+ title: t("imageEditor.editImage", "Edit image"),
36
+ disabled: readOnly,
37
+ onClick: () => {
38
+ openEditImageDialog({
39
+ nodeKey,
40
+ initialValues: {
41
+ src: !initialImagePath ? imageSource : initialImagePath,
42
+ title,
43
+ altText: alt
44
+ }
45
+ });
46
+ }
47
+ },
48
+ iconComponentFor("settings")
49
+ ));
50
+ }
51
+ export {
52
+ EditImageToolbar
53
+ };
@@ -2,14 +2,14 @@ import React__default from "react";
2
2
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
3
3
  import { useLexicalNodeSelection } from "@lexical/react/useLexicalNodeSelection";
4
4
  import { mergeRegister } from "@lexical/utils";
5
+ import { useCellValues } from "@mdxeditor/gurx";
5
6
  import classNames from "classnames";
6
7
  import { $isNodeSelection, $getSelection, $getNodeByKey, $setSelection, SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_LOW, CLICK_COMMAND, DRAGSTART_COMMAND, KEY_DELETE_COMMAND, KEY_BACKSPACE_COMMAND, KEY_ENTER_COMMAND, KEY_ESCAPE_COMMAND } from "lexical";
7
- import { disableImageResize$, disableImageSettingsButton$, imagePreviewHandler$, openEditImageDialog$ } from "./index.js";
8
+ import { disableImageResize$, imagePreviewHandler$, editImageToolbarComponent$ } from "./index.js";
8
9
  import styles from "../../styles/ui.module.css.js";
9
- import { iconComponentFor$, readOnly$, useTranslation } from "../core/index.js";
10
+ import { readOnly$ } from "../core/index.js";
10
11
  import { $isImageNode } from "./ImageNode.js";
11
12
  import ImageResizer from "./ImageResizer.js";
12
- import { useCellValues, usePublisher } from "@mdxeditor/gurx";
13
13
  const imageCache = /* @__PURE__ */ new Set();
14
14
  function useSuspenseImage(src) {
15
15
  if (!imageCache.has(src)) {
@@ -48,14 +48,12 @@ function LazyImage({
48
48
  );
49
49
  }
50
50
  function ImageEditor({ src, title, alt, nodeKey, width, height, rest }) {
51
- const [disableImageResize, disableImageSettingsButton, imagePreviewHandler, iconComponentFor, readOnly] = useCellValues(
51
+ const [disableImageResize, imagePreviewHandler, readOnly, EditImageToolbar] = useCellValues(
52
52
  disableImageResize$,
53
- disableImageSettingsButton$,
54
53
  imagePreviewHandler$,
55
- iconComponentFor$,
56
- readOnly$
54
+ readOnly$,
55
+ editImageToolbarComponent$
57
56
  );
58
- const openEditImageDialog = usePublisher(openEditImageDialog$);
59
57
  const imageRef = React__default.useRef(null);
60
58
  const buttonRef = React__default.useRef(null);
61
59
  const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
@@ -65,7 +63,6 @@ function ImageEditor({ src, title, alt, nodeKey, width, height, rest }) {
65
63
  const [isResizing, setIsResizing] = React__default.useState(false);
66
64
  const [imageSource, setImageSource] = React__default.useState(null);
67
65
  const [initialImagePath, setInitialImagePath] = React__default.useState(null);
68
- const t = useTranslation();
69
66
  const onDelete = React__default.useCallback(
70
67
  (payload) => {
71
68
  if (isSelected && $isNodeSelection($getSelection())) {
@@ -226,42 +223,16 @@ function ImageEditor({ src, title, alt, nodeKey, width, height, rest }) {
226
223
  alt: alt ?? "",
227
224
  imageRef
228
225
  }
229
- )), draggable && isFocused && !disableImageResize && /* @__PURE__ */ React__default.createElement(ImageResizer, { editor, imageRef, onResizeStart, onResizeEnd }), readOnly || /* @__PURE__ */ React__default.createElement("div", { className: styles.editImageToolbar }, /* @__PURE__ */ React__default.createElement(
230
- "button",
226
+ )), draggable && isFocused && !disableImageResize && /* @__PURE__ */ React__default.createElement(ImageResizer, { editor, imageRef, onResizeStart, onResizeEnd }), readOnly || /* @__PURE__ */ React__default.createElement(
227
+ EditImageToolbar,
231
228
  {
232
- className: styles.iconButton,
233
- type: "button",
234
- title: t("imageEditor.deleteImage", "Delete image"),
235
- disabled: readOnly,
236
- onClick: (e) => {
237
- e.preventDefault();
238
- editor.update(() => {
239
- var _a;
240
- (_a = $getNodeByKey(nodeKey)) == null ? void 0 : _a.remove();
241
- });
242
- }
243
- },
244
- iconComponentFor("delete_small")
245
- ), !disableImageSettingsButton && /* @__PURE__ */ React__default.createElement(
246
- "button",
247
- {
248
- type: "button",
249
- className: classNames(styles.iconButton, styles.editImageButton),
250
- title: t("imageEditor.editImage", "Edit image"),
251
- disabled: readOnly,
252
- onClick: () => {
253
- openEditImageDialog({
254
- nodeKey,
255
- initialValues: {
256
- src: !initialImagePath ? imageSource : initialImagePath,
257
- title: title ?? "",
258
- altText: alt ?? ""
259
- }
260
- });
261
- }
262
- },
263
- iconComponentFor("settings")
264
- )))) : null;
229
+ nodeKey,
230
+ imageSource,
231
+ initialImagePath,
232
+ title: title ?? "",
233
+ alt: alt ?? ""
234
+ }
235
+ ))) : null;
265
236
  }
266
237
  export {
267
238
  ImageEditor
@@ -4,6 +4,7 @@ import { $insertNodes, $isRootOrShadowRoot, $createParagraphNode, $getNodeByKey,
4
4
  import { realmPlugin } from "../../RealmWithPlugins.js";
5
5
  import { CAN_USE_DOM } from "../../utils/detectMac.js";
6
6
  import { activeEditor$, createActiveEditorSubscription$, addImportVisitor$, addLexicalNode$, addExportVisitor$, addComposerChild$ } from "../core/index.js";
7
+ import { EditImageToolbar } from "./EditImageToolbar.js";
7
8
  import { ImageDialog } from "./ImageDialog.js";
8
9
  import { $createImageNode, ImageNode, $isImageNode } from "./ImageNode.js";
9
10
  import { LexicalImageVisitor } from "./LexicalImageVisitor.js";
@@ -156,6 +157,7 @@ const closeImageDialog$ = Action((r) => {
156
157
  });
157
158
  const disableImageSettingsButton$ = Cell(false);
158
159
  const saveImage$ = Signal();
160
+ const editImageToolbarComponent$ = Cell(EditImageToolbar);
159
161
  const imagePlugin = realmPlugin({
160
162
  init(realm, params) {
161
163
  realm.pubIn({
@@ -167,7 +169,8 @@ const imagePlugin = realmPlugin({
167
169
  [imageAutocompleteSuggestions$]: (params == null ? void 0 : params.imageAutocompleteSuggestions) ?? [],
168
170
  [disableImageResize$]: Boolean(params == null ? void 0 : params.disableImageResize),
169
171
  [disableImageSettingsButton$]: Boolean(params == null ? void 0 : params.disableImageSettingsButton),
170
- [imagePreviewHandler$]: (params == null ? void 0 : params.imagePreviewHandler) ?? null
172
+ [imagePreviewHandler$]: (params == null ? void 0 : params.imagePreviewHandler) ?? null,
173
+ [editImageToolbarComponent$]: (params == null ? void 0 : params.EditImageToolbar) ?? EditImageToolbar
171
174
  });
172
175
  },
173
176
  update(realm, params) {
@@ -175,7 +178,8 @@ const imagePlugin = realmPlugin({
175
178
  [imageUploadHandler$]: (params == null ? void 0 : params.imageUploadHandler) ?? null,
176
179
  [imageAutocompleteSuggestions$]: (params == null ? void 0 : params.imageAutocompleteSuggestions) ?? [],
177
180
  [disableImageResize$]: Boolean(params == null ? void 0 : params.disableImageResize),
178
- [imagePreviewHandler$]: (params == null ? void 0 : params.imagePreviewHandler) ?? null
181
+ [imagePreviewHandler$]: (params == null ? void 0 : params.imagePreviewHandler) ?? null,
182
+ [editImageToolbarComponent$]: (params == null ? void 0 : params.EditImageToolbar) ?? EditImageToolbar
179
183
  });
180
184
  }
181
185
  });
@@ -317,6 +321,7 @@ export {
317
321
  closeImageDialog$,
318
322
  disableImageResize$,
319
323
  disableImageSettingsButton$,
324
+ editImageToolbarComponent$,
320
325
  imageAutocompleteSuggestions$,
321
326
  imageDialogState$,
322
327
  imagePlugin,
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "*.css"
12
12
  ],
13
13
  "type": "module",
14
- "version": "3.29.3",
14
+ "version": "3.30.0",
15
15
  "description": "React component for rich text markdown editing",
16
16
  "scripts": {
17
17
  "build": "vite build",