@webiny/lexical-nodes 5.43.3 → 6.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/FontColorNode.d.ts +4 -4
  2. package/FontColorNode.js +96 -145
  3. package/FontColorNode.js.map +1 -1
  4. package/HeadingNode.d.ts +29 -17
  5. package/HeadingNode.js +181 -152
  6. package/HeadingNode.js.map +1 -1
  7. package/ImageNode.js +143 -188
  8. package/ImageNode.js.map +1 -1
  9. package/LinkNode.d.ts +2 -2
  10. package/LinkNode.js +251 -346
  11. package/LinkNode.js.map +1 -1
  12. package/ListItemNode.d.ts +4 -3
  13. package/ListItemNode.js +276 -354
  14. package/ListItemNode.js.map +1 -1
  15. package/ListNode.d.ts +28 -14
  16. package/ListNode.js +174 -208
  17. package/ListNode.js.map +1 -1
  18. package/ParagraphNode.d.ts +28 -16
  19. package/ParagraphNode.js +141 -179
  20. package/ParagraphNode.js.map +1 -1
  21. package/QuoteNode.d.ts +26 -19
  22. package/QuoteNode.js +104 -186
  23. package/QuoteNode.js.map +1 -1
  24. package/components/ImageNode/ContentEditable.js +7 -14
  25. package/components/ImageNode/ContentEditable.js.map +1 -1
  26. package/components/ImageNode/ImageComponent.js +104 -124
  27. package/components/ImageNode/ImageComponent.js.map +1 -1
  28. package/components/ImageNode/ImageResizer.js +78 -83
  29. package/components/ImageNode/ImageResizer.js.map +1 -1
  30. package/components/ImageNode/Placeholder.d.ts +1 -1
  31. package/components/ImageNode/Placeholder.js +10 -16
  32. package/components/ImageNode/Placeholder.js.map +1 -1
  33. package/components/ImageNode/SharedHistoryContext.d.ts +2 -2
  34. package/components/ImageNode/SharedHistoryContext.js +12 -20
  35. package/components/ImageNode/SharedHistoryContext.js.map +1 -1
  36. package/generateInitialLexicalValue.d.ts +4 -0
  37. package/generateInitialLexicalValue.js +27 -0
  38. package/generateInitialLexicalValue.js.map +1 -0
  39. package/index.d.ts +4 -8
  40. package/index.js +44 -230
  41. package/index.js.map +1 -1
  42. package/package.json +4 -4
  43. package/prepareLexicalState.d.ts +2 -0
  44. package/prepareLexicalState.js +53 -0
  45. package/prepareLexicalState.js.map +1 -0
  46. package/types.d.ts +4 -5
  47. package/types.js +1 -5
  48. package/types.js.map +1 -1
  49. package/utils/clearNodeFormating.d.ts +1 -1
  50. package/utils/clearNodeFormating.js +12 -18
  51. package/utils/clearNodeFormating.js.map +1 -1
  52. package/utils/formatList.d.ts +3 -3
  53. package/utils/formatList.js +171 -208
  54. package/utils/formatList.js.map +1 -1
  55. package/utils/formatToHeading.d.ts +2 -2
  56. package/utils/formatToHeading.js +8 -15
  57. package/utils/formatToHeading.js.map +1 -1
  58. package/utils/formatToParagraph.d.ts +1 -1
  59. package/utils/formatToParagraph.js +8 -16
  60. package/utils/formatToParagraph.js.map +1 -1
  61. package/utils/formatToQuote.d.ts +1 -1
  62. package/utils/formatToQuote.js +8 -15
  63. package/utils/formatToQuote.js.map +1 -1
  64. package/utils/getStyleId.d.ts +11 -0
  65. package/utils/getStyleId.js +14 -0
  66. package/utils/getStyleId.js.map +1 -0
  67. package/utils/listNode.d.ts +2 -2
  68. package/utils/listNode.js +37 -50
  69. package/utils/listNode.js.map +1 -1
  70. package/utils/toggleLink.d.ts +1 -1
  71. package/utils/toggleLink.js +41 -45
  72. package/utils/toggleLink.js.map +1 -1
  73. package/TypographyNode.d.ts +0 -39
  74. package/TypographyNode.js +0 -146
  75. package/TypographyNode.js.map +0 -1
@@ -1,29 +1,3 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = ImageComponent;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var React = _react;
12
- require("./ImageComponent.css");
13
- var _LexicalAutoFocusPlugin = require("@lexical/react/LexicalAutoFocusPlugin");
14
- var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
15
- var _LexicalErrorBoundary = require("@lexical/react/LexicalErrorBoundary");
16
- var _LexicalHistoryPlugin = require("@lexical/react/LexicalHistoryPlugin");
17
- var _LexicalNestedComposer = require("@lexical/react/LexicalNestedComposer");
18
- var _LexicalRichTextPlugin = require("@lexical/react/LexicalRichTextPlugin");
19
- var _useLexicalNodeSelection = require("@lexical/react/useLexicalNodeSelection");
20
- var _utils = require("@lexical/utils");
21
- var _lexical = require("lexical");
22
- var _Placeholder = require("./Placeholder");
23
- var _ImageResizer = require("./ImageResizer");
24
- var _SharedHistoryContext = require("./SharedHistoryContext");
25
- var _ImageNode = require("../../ImageNode");
26
- var _ContentEditable = require("./ContentEditable");
27
1
  /**
28
2
  * Copyright (c) Meta Platforms, Inc. and affiliates.
29
3
  *
@@ -31,29 +5,46 @@ var _ContentEditable = require("./ContentEditable");
31
5
  * LICENSE file in the root directory of this source tree.
32
6
  *
33
7
  */
34
-
35
- var imageCache = new Set();
8
+ import * as React from "react";
9
+ import { Suspense, useCallback, useEffect, useRef, useState } from "react";
10
+ import "./ImageComponent.css";
11
+ import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin";
12
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
13
+ import { LexicalErrorBoundary } from "@lexical/react/LexicalErrorBoundary";
14
+ import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin";
15
+ import { LexicalNestedComposer } from "@lexical/react/LexicalNestedComposer";
16
+ import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
17
+ import { useLexicalNodeSelection } from "@lexical/react/useLexicalNodeSelection";
18
+ import { mergeRegister } from "@lexical/utils";
19
+ import { $getNodeByKey, $getSelection, $isNodeSelection, $setSelection, CLICK_COMMAND, COMMAND_PRIORITY_LOW, DRAGSTART_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_ENTER_COMMAND, KEY_ESCAPE_COMMAND, SELECTION_CHANGE_COMMAND } from "lexical";
20
+ import { Placeholder } from "./Placeholder";
21
+ import { ImageResizer } from "./ImageResizer";
22
+ import { useSharedHistoryContext } from "./SharedHistoryContext";
23
+ import { $isImageNode } from "../../ImageNode";
24
+ import { LexicalContentEditable } from "./ContentEditable";
25
+ const imageCache = new Set();
36
26
  function useSuspenseImage(src) {
37
27
  if (!imageCache.has(src)) {
38
- throw new Promise(function (resolve) {
39
- var img = new Image();
28
+ throw new Promise(resolve => {
29
+ const img = new Image();
40
30
  img.src = src;
41
- img.onload = function () {
31
+ img.onload = () => {
42
32
  imageCache.add(src);
43
33
  resolve(null);
44
34
  };
45
35
  });
46
36
  }
47
37
  }
48
- function LazyImage(_ref) {
49
- var id = _ref.id,
50
- altText = _ref.altText,
51
- className = _ref.className,
52
- imageRef = _ref.imageRef,
53
- src = _ref.src,
54
- width = _ref.width,
55
- height = _ref.height,
56
- maxWidth = _ref.maxWidth;
38
+ function LazyImage({
39
+ id,
40
+ altText,
41
+ className,
42
+ imageRef,
43
+ src,
44
+ width,
45
+ height,
46
+ maxWidth
47
+ }) {
57
48
  useSuspenseImage(src);
58
49
  return /*#__PURE__*/React.createElement("img", {
59
50
  id: id,
@@ -62,63 +53,52 @@ function LazyImage(_ref) {
62
53
  alt: altText,
63
54
  ref: imageRef,
64
55
  style: {
65
- height: height,
66
- maxWidth: maxWidth,
67
- width: width
56
+ height,
57
+ maxWidth,
58
+ width
68
59
  },
69
60
  draggable: "false"
70
61
  });
71
62
  }
72
- function ImageComponent(_ref2) {
73
- var id = _ref2.id,
74
- src = _ref2.src,
75
- altText = _ref2.altText,
76
- nodeKey = _ref2.nodeKey,
77
- width = _ref2.width,
78
- height = _ref2.height,
79
- maxWidth = _ref2.maxWidth,
80
- resizable = _ref2.resizable,
81
- showCaption = _ref2.showCaption,
82
- caption = _ref2.caption,
83
- captionsEnabled = _ref2.captionsEnabled;
84
- var imageRef = (0, _react.useRef)(null);
85
- var buttonRef = (0, _react.useRef)(null);
86
- var _useLexicalNodeSelect = (0, _useLexicalNodeSelection.useLexicalNodeSelection)(nodeKey),
87
- _useLexicalNodeSelect2 = (0, _slicedToArray2.default)(_useLexicalNodeSelect, 3),
88
- isSelected = _useLexicalNodeSelect2[0],
89
- setSelected = _useLexicalNodeSelect2[1],
90
- clearSelection = _useLexicalNodeSelect2[2];
91
- var _useState = (0, _react.useState)(false),
92
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
93
- isResizing = _useState2[0],
94
- setIsResizing = _useState2[1];
95
- var _useLexicalComposerCo = (0, _LexicalComposerContext.useLexicalComposerContext)(),
96
- _useLexicalComposerCo2 = (0, _slicedToArray2.default)(_useLexicalComposerCo, 1),
97
- editor = _useLexicalComposerCo2[0];
98
- var _useState3 = (0, _react.useState)(null),
99
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
100
- selection = _useState4[0],
101
- setSelection = _useState4[1];
102
- var activeEditorRef = (0, _react.useRef)(null);
103
- var onDelete = (0, _react.useCallback)(function (payload) {
104
- if (isSelected && (0, _lexical.$isNodeSelection)((0, _lexical.$getSelection)())) {
105
- var event = payload;
63
+ export default function ImageComponent({
64
+ id,
65
+ src,
66
+ altText,
67
+ nodeKey,
68
+ width,
69
+ height,
70
+ maxWidth,
71
+ resizable,
72
+ showCaption,
73
+ caption,
74
+ captionsEnabled
75
+ }) {
76
+ const imageRef = useRef(null);
77
+ const buttonRef = useRef(null);
78
+ const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
79
+ const [isResizing, setIsResizing] = useState(false);
80
+ const [editor] = useLexicalComposerContext();
81
+ const [selection, setSelection] = useState(null);
82
+ const activeEditorRef = useRef(null);
83
+ const onDelete = useCallback(payload => {
84
+ if (isSelected && $isNodeSelection($getSelection())) {
85
+ const event = payload;
106
86
  event.preventDefault();
107
- var node = (0, _lexical.$getNodeByKey)(nodeKey);
108
- if ((0, _ImageNode.$isImageNode)(node)) {
87
+ const node = $getNodeByKey(nodeKey);
88
+ if ($isImageNode(node)) {
109
89
  node.remove();
110
90
  }
111
91
  setSelected(false);
112
92
  }
113
93
  return false;
114
94
  }, [isSelected, nodeKey, setSelected]);
115
- var onEnter = (0, _react.useCallback)(function (event) {
116
- var latestSelection = (0, _lexical.$getSelection)();
117
- var buttonElem = buttonRef.current;
118
- if (isSelected && (0, _lexical.$isNodeSelection)(latestSelection) && latestSelection.getNodes().length === 1) {
95
+ const onEnter = useCallback(event => {
96
+ const latestSelection = $getSelection();
97
+ const buttonElem = buttonRef.current;
98
+ if (isSelected && $isNodeSelection(latestSelection) && latestSelection.getNodes().length === 1) {
119
99
  if (showCaption) {
120
100
  // Move focus into nested editor
121
- (0, _lexical.$setSelection)(null);
101
+ $setSelection(null);
122
102
  event.preventDefault();
123
103
  caption.focus();
124
104
  return true;
@@ -130,12 +110,12 @@ function ImageComponent(_ref2) {
130
110
  }
131
111
  return false;
132
112
  }, [caption, isSelected, showCaption]);
133
- var onEscape = (0, _react.useCallback)(function (event) {
113
+ const onEscape = useCallback(event => {
134
114
  if (activeEditorRef.current === caption || buttonRef.current === event.target) {
135
- (0, _lexical.$setSelection)(null);
136
- editor.update(function () {
115
+ $setSelection(null);
116
+ editor.update(() => {
137
117
  setSelected(true);
138
- var parentRootElement = editor.getRootElement();
118
+ const parentRootElement = editor.getRootElement();
139
119
  if (parentRootElement !== null) {
140
120
  parentRootElement.focus();
141
121
  }
@@ -144,20 +124,19 @@ function ImageComponent(_ref2) {
144
124
  }
145
125
  return false;
146
126
  }, [caption, editor, setSelected]);
147
- (0, _react.useEffect)(function () {
148
- var isMounted = true;
149
- var unregister = (0, _utils.mergeRegister)(editor.registerUpdateListener(function (_ref3) {
150
- var editorState = _ref3.editorState;
127
+ useEffect(() => {
128
+ let isMounted = true;
129
+ const unregister = mergeRegister(editor.registerUpdateListener(({
130
+ editorState
131
+ }) => {
151
132
  if (isMounted) {
152
- setSelection(editorState.read(function () {
153
- return (0, _lexical.$getSelection)();
154
- }));
133
+ setSelection(editorState.read(() => $getSelection()));
155
134
  }
156
- }), editor.registerCommand(_lexical.SELECTION_CHANGE_COMMAND, function (_, activeEditor) {
135
+ }), editor.registerCommand(SELECTION_CHANGE_COMMAND, (_, activeEditor) => {
157
136
  activeEditorRef.current = activeEditor;
158
137
  return false;
159
- }, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.CLICK_COMMAND, function (payload) {
160
- var event = payload;
138
+ }, COMMAND_PRIORITY_LOW), editor.registerCommand(CLICK_COMMAND, payload => {
139
+ const event = payload;
161
140
  if (isResizing) {
162
141
  return true;
163
142
  }
@@ -171,7 +150,7 @@ function ImageComponent(_ref2) {
171
150
  return true;
172
151
  }
173
152
  return false;
174
- }, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.DRAGSTART_COMMAND, function (event) {
153
+ }, COMMAND_PRIORITY_LOW), editor.registerCommand(DRAGSTART_COMMAND, event => {
175
154
  if (event.target === imageRef.current) {
176
155
  // TODO This is just a temporary workaround for FF to behave like other browsers.
177
156
  // Ideally, this handles drag & drop too (and all browsers).
@@ -179,46 +158,47 @@ function ImageComponent(_ref2) {
179
158
  return true;
180
159
  }
181
160
  return false;
182
- }, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.KEY_DELETE_COMMAND, onDelete, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.KEY_BACKSPACE_COMMAND, onDelete, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.KEY_ENTER_COMMAND, onEnter, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.KEY_ESCAPE_COMMAND, onEscape, _lexical.COMMAND_PRIORITY_LOW));
183
- return function () {
161
+ }, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_ESCAPE_COMMAND, onEscape, COMMAND_PRIORITY_LOW));
162
+ return () => {
184
163
  isMounted = false;
185
164
  unregister();
186
165
  };
187
166
  }, [clearSelection, editor, isResizing, isSelected, nodeKey, onDelete, onEnter, onEscape, setSelected]);
188
- var setShowCaption = function setShowCaption() {
189
- editor.update(function () {
190
- var node = (0, _lexical.$getNodeByKey)(nodeKey);
191
- if ((0, _ImageNode.$isImageNode)(node)) {
167
+ const setShowCaption = () => {
168
+ editor.update(() => {
169
+ const node = $getNodeByKey(nodeKey);
170
+ if ($isImageNode(node)) {
192
171
  node.setShowCaption(true);
193
172
  }
194
173
  });
195
174
  };
196
- var onResizeEnd = function onResizeEnd(nextWidth, nextHeight) {
175
+ const onResizeEnd = (nextWidth, nextHeight) => {
197
176
  // Delay hiding the resize bars for click case
198
- setTimeout(function () {
177
+ setTimeout(() => {
199
178
  setIsResizing(false);
200
179
  }, 200);
201
- editor.update(function () {
202
- var node = (0, _lexical.$getNodeByKey)(nodeKey);
203
- if ((0, _ImageNode.$isImageNode)(node)) {
180
+ editor.update(() => {
181
+ const node = $getNodeByKey(nodeKey);
182
+ if ($isImageNode(node)) {
204
183
  node.setWidthAndHeight(nextWidth, nextHeight);
205
184
  }
206
185
  });
207
186
  };
208
- var onResizeStart = function onResizeStart() {
187
+ const onResizeStart = () => {
209
188
  setIsResizing(true);
210
189
  };
211
- var _useSharedHistoryCont = (0, _SharedHistoryContext.useSharedHistoryContext)(),
212
- historyState = _useSharedHistoryCont.historyState;
213
- var draggable = isSelected && (0, _lexical.$isNodeSelection)(selection) && !isResizing;
214
- var isFocused = isSelected || isResizing;
215
- return /*#__PURE__*/React.createElement(_react.Suspense, {
190
+ const {
191
+ historyState
192
+ } = useSharedHistoryContext();
193
+ const draggable = isSelected && $isNodeSelection(selection) && !isResizing;
194
+ const isFocused = isSelected || isResizing;
195
+ return /*#__PURE__*/React.createElement(Suspense, {
216
196
  fallback: null
217
197
  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
218
198
  draggable: draggable
219
199
  }, /*#__PURE__*/React.createElement(LazyImage, {
220
200
  id: id,
221
- className: isFocused ? "focused ".concat((0, _lexical.$isNodeSelection)(selection) ? "draggable" : "") : null,
201
+ className: isFocused ? `focused ${$isNodeSelection(selection) ? "draggable" : ""}` : null,
222
202
  src: src,
223
203
  altText: altText,
224
204
  imageRef: imageRef,
@@ -227,19 +207,19 @@ function ImageComponent(_ref2) {
227
207
  maxWidth: maxWidth
228
208
  })), showCaption && /*#__PURE__*/React.createElement("div", {
229
209
  className: "image-caption-container"
230
- }, /*#__PURE__*/React.createElement(_LexicalNestedComposer.LexicalNestedComposer, {
210
+ }, /*#__PURE__*/React.createElement(LexicalNestedComposer, {
231
211
  initialEditor: caption
232
- }, /*#__PURE__*/React.createElement(_LexicalAutoFocusPlugin.AutoFocusPlugin, null), /*#__PURE__*/React.createElement(_LexicalHistoryPlugin.HistoryPlugin, {
212
+ }, /*#__PURE__*/React.createElement(AutoFocusPlugin, null), /*#__PURE__*/React.createElement(HistoryPlugin, {
233
213
  externalHistoryState: historyState
234
- }), /*#__PURE__*/React.createElement(_LexicalRichTextPlugin.RichTextPlugin, {
235
- contentEditable: /*#__PURE__*/React.createElement(_ContentEditable.LexicalContentEditable, {
214
+ }), /*#__PURE__*/React.createElement(RichTextPlugin, {
215
+ contentEditable: /*#__PURE__*/React.createElement(LexicalContentEditable, {
236
216
  className: "ImageNode__contentEditable"
237
217
  }),
238
- placeholder: /*#__PURE__*/React.createElement(_Placeholder.Placeholder, {
218
+ placeholder: /*#__PURE__*/React.createElement(Placeholder, {
239
219
  className: "ImageNode__placeholder"
240
220
  }, "Enter a caption..."),
241
- ErrorBoundary: _LexicalErrorBoundary.LexicalErrorBoundary
242
- }))), resizable && (0, _lexical.$isNodeSelection)(selection) && isFocused && /*#__PURE__*/React.createElement(_ImageResizer.ImageResizer, {
221
+ ErrorBoundary: LexicalErrorBoundary
222
+ }))), resizable && $isNodeSelection(selection) && isFocused && /*#__PURE__*/React.createElement(ImageResizer, {
243
223
  showCaption: showCaption,
244
224
  setShowCaption: setShowCaption,
245
225
  editor: editor,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","React","_LexicalAutoFocusPlugin","_LexicalComposerContext","_LexicalErrorBoundary","_LexicalHistoryPlugin","_LexicalNestedComposer","_LexicalRichTextPlugin","_useLexicalNodeSelection","_utils","_lexical","_Placeholder","_ImageResizer","_SharedHistoryContext","_ImageNode","_ContentEditable","imageCache","Set","useSuspenseImage","src","has","Promise","resolve","img","Image","onload","add","LazyImage","_ref","id","altText","className","imageRef","width","height","maxWidth","createElement","undefined","alt","ref","style","draggable","ImageComponent","_ref2","nodeKey","resizable","showCaption","caption","captionsEnabled","useRef","buttonRef","_useLexicalNodeSelect","useLexicalNodeSelection","_useLexicalNodeSelect2","_slicedToArray2","default","isSelected","setSelected","clearSelection","_useState","useState","_useState2","isResizing","setIsResizing","_useLexicalComposerCo","useLexicalComposerContext","_useLexicalComposerCo2","editor","_useState3","_useState4","selection","setSelection","activeEditorRef","onDelete","useCallback","payload","$isNodeSelection","$getSelection","event","preventDefault","node","$getNodeByKey","$isImageNode","remove","onEnter","latestSelection","buttonElem","current","getNodes","length","$setSelection","focus","document","activeElement","onEscape","target","update","parentRootElement","getRootElement","useEffect","isMounted","unregister","mergeRegister","registerUpdateListener","_ref3","editorState","read","registerCommand","SELECTION_CHANGE_COMMAND","_","activeEditor","COMMAND_PRIORITY_LOW","CLICK_COMMAND","shiftKey","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","setShowCaption","onResizeEnd","nextWidth","nextHeight","setTimeout","setWidthAndHeight","onResizeStart","_useSharedHistoryCont","useSharedHistoryContext","historyState","isFocused","Suspense","fallback","Fragment","concat","LexicalNestedComposer","initialEditor","AutoFocusPlugin","HistoryPlugin","externalHistoryState","RichTextPlugin","contentEditable","LexicalContentEditable","placeholder","Placeholder","ErrorBoundary","LexicalErrorBoundary","ImageResizer"],"sources":["ImageComponent.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport * as React from \"react\";\nimport { Suspense, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { LexicalEditor, NodeKey, BaseSelection } from \"lexical\";\n\nimport \"./ImageComponent.css\";\n\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { LexicalNestedComposer } from \"@lexical/react/LexicalNestedComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n $setSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n DRAGSTART_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\nimport { Placeholder } from \"./Placeholder\";\nimport { ImageResizer } from \"./ImageResizer\";\nimport { useSharedHistoryContext } from \"./SharedHistoryContext\";\nimport { $isImageNode } from \"~/ImageNode\";\nimport { LexicalContentEditable } from \"./ContentEditable\";\n\nconst imageCache = new Set();\n\nfunction useSuspenseImage(src: string) {\n if (!imageCache.has(src)) {\n throw new Promise(resolve => {\n const img = new Image();\n img.src = src;\n img.onload = () => {\n imageCache.add(src);\n resolve(null);\n };\n });\n }\n}\n\nfunction LazyImage({\n id,\n altText,\n className,\n imageRef,\n src,\n width,\n height,\n maxWidth\n}: {\n id: string;\n altText: string;\n className: string | null;\n height: \"inherit\" | number;\n imageRef: { current: null | HTMLImageElement };\n maxWidth: number;\n src: string;\n width: \"inherit\" | number;\n}): JSX.Element {\n useSuspenseImage(src);\n return (\n <img\n id={id}\n className={className || undefined}\n src={src}\n alt={altText}\n ref={imageRef}\n style={{\n height,\n maxWidth,\n width\n }}\n draggable=\"false\"\n />\n );\n}\n\ninterface ImageComponentProps {\n id: string;\n altText: string;\n caption: LexicalEditor;\n height: \"inherit\" | number;\n maxWidth: number;\n nodeKey: NodeKey;\n resizable: boolean;\n showCaption: boolean;\n src: string;\n width: \"inherit\" | number;\n captionsEnabled: boolean;\n}\n\nexport default function ImageComponent({\n id,\n src,\n altText,\n nodeKey,\n width,\n height,\n maxWidth,\n resizable,\n showCaption,\n caption,\n captionsEnabled\n}: ImageComponentProps): JSX.Element {\n const imageRef = useRef<null | HTMLImageElement>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\n const [isResizing, setIsResizing] = useState<boolean>(false);\n const [editor] = useLexicalComposerContext();\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const activeEditorRef = useRef<LexicalEditor | null>(null);\n\n const onDelete = useCallback(\n (payload: KeyboardEvent) => {\n if (isSelected && $isNodeSelection($getSelection())) {\n const event: KeyboardEvent = payload;\n event.preventDefault();\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.remove();\n }\n setSelected(false);\n }\n return false;\n },\n [isSelected, nodeKey, setSelected]\n );\n\n const onEnter = useCallback(\n (event: KeyboardEvent) => {\n const latestSelection = $getSelection();\n const buttonElem = buttonRef.current;\n if (\n isSelected &&\n $isNodeSelection(latestSelection) &&\n latestSelection.getNodes().length === 1\n ) {\n if (showCaption) {\n // Move focus into nested editor\n $setSelection(null);\n event.preventDefault();\n caption.focus();\n return true;\n } else if (buttonElem !== null && buttonElem !== document.activeElement) {\n event.preventDefault();\n buttonElem.focus();\n return true;\n }\n }\n return false;\n },\n [caption, isSelected, showCaption]\n );\n\n const onEscape = useCallback(\n (event: KeyboardEvent) => {\n if (activeEditorRef.current === caption || buttonRef.current === event.target) {\n $setSelection(null);\n editor.update(() => {\n setSelected(true);\n const parentRootElement = editor.getRootElement();\n if (parentRootElement !== null) {\n parentRootElement.focus();\n }\n });\n return true;\n }\n return false;\n },\n [caption, editor, setSelected]\n );\n\n useEffect(() => {\n let isMounted = true;\n const unregister = mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n if (isMounted) {\n setSelection(editorState.read(() => $getSelection()));\n }\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_, activeEditor) => {\n activeEditorRef.current = activeEditor;\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n payload => {\n const event = payload;\n if (isResizing) {\n return true;\n }\n if (event.target === imageRef.current) {\n if (event.shiftKey) {\n setSelected(!isSelected);\n } else {\n clearSelection();\n setSelected(true);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n DRAGSTART_COMMAND,\n event => {\n if (event.target === imageRef.current) {\n // TODO This is just a temporary workaround for FF to behave like other browsers.\n // Ideally, this handles drag & drop too (and all browsers).\n event.preventDefault();\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_ESCAPE_COMMAND, onEscape, COMMAND_PRIORITY_LOW)\n );\n return () => {\n isMounted = false;\n unregister();\n };\n }, [\n clearSelection,\n editor,\n isResizing,\n isSelected,\n nodeKey,\n onDelete,\n onEnter,\n onEscape,\n setSelected\n ]);\n\n const setShowCaption = () => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setShowCaption(true);\n }\n });\n };\n\n const onResizeEnd = (nextWidth: \"inherit\" | number, nextHeight: \"inherit\" | number) => {\n // Delay hiding the resize bars for click case\n setTimeout(() => {\n setIsResizing(false);\n }, 200);\n\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setWidthAndHeight(nextWidth, nextHeight);\n }\n });\n };\n\n const onResizeStart = () => {\n setIsResizing(true);\n };\n\n const { historyState } = useSharedHistoryContext();\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\n const isFocused = isSelected || isResizing;\n return (\n <Suspense fallback={null}>\n <>\n <div draggable={draggable}>\n <LazyImage\n id={id}\n className={\n isFocused\n ? `focused ${$isNodeSelection(selection) ? \"draggable\" : \"\"}`\n : null\n }\n src={src}\n altText={altText}\n imageRef={imageRef}\n width={width}\n height={height}\n maxWidth={maxWidth}\n />\n </div>\n {showCaption && (\n <div className=\"image-caption-container\">\n <LexicalNestedComposer initialEditor={caption}>\n <AutoFocusPlugin />\n <HistoryPlugin externalHistoryState={historyState} />\n <RichTextPlugin\n contentEditable={\n <LexicalContentEditable className=\"ImageNode__contentEditable\" />\n }\n placeholder={\n <Placeholder className=\"ImageNode__placeholder\">\n Enter a caption...\n </Placeholder>\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </LexicalNestedComposer>\n </div>\n )}\n {resizable && $isNodeSelection(selection) && isFocused && (\n <ImageResizer\n showCaption={showCaption}\n setShowCaption={setShowCaption}\n editor={editor}\n buttonRef={buttonRef}\n imageRef={imageRef}\n maxWidth={maxWidth}\n onResizeStart={onResizeStart}\n onResizeEnd={onResizeEnd}\n captionsEnabled={captionsEnabled}\n />\n )}\n </>\n </Suspense>\n );\n}\n"],"mappings":";;;;;;;;;AAOA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA+B,IAAAC,KAAA,GAAAH,MAAA;AAK/BE,OAAA;AAEA,IAAAE,uBAAA,GAAAF,OAAA;AACA,IAAAG,uBAAA,GAAAH,OAAA;AACA,IAAAI,qBAAA,GAAAJ,OAAA;AACA,IAAAK,qBAAA,GAAAL,OAAA;AACA,IAAAM,sBAAA,GAAAN,OAAA;AACA,IAAAO,sBAAA,GAAAP,OAAA;AACA,IAAAQ,wBAAA,GAAAR,OAAA;AACA,IAAAS,MAAA,GAAAT,OAAA;AACA,IAAAU,QAAA,GAAAV,OAAA;AAcA,IAAAW,YAAA,GAAAX,OAAA;AACA,IAAAY,aAAA,GAAAZ,OAAA;AACA,IAAAa,qBAAA,GAAAb,OAAA;AACA,IAAAc,UAAA,GAAAd,OAAA;AACA,IAAAe,gBAAA,GAAAf,OAAA;AAxCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoCA,IAAMgB,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAC;AAE5B,SAASC,gBAAgBA,CAACC,GAAW,EAAE;EACnC,IAAI,CAACH,UAAU,CAACI,GAAG,CAACD,GAAG,CAAC,EAAE;IACtB,MAAM,IAAIE,OAAO,CAAC,UAAAC,OAAO,EAAI;MACzB,IAAMC,GAAG,GAAG,IAAIC,KAAK,CAAC,CAAC;MACvBD,GAAG,CAACJ,GAAG,GAAGA,GAAG;MACbI,GAAG,CAACE,MAAM,GAAG,YAAM;QACfT,UAAU,CAACU,GAAG,CAACP,GAAG,CAAC;QACnBG,OAAO,CAAC,IAAI,CAAC;MACjB,CAAC;IACL,CAAC,CAAC;EACN;AACJ;AAEA,SAASK,SAASA,CAAAC,IAAA,EAkBF;EAAA,IAjBZC,EAAE,GAAAD,IAAA,CAAFC,EAAE;IACFC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IACPC,SAAS,GAAAH,IAAA,CAATG,SAAS;IACTC,QAAQ,GAAAJ,IAAA,CAARI,QAAQ;IACRb,GAAG,GAAAS,IAAA,CAAHT,GAAG;IACHc,KAAK,GAAAL,IAAA,CAALK,KAAK;IACLC,MAAM,GAAAN,IAAA,CAANM,MAAM;IACNC,QAAQ,GAAAP,IAAA,CAARO,QAAQ;EAWRjB,gBAAgB,CAACC,GAAG,CAAC;EACrB,oBACIlB,KAAA,CAAAmC,aAAA;IACIP,EAAE,EAAEA,EAAG;IACPE,SAAS,EAAEA,SAAS,IAAIM,SAAU;IAClClB,GAAG,EAAEA,GAAI;IACTmB,GAAG,EAAER,OAAQ;IACbS,GAAG,EAAEP,QAAS;IACdQ,KAAK,EAAE;MACHN,MAAM,EAANA,MAAM;MACNC,QAAQ,EAARA,QAAQ;MACRF,KAAK,EAALA;IACJ,CAAE;IACFQ,SAAS,EAAC;EAAO,CACpB,CAAC;AAEV;AAgBe,SAASC,cAAcA,CAAAC,KAAA,EAYD;EAAA,IAXjCd,EAAE,GAAAc,KAAA,CAAFd,EAAE;IACFV,GAAG,GAAAwB,KAAA,CAAHxB,GAAG;IACHW,OAAO,GAAAa,KAAA,CAAPb,OAAO;IACPc,OAAO,GAAAD,KAAA,CAAPC,OAAO;IACPX,KAAK,GAAAU,KAAA,CAALV,KAAK;IACLC,MAAM,GAAAS,KAAA,CAANT,MAAM;IACNC,QAAQ,GAAAQ,KAAA,CAARR,QAAQ;IACRU,SAAS,GAAAF,KAAA,CAATE,SAAS;IACTC,WAAW,GAAAH,KAAA,CAAXG,WAAW;IACXC,OAAO,GAAAJ,KAAA,CAAPI,OAAO;IACPC,eAAe,GAAAL,KAAA,CAAfK,eAAe;EAEf,IAAMhB,QAAQ,GAAG,IAAAiB,aAAM,EAA0B,IAAI,CAAC;EACtD,IAAMC,SAAS,GAAG,IAAAD,aAAM,EAA2B,IAAI,CAAC;EACxD,IAAAE,qBAAA,GAAkD,IAAAC,gDAAuB,EAACR,OAAO,CAAC;IAAAS,sBAAA,OAAAC,eAAA,CAAAC,OAAA,EAAAJ,qBAAA;IAA3EK,UAAU,GAAAH,sBAAA;IAAEI,WAAW,GAAAJ,sBAAA;IAAEK,cAAc,GAAAL,sBAAA;EAC9C,IAAAM,SAAA,GAAoC,IAAAC,eAAQ,EAAU,KAAK,CAAC;IAAAC,UAAA,OAAAP,eAAA,CAAAC,OAAA,EAAAI,SAAA;IAArDG,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,IAAAG,qBAAA,GAAiB,IAAAC,iDAAyB,EAAC,CAAC;IAAAC,sBAAA,OAAAZ,eAAA,CAAAC,OAAA,EAAAS,qBAAA;IAArCG,MAAM,GAAAD,sBAAA;EACb,IAAAE,UAAA,GAAkC,IAAAR,eAAQ,EAAuB,IAAI,CAAC;IAAAS,UAAA,OAAAf,eAAA,CAAAC,OAAA,EAAAa,UAAA;IAA/DE,SAAS,GAAAD,UAAA;IAAEE,YAAY,GAAAF,UAAA;EAC9B,IAAMG,eAAe,GAAG,IAAAvB,aAAM,EAAuB,IAAI,CAAC;EAE1D,IAAMwB,QAAQ,GAAG,IAAAC,kBAAW,EACxB,UAACC,OAAsB,EAAK;IACxB,IAAInB,UAAU,IAAI,IAAAoB,yBAAgB,EAAC,IAAAC,sBAAa,EAAC,CAAC,CAAC,EAAE;MACjD,IAAMC,KAAoB,GAAGH,OAAO;MACpCG,KAAK,CAACC,cAAc,CAAC,CAAC;MACtB,IAAMC,IAAI,GAAG,IAAAC,sBAAa,EAACrC,OAAO,CAAC;MACnC,IAAI,IAAAsC,uBAAY,EAACF,IAAI,CAAC,EAAE;QACpBA,IAAI,CAACG,MAAM,CAAC,CAAC;MACjB;MACA1B,WAAW,CAAC,KAAK,CAAC;IACtB;IACA,OAAO,KAAK;EAChB,CAAC,EACD,CAACD,UAAU,EAAEZ,OAAO,EAAEa,WAAW,CACrC,CAAC;EAED,IAAM2B,OAAO,GAAG,IAAAV,kBAAW,EACvB,UAACI,KAAoB,EAAK;IACtB,IAAMO,eAAe,GAAG,IAAAR,sBAAa,EAAC,CAAC;IACvC,IAAMS,UAAU,GAAGpC,SAAS,CAACqC,OAAO;IACpC,IACI/B,UAAU,IACV,IAAAoB,yBAAgB,EAACS,eAAe,CAAC,IACjCA,eAAe,CAACG,QAAQ,CAAC,CAAC,CAACC,MAAM,KAAK,CAAC,EACzC;MACE,IAAI3C,WAAW,EAAE;QACb;QACA,IAAA4C,sBAAa,EAAC,IAAI,CAAC;QACnBZ,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBhC,OAAO,CAAC4C,KAAK,CAAC,CAAC;QACf,OAAO,IAAI;MACf,CAAC,MAAM,IAAIL,UAAU,KAAK,IAAI,IAAIA,UAAU,KAAKM,QAAQ,CAACC,aAAa,EAAE;QACrEf,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBO,UAAU,CAACK,KAAK,CAAC,CAAC;QAClB,OAAO,IAAI;MACf;IACJ;IACA,OAAO,KAAK;EAChB,CAAC,EACD,CAAC5C,OAAO,EAAES,UAAU,EAAEV,WAAW,CACrC,CAAC;EAED,IAAMgD,QAAQ,GAAG,IAAApB,kBAAW,EACxB,UAACI,KAAoB,EAAK;IACtB,IAAIN,eAAe,CAACe,OAAO,KAAKxC,OAAO,IAAIG,SAAS,CAACqC,OAAO,KAAKT,KAAK,CAACiB,MAAM,EAAE;MAC3E,IAAAL,sBAAa,EAAC,IAAI,CAAC;MACnBvB,MAAM,CAAC6B,MAAM,CAAC,YAAM;QAChBvC,WAAW,CAAC,IAAI,CAAC;QACjB,IAAMwC,iBAAiB,GAAG9B,MAAM,CAAC+B,cAAc,CAAC,CAAC;QACjD,IAAID,iBAAiB,KAAK,IAAI,EAAE;UAC5BA,iBAAiB,CAACN,KAAK,CAAC,CAAC;QAC7B;MACJ,CAAC,CAAC;MACF,OAAO,IAAI;IACf;IACA,OAAO,KAAK;EAChB,CAAC,EACD,CAAC5C,OAAO,EAAEoB,MAAM,EAAEV,WAAW,CACjC,CAAC;EAED,IAAA0C,gBAAS,EAAC,YAAM;IACZ,IAAIC,SAAS,GAAG,IAAI;IACpB,IAAMC,UAAU,GAAG,IAAAC,oBAAa,EAC5BnC,MAAM,CAACoC,sBAAsB,CAAC,UAAAC,KAAA,EAAqB;MAAA,IAAlBC,WAAW,GAAAD,KAAA,CAAXC,WAAW;MACxC,IAAIL,SAAS,EAAE;QACX7B,YAAY,CAACkC,WAAW,CAACC,IAAI,CAAC;UAAA,OAAM,IAAA7B,sBAAa,EAAC,CAAC;QAAA,EAAC,CAAC;MACzD;IACJ,CAAC,CAAC,EACFV,MAAM,CAACwC,eAAe,CAClBC,iCAAwB,EACxB,UAACC,CAAC,EAAEC,YAAY,EAAK;MACjBtC,eAAe,CAACe,OAAO,GAAGuB,YAAY;MACtC,OAAO,KAAK;IAChB,CAAC,EACDC,6BACJ,CAAC,EACD5C,MAAM,CAACwC,eAAe,CAClBK,sBAAa,EACb,UAAArC,OAAO,EAAI;MACP,IAAMG,KAAK,GAAGH,OAAO;MACrB,IAAIb,UAAU,EAAE;QACZ,OAAO,IAAI;MACf;MACA,IAAIgB,KAAK,CAACiB,MAAM,KAAK/D,QAAQ,CAACuD,OAAO,EAAE;QACnC,IAAIT,KAAK,CAACmC,QAAQ,EAAE;UAChBxD,WAAW,CAAC,CAACD,UAAU,CAAC;QAC5B,CAAC,MAAM;UACHE,cAAc,CAAC,CAAC;UAChBD,WAAW,CAAC,IAAI,CAAC;QACrB;QACA,OAAO,IAAI;MACf;MAEA,OAAO,KAAK;IAChB,CAAC,EACDsD,6BACJ,CAAC,EACD5C,MAAM,CAACwC,eAAe,CAClBO,0BAAiB,EACjB,UAAApC,KAAK,EAAI;MACL,IAAIA,KAAK,CAACiB,MAAM,KAAK/D,QAAQ,CAACuD,OAAO,EAAE;QACnC;QACA;QACAT,KAAK,CAACC,cAAc,CAAC,CAAC;QACtB,OAAO,IAAI;MACf;MACA,OAAO,KAAK;IAChB,CAAC,EACDgC,6BACJ,CAAC,EACD5C,MAAM,CAACwC,eAAe,CAACQ,2BAAkB,EAAE1C,QAAQ,EAAEsC,6BAAoB,CAAC,EAC1E5C,MAAM,CAACwC,eAAe,CAACS,8BAAqB,EAAE3C,QAAQ,EAAEsC,6BAAoB,CAAC,EAC7E5C,MAAM,CAACwC,eAAe,CAACU,0BAAiB,EAAEjC,OAAO,EAAE2B,6BAAoB,CAAC,EACxE5C,MAAM,CAACwC,eAAe,CAACW,2BAAkB,EAAExB,QAAQ,EAAEiB,6BAAoB,CAC7E,CAAC;IACD,OAAO,YAAM;MACTX,SAAS,GAAG,KAAK;MACjBC,UAAU,CAAC,CAAC;IAChB,CAAC;EACL,CAAC,EAAE,CACC3C,cAAc,EACdS,MAAM,EACNL,UAAU,EACVN,UAAU,EACVZ,OAAO,EACP6B,QAAQ,EACRW,OAAO,EACPU,QAAQ,EACRrC,WAAW,CACd,CAAC;EAEF,IAAM8D,cAAc,GAAG,SAAjBA,cAAcA,CAAA,EAAS;IACzBpD,MAAM,CAAC6B,MAAM,CAAC,YAAM;MAChB,IAAMhB,IAAI,GAAG,IAAAC,sBAAa,EAACrC,OAAO,CAAC;MACnC,IAAI,IAAAsC,uBAAY,EAACF,IAAI,CAAC,EAAE;QACpBA,IAAI,CAACuC,cAAc,CAAC,IAAI,CAAC;MAC7B;IACJ,CAAC,CAAC;EACN,CAAC;EAED,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIC,SAA6B,EAAEC,UAA8B,EAAK;IACnF;IACAC,UAAU,CAAC,YAAM;MACb5D,aAAa,CAAC,KAAK,CAAC;IACxB,CAAC,EAAE,GAAG,CAAC;IAEPI,MAAM,CAAC6B,MAAM,CAAC,YAAM;MAChB,IAAMhB,IAAI,GAAG,IAAAC,sBAAa,EAACrC,OAAO,CAAC;MACnC,IAAI,IAAAsC,uBAAY,EAACF,IAAI,CAAC,EAAE;QACpBA,IAAI,CAAC4C,iBAAiB,CAACH,SAAS,EAAEC,UAAU,CAAC;MACjD;IACJ,CAAC,CAAC;EACN,CAAC;EAED,IAAMG,aAAa,GAAG,SAAhBA,aAAaA,CAAA,EAAS;IACxB9D,aAAa,CAAC,IAAI,CAAC;EACvB,CAAC;EAED,IAAA+D,qBAAA,GAAyB,IAAAC,6CAAuB,EAAC,CAAC;IAA1CC,YAAY,GAAAF,qBAAA,CAAZE,YAAY;EACpB,IAAMvF,SAAS,GAAGe,UAAU,IAAI,IAAAoB,yBAAgB,EAACN,SAAS,CAAC,IAAI,CAACR,UAAU;EAC1E,IAAMmE,SAAS,GAAGzE,UAAU,IAAIM,UAAU;EAC1C,oBACI7D,KAAA,CAAAmC,aAAA,CAACtC,MAAA,CAAAoI,QAAQ;IAACC,QAAQ,EAAE;EAAK,gBACrBlI,KAAA,CAAAmC,aAAA,CAAAnC,KAAA,CAAAmI,QAAA,qBACInI,KAAA,CAAAmC,aAAA;IAAKK,SAAS,EAAEA;EAAU,gBACtBxC,KAAA,CAAAmC,aAAA,CAACT,SAAS;IACNE,EAAE,EAAEA,EAAG;IACPE,SAAS,EACLkG,SAAS,cAAAI,MAAA,CACQ,IAAAzD,yBAAgB,EAACN,SAAS,CAAC,GAAG,WAAW,GAAG,EAAE,IACzD,IACT;IACDnD,GAAG,EAAEA,GAAI;IACTW,OAAO,EAAEA,OAAQ;IACjBE,QAAQ,EAAEA,QAAS;IACnBC,KAAK,EAAEA,KAAM;IACbC,MAAM,EAAEA,MAAO;IACfC,QAAQ,EAAEA;EAAS,CACtB,CACA,CAAC,EACLW,WAAW,iBACR7C,KAAA,CAAAmC,aAAA;IAAKL,SAAS,EAAC;EAAyB,gBACpC9B,KAAA,CAAAmC,aAAA,CAAC9B,sBAAA,CAAAgI,qBAAqB;IAACC,aAAa,EAAExF;EAAQ,gBAC1C9C,KAAA,CAAAmC,aAAA,CAAClC,uBAAA,CAAAsI,eAAe,MAAE,CAAC,eACnBvI,KAAA,CAAAmC,aAAA,CAAC/B,qBAAA,CAAAoI,aAAa;IAACC,oBAAoB,EAAEV;EAAa,CAAE,CAAC,eACrD/H,KAAA,CAAAmC,aAAA,CAAC7B,sBAAA,CAAAoI,cAAc;IACXC,eAAe,eACX3I,KAAA,CAAAmC,aAAA,CAACrB,gBAAA,CAAA8H,sBAAsB;MAAC9G,SAAS,EAAC;IAA4B,CAAE,CACnE;IACD+G,WAAW,eACP7I,KAAA,CAAAmC,aAAA,CAACzB,YAAA,CAAAoI,WAAW;MAAChH,SAAS,EAAC;IAAwB,GAAC,oBAEnC,CAChB;IACDiH,aAAa,EAAEC;EAAqB,CACvC,CACkB,CACtB,CACR,EACApG,SAAS,IAAI,IAAA+B,yBAAgB,EAACN,SAAS,CAAC,IAAI2D,SAAS,iBAClDhI,KAAA,CAAAmC,aAAA,CAACxB,aAAA,CAAAsI,YAAY;IACTpG,WAAW,EAAEA,WAAY;IACzByE,cAAc,EAAEA,cAAe;IAC/BpD,MAAM,EAAEA,MAAO;IACfjB,SAAS,EAAEA,SAAU;IACrBlB,QAAQ,EAAEA,QAAS;IACnBG,QAAQ,EAAEA,QAAS;IACnB0F,aAAa,EAAEA,aAAc;IAC7BL,WAAW,EAAEA,WAAY;IACzBxE,eAAe,EAAEA;EAAgB,CACpC,CAEP,CACI,CAAC;AAEnB","ignoreList":[]}
1
+ {"version":3,"names":["React","Suspense","useCallback","useEffect","useRef","useState","AutoFocusPlugin","useLexicalComposerContext","LexicalErrorBoundary","HistoryPlugin","LexicalNestedComposer","RichTextPlugin","useLexicalNodeSelection","mergeRegister","$getNodeByKey","$getSelection","$isNodeSelection","$setSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","DRAGSTART_COMMAND","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","Placeholder","ImageResizer","useSharedHistoryContext","$isImageNode","LexicalContentEditable","imageCache","Set","useSuspenseImage","src","has","Promise","resolve","img","Image","onload","add","LazyImage","id","altText","className","imageRef","width","height","maxWidth","createElement","undefined","alt","ref","style","draggable","ImageComponent","nodeKey","resizable","showCaption","caption","captionsEnabled","buttonRef","isSelected","setSelected","clearSelection","isResizing","setIsResizing","editor","selection","setSelection","activeEditorRef","onDelete","payload","event","preventDefault","node","remove","onEnter","latestSelection","buttonElem","current","getNodes","length","focus","document","activeElement","onEscape","target","update","parentRootElement","getRootElement","isMounted","unregister","registerUpdateListener","editorState","read","registerCommand","_","activeEditor","shiftKey","setShowCaption","onResizeEnd","nextWidth","nextHeight","setTimeout","setWidthAndHeight","onResizeStart","historyState","isFocused","fallback","Fragment","initialEditor","externalHistoryState","contentEditable","placeholder","ErrorBoundary"],"sources":["ImageComponent.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport * as React from \"react\";\nimport { Suspense, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { LexicalEditor, NodeKey, BaseSelection } from \"lexical\";\n\nimport \"./ImageComponent.css\";\n\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { LexicalNestedComposer } from \"@lexical/react/LexicalNestedComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n $setSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n DRAGSTART_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\nimport { Placeholder } from \"./Placeholder\";\nimport { ImageResizer } from \"./ImageResizer\";\nimport { useSharedHistoryContext } from \"./SharedHistoryContext\";\nimport { $isImageNode } from \"~/ImageNode\";\nimport { LexicalContentEditable } from \"./ContentEditable\";\n\nconst imageCache = new Set();\n\nfunction useSuspenseImage(src: string) {\n if (!imageCache.has(src)) {\n throw new Promise(resolve => {\n const img = new Image();\n img.src = src;\n img.onload = () => {\n imageCache.add(src);\n resolve(null);\n };\n });\n }\n}\n\nfunction LazyImage({\n id,\n altText,\n className,\n imageRef,\n src,\n width,\n height,\n maxWidth\n}: {\n id: string;\n altText: string;\n className: string | null;\n height: \"inherit\" | number;\n imageRef: { current: null | HTMLImageElement };\n maxWidth: number;\n src: string;\n width: \"inherit\" | number;\n}): JSX.Element {\n useSuspenseImage(src);\n return (\n <img\n id={id}\n className={className || undefined}\n src={src}\n alt={altText}\n ref={imageRef}\n style={{\n height,\n maxWidth,\n width\n }}\n draggable=\"false\"\n />\n );\n}\n\ninterface ImageComponentProps {\n id: string;\n altText: string;\n caption: LexicalEditor;\n height: \"inherit\" | number;\n maxWidth: number;\n nodeKey: NodeKey;\n resizable: boolean;\n showCaption: boolean;\n src: string;\n width: \"inherit\" | number;\n captionsEnabled: boolean;\n}\n\nexport default function ImageComponent({\n id,\n src,\n altText,\n nodeKey,\n width,\n height,\n maxWidth,\n resizable,\n showCaption,\n caption,\n captionsEnabled\n}: ImageComponentProps): JSX.Element {\n const imageRef = useRef<null | HTMLImageElement>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\n const [isResizing, setIsResizing] = useState<boolean>(false);\n const [editor] = useLexicalComposerContext();\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const activeEditorRef = useRef<LexicalEditor | null>(null);\n\n const onDelete = useCallback(\n (payload: KeyboardEvent) => {\n if (isSelected && $isNodeSelection($getSelection())) {\n const event: KeyboardEvent = payload;\n event.preventDefault();\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.remove();\n }\n setSelected(false);\n }\n return false;\n },\n [isSelected, nodeKey, setSelected]\n );\n\n const onEnter = useCallback(\n (event: KeyboardEvent) => {\n const latestSelection = $getSelection();\n const buttonElem = buttonRef.current;\n if (\n isSelected &&\n $isNodeSelection(latestSelection) &&\n latestSelection.getNodes().length === 1\n ) {\n if (showCaption) {\n // Move focus into nested editor\n $setSelection(null);\n event.preventDefault();\n caption.focus();\n return true;\n } else if (buttonElem !== null && buttonElem !== document.activeElement) {\n event.preventDefault();\n buttonElem.focus();\n return true;\n }\n }\n return false;\n },\n [caption, isSelected, showCaption]\n );\n\n const onEscape = useCallback(\n (event: KeyboardEvent) => {\n if (activeEditorRef.current === caption || buttonRef.current === event.target) {\n $setSelection(null);\n editor.update(() => {\n setSelected(true);\n const parentRootElement = editor.getRootElement();\n if (parentRootElement !== null) {\n parentRootElement.focus();\n }\n });\n return true;\n }\n return false;\n },\n [caption, editor, setSelected]\n );\n\n useEffect(() => {\n let isMounted = true;\n const unregister = mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n if (isMounted) {\n setSelection(editorState.read(() => $getSelection()));\n }\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_, activeEditor) => {\n activeEditorRef.current = activeEditor;\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n payload => {\n const event = payload;\n if (isResizing) {\n return true;\n }\n if (event.target === imageRef.current) {\n if (event.shiftKey) {\n setSelected(!isSelected);\n } else {\n clearSelection();\n setSelected(true);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n DRAGSTART_COMMAND,\n event => {\n if (event.target === imageRef.current) {\n // TODO This is just a temporary workaround for FF to behave like other browsers.\n // Ideally, this handles drag & drop too (and all browsers).\n event.preventDefault();\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_ESCAPE_COMMAND, onEscape, COMMAND_PRIORITY_LOW)\n );\n return () => {\n isMounted = false;\n unregister();\n };\n }, [\n clearSelection,\n editor,\n isResizing,\n isSelected,\n nodeKey,\n onDelete,\n onEnter,\n onEscape,\n setSelected\n ]);\n\n const setShowCaption = () => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setShowCaption(true);\n }\n });\n };\n\n const onResizeEnd = (nextWidth: \"inherit\" | number, nextHeight: \"inherit\" | number) => {\n // Delay hiding the resize bars for click case\n setTimeout(() => {\n setIsResizing(false);\n }, 200);\n\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setWidthAndHeight(nextWidth, nextHeight);\n }\n });\n };\n\n const onResizeStart = () => {\n setIsResizing(true);\n };\n\n const { historyState } = useSharedHistoryContext();\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\n const isFocused = isSelected || isResizing;\n return (\n <Suspense fallback={null}>\n <>\n <div draggable={draggable}>\n <LazyImage\n id={id}\n className={\n isFocused\n ? `focused ${$isNodeSelection(selection) ? \"draggable\" : \"\"}`\n : null\n }\n src={src}\n altText={altText}\n imageRef={imageRef}\n width={width}\n height={height}\n maxWidth={maxWidth}\n />\n </div>\n {showCaption && (\n <div className=\"image-caption-container\">\n <LexicalNestedComposer initialEditor={caption}>\n <AutoFocusPlugin />\n <HistoryPlugin externalHistoryState={historyState} />\n <RichTextPlugin\n contentEditable={\n <LexicalContentEditable className=\"ImageNode__contentEditable\" />\n }\n placeholder={\n <Placeholder className=\"ImageNode__placeholder\">\n Enter a caption...\n </Placeholder>\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </LexicalNestedComposer>\n </div>\n )}\n {resizable && $isNodeSelection(selection) && isFocused && (\n <ImageResizer\n showCaption={showCaption}\n setShowCaption={setShowCaption}\n editor={editor}\n buttonRef={buttonRef}\n imageRef={imageRef}\n maxWidth={maxWidth}\n onResizeStart={onResizeStart}\n onResizeEnd={onResizeEnd}\n captionsEnabled={captionsEnabled}\n />\n )}\n </>\n </Suspense>\n );\n}\n"],"mappings":"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","ignoreList":[]}