@webiny/lexical-editor 5.44.1-beta.1 → 5.45.0-beta.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/README.md +6 -12
- package/commands/image.d.ts +2 -2
- package/commands/image.js +2 -8
- package/commands/image.js.map +1 -1
- package/commands/index.d.ts +5 -4
- package/commands/index.js +5 -49
- package/commands/index.js.map +1 -1
- package/commands/list.d.ts +1 -1
- package/commands/list.js +4 -10
- package/commands/list.js.map +1 -1
- package/commands/quote.d.ts +1 -1
- package/commands/quote.js +2 -8
- package/commands/quote.js.map +1 -1
- package/commands/toolbar.js +2 -8
- package/commands/toolbar.js.map +1 -1
- package/commands/typography.d.ts +8 -0
- package/commands/typography.js +4 -0
- package/commands/typography.js.map +1 -0
- package/components/Editor/EnsureHeadingTagPlugin.js +10 -16
- package/components/Editor/EnsureHeadingTagPlugin.js.map +1 -1
- package/components/Editor/RichTextEditor.d.ts +12 -8
- package/components/Editor/RichTextEditor.js +89 -102
- package/components/Editor/RichTextEditor.js.map +1 -1
- package/components/Editor/normalizeInputValue.d.ts +1 -1
- package/components/Editor/normalizeInputValue.js +2 -8
- package/components/Editor/normalizeInputValue.js.map +1 -1
- package/components/LexicalEditorConfig/LexicalEditorConfig.d.ts +2 -3
- package/components/LexicalEditorConfig/LexicalEditorConfig.js +21 -32
- package/components/LexicalEditorConfig/LexicalEditorConfig.js.map +1 -1
- package/components/LexicalEditorConfig/components/Node.d.ts +1 -1
- package/components/LexicalEditorConfig/components/Node.js +17 -26
- package/components/LexicalEditorConfig/components/Node.js.map +1 -1
- package/components/LexicalEditorConfig/components/Plugin.js +17 -26
- package/components/LexicalEditorConfig/components/Plugin.js.map +1 -1
- package/components/LexicalEditorConfig/components/ToolbarElement.js +17 -26
- package/components/LexicalEditorConfig/components/ToolbarElement.js.map +1 -1
- package/components/LexicalHtmlRenderer.d.ts +4 -7
- package/components/LexicalHtmlRenderer.js +35 -53
- package/components/LexicalHtmlRenderer.js.map +1 -1
- package/components/Toolbar/StaticToolbar.css +416 -0
- package/components/Toolbar/StaticToolbar.d.ts +3 -1
- package/components/Toolbar/StaticToolbar.js +19 -23
- package/components/Toolbar/StaticToolbar.js.map +1 -1
- package/components/ToolbarActions/BoldAction.js +16 -21
- package/components/ToolbarActions/BoldAction.js.map +1 -1
- package/components/ToolbarActions/BulletListAction.js +25 -31
- package/components/ToolbarActions/BulletListAction.js.map +1 -1
- package/components/ToolbarActions/CodeHighlightAction.js +16 -21
- package/components/ToolbarActions/CodeHighlightAction.js.map +1 -1
- package/components/ToolbarActions/FontColorAction.js +32 -42
- package/components/ToolbarActions/FontColorAction.js.map +1 -1
- package/components/ToolbarActions/ImageAction.js +19 -34
- package/components/ToolbarActions/ImageAction.js.map +1 -1
- package/components/ToolbarActions/ItalicAction.js +16 -21
- package/components/ToolbarActions/ItalicAction.js.map +1 -1
- package/components/ToolbarActions/LinkAction.js +19 -24
- package/components/ToolbarActions/LinkAction.js.map +1 -1
- package/components/ToolbarActions/NumberedListAction.js +25 -36
- package/components/ToolbarActions/NumberedListAction.js.map +1 -1
- package/components/ToolbarActions/QuoteAction.js +20 -25
- package/components/ToolbarActions/QuoteAction.js.map +1 -1
- package/components/ToolbarActions/TextAlignmentAction.js +36 -45
- package/components/ToolbarActions/TextAlignmentAction.js.map +1 -1
- package/components/ToolbarActions/TypographyAction.js +57 -79
- package/components/ToolbarActions/TypographyAction.js.map +1 -1
- package/components/ToolbarActions/UnderlineAction.js +16 -21
- package/components/ToolbarActions/UnderlineAction.js.map +1 -1
- package/context/FontColorActionContext.js +2 -9
- package/context/FontColorActionContext.js.map +1 -1
- package/context/RichTextEditorContext.d.ts +6 -7
- package/context/RichTextEditorContext.js +28 -26
- package/context/RichTextEditorContext.js.map +1 -1
- package/context/SharedHistoryContext.d.ts +2 -2
- package/context/SharedHistoryContext.js +12 -20
- package/context/SharedHistoryContext.js.map +1 -1
- package/context/TextAlignmentActionContextProps.d.ts +1 -1
- package/context/TextAlignmentActionContextProps.js +2 -9
- package/context/TextAlignmentActionContextProps.js.map +1 -1
- package/context/TypographyActionContext.d.ts +3 -2
- package/context/TypographyActionContext.js +2 -9
- package/context/TypographyActionContext.js.map +1 -1
- package/exports/admin/lexical.d.ts +15 -0
- package/exports/admin/lexical.js +23 -0
- package/exports/admin/lexical.js.map +1 -0
- package/hooks/index.d.ts +7 -8
- package/hooks/index.js +7 -93
- package/hooks/index.js.map +1 -1
- package/hooks/useCurrentElement.d.ts +3 -3
- package/hooks/useCurrentElement.js +11 -18
- package/hooks/useCurrentElement.js.map +1 -1
- package/hooks/useCurrentSelection.d.ts +2 -1
- package/hooks/useCurrentSelection.js +27 -40
- package/hooks/useCurrentSelection.js.map +1 -1
- package/hooks/useFontColorPicker.d.ts +1 -1
- package/hooks/useFontColorPicker.js +5 -11
- package/hooks/useFontColorPicker.js.map +1 -1
- package/hooks/useIsMounted.js +6 -14
- package/hooks/useIsMounted.js.map +1 -1
- package/hooks/useRichTextEditor.d.ts +1 -1
- package/hooks/useRichTextEditor.js +5 -11
- package/hooks/useRichTextEditor.js.map +1 -1
- package/hooks/useTextAlignmentAction.d.ts +1 -1
- package/hooks/useTextAlignmentAction.js +5 -11
- package/hooks/useTextAlignmentAction.js.map +1 -1
- package/hooks/useTypographyAction.d.ts +1 -1
- package/hooks/useTypographyAction.js +5 -11
- package/hooks/useTypographyAction.js.map +1 -1
- package/index.d.ts +33 -38
- package/index.js +44 -322
- package/index.js.map +1 -1
- package/package.json +18 -22
- package/plugins/BlurEventPlugin/BlurEventPlugin.d.ts +2 -2
- package/plugins/BlurEventPlugin/BlurEventPlugin.js +16 -22
- package/plugins/BlurEventPlugin/BlurEventPlugin.js.map +1 -1
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js +9 -14
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js.map +1 -1
- package/plugins/CodeHighlightPlugin/index.d.ts +1 -1
- package/plugins/CodeHighlightPlugin/index.js +1 -16
- package/plugins/CodeHighlightPlugin/index.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.d.ts +10 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js +28 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js.map +1 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.d.ts +7 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js +61 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js.map +1 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.css +2 -136
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.d.ts +4 -16
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +7 -180
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/index.d.ts +1 -1
- package/plugins/FloatingLinkEditorPlugin/index.js +1 -16
- package/plugins/FloatingLinkEditorPlugin/index.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js +3 -9
- package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/types.d.ts +10 -0
- package/plugins/FloatingLinkEditorPlugin/types.js +3 -0
- package/plugins/FloatingLinkEditorPlugin/types.js.map +1 -0
- package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.d.ts +8 -2
- package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js +120 -88
- package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js.map +1 -1
- package/plugins/FontColorPlugin/FontColorPlugin.js +19 -22
- package/plugins/FontColorPlugin/FontColorPlugin.js.map +1 -1
- package/plugins/FontColorPlugin/applyColorToNode.d.ts +2 -2
- package/plugins/FontColorPlugin/applyColorToNode.js +4 -10
- package/plugins/FontColorPlugin/applyColorToNode.js.map +1 -1
- package/plugins/FontColorPlugin/applyColorToSelection.d.ts +2 -2
- package/plugins/FontColorPlugin/applyColorToSelection.js +28 -44
- package/plugins/FontColorPlugin/applyColorToSelection.js.map +1 -1
- package/plugins/ImagesPlugin/ImagesPlugin.d.ts +1 -2
- package/plugins/ImagesPlugin/ImagesPlugin.js +58 -60
- package/plugins/ImagesPlugin/ImagesPlugin.js.map +1 -1
- package/plugins/LinkPlugin/LinkPlugin.js +29 -37
- package/plugins/LinkPlugin/LinkPlugin.js.map +1 -1
- package/plugins/ListPLugin/ListPlugin.js +52 -15
- package/plugins/ListPLugin/ListPlugin.js.map +1 -1
- package/plugins/QuoteNodePlugin/QuoteNodePlugin.js +19 -16
- package/plugins/QuoteNodePlugin/QuoteNodePlugin.js.map +1 -1
- package/plugins/StateHandlingPlugin.d.ts +1 -1
- package/plugins/StateHandlingPlugin.js +32 -39
- package/plugins/StateHandlingPlugin.js.map +1 -1
- package/plugins/TypographyPlugin/TypographyPlugin.js +17 -21
- package/plugins/TypographyPlugin/TypographyPlugin.js.map +1 -1
- package/types.d.ts +4 -4
- package/types.js +6 -38
- package/types.js.map +1 -1
- package/ui/ContentEditable.d.ts +0 -1
- package/ui/ContentEditable.js +7 -14
- package/ui/ContentEditable.js.map +1 -1
- package/ui/Divider.d.ts +0 -1
- package/ui/Divider.js +3 -10
- package/ui/Divider.js.map +1 -1
- package/ui/DropDown.d.ts +1 -1
- package/ui/DropDown.js +64 -90
- package/ui/DropDown.js.map +1 -1
- package/ui/ImageResizer.d.ts +0 -1
- package/ui/ImageResizer.js +78 -83
- package/ui/ImageResizer.js.map +1 -1
- package/ui/LinkPreview.d.ts +0 -1
- package/ui/LinkPreview.js +22 -29
- package/ui/LinkPreview.js.map +1 -1
- package/ui/Placeholder.d.ts +1 -1
- package/ui/Placeholder.js +10 -16
- package/ui/Placeholder.js.map +1 -1
- package/ui/TextInput.d.ts +0 -1
- package/ui/TextInput.js +11 -18
- package/ui/TextInput.js.map +1 -1
- package/ui/ToolbarActionDialog.js +30 -42
- package/ui/ToolbarActionDialog.js.map +1 -1
- package/utils/canUseDOM.js +1 -7
- package/utils/canUseDOM.js.map +1 -1
- package/utils/files.d.ts +6 -6
- package/utils/files.js +5 -32
- package/utils/files.js.map +1 -1
- package/utils/getDOMRangeRect.js +4 -10
- package/utils/getDOMRangeRect.js.map +1 -1
- package/utils/getSelectedNode.d.ts +1 -1
- package/utils/getSelectedNode.js +9 -16
- package/utils/getSelectedNode.js.map +1 -1
- package/utils/getTransparentImage.js +1 -7
- package/utils/getTransparentImage.js.map +1 -1
- package/utils/insertImage.d.ts +1 -1
- package/utils/insertImage.js +8 -14
- package/utils/insertImage.js.map +1 -1
- package/utils/isAnchorLink.js +1 -7
- package/utils/isAnchorLink.js.map +1 -1
- package/utils/isChildOfFloatingToolbar.js +3 -12
- package/utils/isChildOfFloatingToolbar.js.map +1 -1
- package/utils/isHTMLElement.js +1 -7
- package/utils/isHTMLElement.js.map +1 -1
- package/utils/isValidJSON.js +3 -9
- package/utils/isValidJSON.js.map +1 -1
- package/utils/isValidLexicalData.d.ts +3 -3
- package/utils/isValidLexicalData.js +6 -12
- package/utils/isValidLexicalData.js.map +1 -1
- package/utils/point.js +35 -60
- package/utils/point.js.map +1 -1
- package/utils/rect.d.ts +1 -1
- package/utils/rect.js +115 -149
- package/utils/rect.js.map +1 -1
- package/utils/sanitizeUrl.js +6 -13
- package/utils/sanitizeUrl.js.map +1 -1
- package/utils/setFloatingElemPosition.d.ts +1 -1
- package/utils/setFloatingElemPosition.js +24 -30
- package/utils/setFloatingElemPosition.js.map +1 -1
- package/components/Editor/HeadingEditor.d.ts +0 -7
- package/components/Editor/HeadingEditor.js +0 -30
- package/components/Editor/HeadingEditor.js.map +0 -1
- package/components/Editor/ParagraphEditor.d.ts +0 -7
- package/components/Editor/ParagraphEditor.js +0 -29
- package/components/Editor/ParagraphEditor.js.map +0 -1
- package/components/Toolbar/Toolbar.css +0 -643
- package/components/Toolbar/Toolbar.d.ts +0 -11
- package/components/Toolbar/Toolbar.js +0 -165
- package/components/Toolbar/Toolbar.js.map +0 -1
- package/components/ToolbarActions/FontSizeAction.d.ts +0 -14
- package/components/ToolbarActions/FontSizeAction.js +0 -109
- package/components/ToolbarActions/FontSizeAction.js.map +0 -1
- package/hooks/useList.d.ts +0 -2
- package/hooks/useList.js +0 -54
- package/hooks/useList.js.map +0 -1
- package/hooks/useQuote.d.ts +0 -2
- package/hooks/useQuote.js +0 -22
- package/hooks/useQuote.js.map +0 -1
- package/plugins/FloatingLinkEditorPlugin/LinkEditForm.d.ts +0 -9
- package/plugins/FloatingLinkEditorPlugin/LinkEditForm.js +0 -118
- package/plugins/FloatingLinkEditorPlugin/LinkEditForm.js.map +0 -1
- package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.d.ts +0 -9
- package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.js +0 -44
- package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.js.map +0 -1
- package/utils/generateInitialLexicalValue.d.ts +0 -4
- package/utils/generateInitialLexicalValue.js +0 -33
- package/utils/generateInitialLexicalValue.js.map +0 -1
package/ui/DropDown.js
CHANGED
|
@@ -1,16 +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.DropDown = DropDown;
|
|
9
|
-
exports.DropDownItem = DropDownItem;
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
12
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
-
var React = _react;
|
|
14
1
|
/**
|
|
15
2
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
16
3
|
*
|
|
@@ -19,22 +6,28 @@ var React = _react;
|
|
|
19
6
|
*
|
|
20
7
|
*/
|
|
21
8
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
11
|
+
const DropDownContext = /*#__PURE__*/React.createContext(null);
|
|
12
|
+
export function DropDownItem({
|
|
13
|
+
children,
|
|
14
|
+
className,
|
|
15
|
+
onClick,
|
|
16
|
+
title
|
|
17
|
+
}) {
|
|
18
|
+
const ref = useRef(null);
|
|
19
|
+
const dropDownContext = React.useContext(DropDownContext);
|
|
30
20
|
if (dropDownContext === null) {
|
|
31
21
|
throw new Error("DropDownItem must be used within a DropDown");
|
|
32
22
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
23
|
+
const {
|
|
24
|
+
registerItem
|
|
25
|
+
} = dropDownContext;
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (!ref.current) {
|
|
28
|
+
return;
|
|
37
29
|
}
|
|
30
|
+
registerItem(ref);
|
|
38
31
|
}, [ref, registerItem]);
|
|
39
32
|
return /*#__PURE__*/React.createElement("button", {
|
|
40
33
|
className: className,
|
|
@@ -44,45 +37,37 @@ function DropDownItem(_ref) {
|
|
|
44
37
|
type: "button"
|
|
45
38
|
}, children);
|
|
46
39
|
}
|
|
47
|
-
function DropDownItems(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
setItems
|
|
57
|
-
var _useState3 = (0, _react.useState)(),
|
|
58
|
-
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
59
|
-
highlightedItem = _useState4[0],
|
|
60
|
-
setHighlightedItem = _useState4[1];
|
|
61
|
-
var registerItem = (0, _react.useCallback)(function (itemRef) {
|
|
62
|
-
setItems(function (prev) {
|
|
63
|
-
return prev ? [].concat((0, _toConsumableArray2.default)(prev), [itemRef]) : [itemRef];
|
|
64
|
-
});
|
|
40
|
+
function DropDownItems({
|
|
41
|
+
children,
|
|
42
|
+
dropDownRef,
|
|
43
|
+
showScroll = true,
|
|
44
|
+
onClose
|
|
45
|
+
}) {
|
|
46
|
+
const [items, setItems] = useState();
|
|
47
|
+
const [highlightedItem, setHighlightedItem] = useState();
|
|
48
|
+
const registerItem = useCallback(itemRef => {
|
|
49
|
+
setItems(prev => prev ? [...prev, itemRef] : [itemRef]);
|
|
65
50
|
}, [setItems]);
|
|
66
|
-
|
|
51
|
+
const handleKeyDown = event => {
|
|
67
52
|
if (!items) {
|
|
68
53
|
return;
|
|
69
54
|
}
|
|
70
|
-
|
|
55
|
+
const key = event.key;
|
|
71
56
|
if (["Escape", "ArrowUp", "ArrowDown", "Tab"].includes(key)) {
|
|
72
57
|
event.preventDefault();
|
|
73
58
|
}
|
|
74
59
|
if (key === "Escape" || key === "Tab") {
|
|
75
60
|
onClose();
|
|
76
61
|
} else if (key === "ArrowUp") {
|
|
77
|
-
setHighlightedItem(
|
|
62
|
+
setHighlightedItem(prev => {
|
|
78
63
|
if (!prev) {
|
|
79
64
|
return items[0];
|
|
80
65
|
}
|
|
81
|
-
|
|
66
|
+
const index = items.indexOf(prev) - 1;
|
|
82
67
|
return items[index === -1 ? items.length - 1 : index];
|
|
83
68
|
});
|
|
84
69
|
} else if (key === "ArrowDown") {
|
|
85
|
-
setHighlightedItem(
|
|
70
|
+
setHighlightedItem(prev => {
|
|
86
71
|
if (!prev) {
|
|
87
72
|
return items[0];
|
|
88
73
|
}
|
|
@@ -90,12 +75,10 @@ function DropDownItems(_ref2) {
|
|
|
90
75
|
});
|
|
91
76
|
}
|
|
92
77
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}, [registerItem]);
|
|
98
|
-
(0, _react.useEffect)(function () {
|
|
78
|
+
const contextValue = useMemo(() => ({
|
|
79
|
+
registerItem
|
|
80
|
+
}), [registerItem]);
|
|
81
|
+
useEffect(() => {
|
|
99
82
|
if (items && !highlightedItem) {
|
|
100
83
|
setHighlightedItem(items[0]);
|
|
101
84
|
}
|
|
@@ -106,54 +89,47 @@ function DropDownItems(_ref2) {
|
|
|
106
89
|
return /*#__PURE__*/React.createElement(DropDownContext.Provider, {
|
|
107
90
|
value: contextValue
|
|
108
91
|
}, /*#__PURE__*/React.createElement("div", {
|
|
109
|
-
className:
|
|
92
|
+
className: `lexical-dropdown ${showScroll ? "" : "no-scroll"}`,
|
|
110
93
|
ref: dropDownRef,
|
|
111
94
|
onKeyDown: handleKeyDown
|
|
112
95
|
}, children));
|
|
113
96
|
}
|
|
114
|
-
function DropDown(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
var buttonRef = (0, _react.useRef)(null);
|
|
97
|
+
export function DropDown({
|
|
98
|
+
disabled = false,
|
|
99
|
+
buttonLabel,
|
|
100
|
+
buttonAriaLabel,
|
|
101
|
+
buttonClassName,
|
|
102
|
+
buttonIconClassName,
|
|
103
|
+
children,
|
|
104
|
+
stopCloseOnClickSelf,
|
|
105
|
+
showScroll = true
|
|
106
|
+
}) {
|
|
107
|
+
const dropDownRef = useRef(null);
|
|
108
|
+
const buttonRef = useRef(null);
|
|
127
109
|
// Used to prevent flickering of the dropdown while calculating the dropdown position.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
setPositionIsCalculated = _useState6[1];
|
|
132
|
-
var _useState7 = (0, _react.useState)(false),
|
|
133
|
-
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
134
|
-
showDropDown = _useState8[0],
|
|
135
|
-
setShowDropDown = _useState8[1];
|
|
136
|
-
var handleClose = function handleClose() {
|
|
110
|
+
const [positionIsCalculated, setPositionIsCalculated] = useState(false);
|
|
111
|
+
const [showDropDown, setShowDropDown] = useState(false);
|
|
112
|
+
const handleClose = () => {
|
|
137
113
|
setPositionIsCalculated(false);
|
|
138
114
|
setShowDropDown(false);
|
|
139
115
|
if (buttonRef && buttonRef.current) {
|
|
140
116
|
buttonRef.current.focus();
|
|
141
117
|
}
|
|
142
118
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
const button = buttonRef.current;
|
|
121
|
+
const dropDown = dropDownRef.current;
|
|
146
122
|
if (showDropDown && button && dropDown) {
|
|
147
123
|
dropDown.style.top = "44px";
|
|
148
|
-
dropDown.style.left =
|
|
124
|
+
dropDown.style.left = `${button.offsetLeft}px`;
|
|
149
125
|
setPositionIsCalculated(true);
|
|
150
126
|
}
|
|
151
127
|
}, [dropDownRef, buttonRef, showDropDown]);
|
|
152
|
-
|
|
153
|
-
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
const button = buttonRef.current;
|
|
154
130
|
if (button && showDropDown) {
|
|
155
|
-
|
|
156
|
-
|
|
131
|
+
const handle = event => {
|
|
132
|
+
const target = event.target;
|
|
157
133
|
if (stopCloseOnClickSelf) {
|
|
158
134
|
if (dropDownRef.current && dropDownRef.current.contains(target)) {
|
|
159
135
|
return;
|
|
@@ -164,13 +140,13 @@ function DropDown(_ref3) {
|
|
|
164
140
|
}
|
|
165
141
|
};
|
|
166
142
|
document.addEventListener("click", handle);
|
|
167
|
-
return
|
|
143
|
+
return () => {
|
|
168
144
|
document.removeEventListener("click", handle);
|
|
169
145
|
};
|
|
170
146
|
}
|
|
171
147
|
return;
|
|
172
148
|
}, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);
|
|
173
|
-
|
|
149
|
+
const displayContainer = useMemo(() => {
|
|
174
150
|
// To prevent blinking, we show the container only when the dropdown position is calculated.
|
|
175
151
|
// Without this, window would be visible first on left (0px), and after a millisecond on the right side.
|
|
176
152
|
return positionIsCalculated ? {
|
|
@@ -186,9 +162,7 @@ function DropDown(_ref3) {
|
|
|
186
162
|
disabled: disabled,
|
|
187
163
|
"aria-label": buttonAriaLabel || buttonLabel,
|
|
188
164
|
className: buttonClassName,
|
|
189
|
-
onClick:
|
|
190
|
-
return setShowDropDown(!showDropDown);
|
|
191
|
-
},
|
|
165
|
+
onClick: () => setShowDropDown(!showDropDown),
|
|
192
166
|
ref: buttonRef
|
|
193
167
|
}, buttonIconClassName && /*#__PURE__*/React.createElement("span", {
|
|
194
168
|
className: buttonIconClassName
|
package/ui/DropDown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","React","DropDownContext","createContext","DropDownItem","_ref","children","className","onClick","title","ref","useRef","dropDownContext","useContext","Error","registerItem","useEffect","current","createElement","type","DropDownItems","_ref2","dropDownRef","_ref2$showScroll","showScroll","onClose","_useState","useState","_useState2","_slicedToArray2","default","items","setItems","_useState3","_useState4","highlightedItem","setHighlightedItem","useCallback","itemRef","prev","concat","_toConsumableArray2","handleKeyDown","event","key","includes","preventDefault","index","indexOf","length","contextValue","useMemo","focus","Provider","value","onKeyDown","DropDown","_ref3","_ref3$disabled","disabled","buttonLabel","buttonAriaLabel","buttonClassName","buttonIconClassName","stopCloseOnClickSelf","_ref3$showScroll","buttonRef","_useState5","_useState6","positionIsCalculated","setPositionIsCalculated","_useState7","_useState8","showDropDown","setShowDropDown","handleClose","button","dropDown","style","top","left","offsetLeft","handle","target","contains","document","addEventListener","removeEventListener","displayContainer","display","Fragment","position"],"sources":["DropDown.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 */\n\nimport { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport * as React from \"react\";\n\ntype DropDownContextType = {\n registerItem: (ref: React.RefObject<HTMLButtonElement>) => void;\n};\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null);\n\nexport function DropDownItem({\n children,\n className,\n onClick,\n title\n}: {\n children: React.ReactNode;\n className: string;\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n title?: string;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n\n const dropDownContext = React.useContext(DropDownContext);\n\n if (dropDownContext === null) {\n throw new Error(\"DropDownItem must be used within a DropDown\");\n }\n\n const { registerItem } = dropDownContext;\n\n useEffect(() => {\n if (ref && ref.current) {\n registerItem(ref);\n }\n }, [ref, registerItem]);\n\n return (\n <button className={className} onClick={onClick} ref={ref} title={title} type=\"button\">\n {children}\n </button>\n );\n}\n\nfunction DropDownItems({\n children,\n dropDownRef,\n showScroll = true,\n onClose\n}: {\n children: React.ReactNode;\n dropDownRef?: React.Ref<HTMLDivElement>;\n showScroll?: boolean;\n onClose: () => void;\n}) {\n const [items, setItems] = useState<React.RefObject<HTMLButtonElement>[]>();\n const [highlightedItem, setHighlightedItem] = useState<React.RefObject<HTMLButtonElement>>();\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement>) => {\n setItems(prev => (prev ? [...prev, itemRef] : [itemRef]));\n },\n [setItems]\n );\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!items) {\n return;\n }\n\n const key = event.key;\n\n if ([\"Escape\", \"ArrowUp\", \"ArrowDown\", \"Tab\"].includes(key)) {\n event.preventDefault();\n }\n\n if (key === \"Escape\" || key === \"Tab\") {\n onClose();\n } else if (key === \"ArrowUp\") {\n setHighlightedItem(prev => {\n if (!prev) {\n return items[0];\n }\n const index = items.indexOf(prev) - 1;\n return items[index === -1 ? items.length - 1 : index];\n });\n } else if (key === \"ArrowDown\") {\n setHighlightedItem(prev => {\n if (!prev) {\n return items[0];\n }\n return items[items.indexOf(prev) + 1];\n });\n }\n };\n\n const contextValue = useMemo(\n () => ({\n registerItem\n }),\n [registerItem]\n );\n\n useEffect(() => {\n if (items && !highlightedItem) {\n setHighlightedItem(items[0]);\n }\n\n if (highlightedItem && highlightedItem.current) {\n highlightedItem.current.focus();\n }\n }, [items, highlightedItem]);\n\n return (\n <DropDownContext.Provider value={contextValue}>\n <div\n className={`lexical-dropdown ${showScroll ? \"\" : \"no-scroll\"}`}\n ref={dropDownRef}\n onKeyDown={handleKeyDown}\n >\n {children}\n </div>\n </DropDownContext.Provider>\n );\n}\n\nexport function DropDown({\n disabled = false,\n buttonLabel,\n buttonAriaLabel,\n buttonClassName,\n buttonIconClassName,\n children,\n stopCloseOnClickSelf,\n showScroll = true\n}: {\n disabled?: boolean;\n buttonAriaLabel?: string;\n buttonClassName: string;\n buttonIconClassName?: string;\n buttonLabel?: string;\n children: ReactNode;\n stopCloseOnClickSelf?: boolean;\n showScroll?: boolean;\n}): JSX.Element {\n const dropDownRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n // Used to prevent flickering of the dropdown while calculating the dropdown position.\n const [positionIsCalculated, setPositionIsCalculated] = useState(false);\n const [showDropDown, setShowDropDown] = useState(false);\n\n const handleClose = () => {\n setPositionIsCalculated(false);\n setShowDropDown(false);\n if (buttonRef && buttonRef.current) {\n buttonRef.current.focus();\n }\n };\n\n useEffect(() => {\n const button = buttonRef.current;\n const dropDown = dropDownRef.current;\n\n if (showDropDown && button && dropDown) {\n dropDown.style.top = \"44px\";\n dropDown.style.left = `${button.offsetLeft}px`;\n setPositionIsCalculated(true);\n }\n }, [dropDownRef, buttonRef, showDropDown]);\n\n useEffect(() => {\n const button = buttonRef.current;\n if (button && showDropDown) {\n const handle = (event: MouseEvent) => {\n const target = event.target;\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target as Node)) {\n return;\n }\n }\n\n if (!button.contains(target as Node)) {\n setShowDropDown(false);\n }\n };\n document.addEventListener(\"click\", handle);\n return () => {\n document.removeEventListener(\"click\", handle);\n };\n }\n return;\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);\n\n const displayContainer = useMemo(() => {\n // To prevent blinking, we show the container only when the dropdown position is calculated.\n // Without this, window would be visible first on left (0px), and after a millisecond on the right side.\n return positionIsCalculated ? { display: \"block\" } : { display: \"none\" };\n }, [positionIsCalculated]);\n\n return (\n <>\n <button\n style={{ position: \"relative\" }}\n disabled={disabled}\n aria-label={buttonAriaLabel || buttonLabel}\n className={buttonClassName}\n onClick={() => setShowDropDown(!showDropDown)}\n ref={buttonRef}\n >\n {buttonIconClassName && <span className={buttonIconClassName} />}\n {buttonLabel && <span className=\"text dropdown-button-text\">{buttonLabel}</span>}\n <i className=\"chevron-down\" />\n </button>\n {showDropDown && (\n <div className={\"lexical-dropdown-container\"} style={displayContainer}>\n <DropDownItems\n showScroll={showScroll}\n dropDownRef={dropDownRef}\n onClose={handleClose}\n >\n {children}\n </DropDownItems>\n </div>\n )}\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","DropDownContext","createContext","DropDownItem","children","className","onClick","title","ref","dropDownContext","useContext","Error","registerItem","current","createElement","type","DropDownItems","dropDownRef","showScroll","onClose","items","setItems","highlightedItem","setHighlightedItem","itemRef","prev","handleKeyDown","event","key","includes","preventDefault","index","indexOf","length","contextValue","focus","Provider","value","onKeyDown","DropDown","disabled","buttonLabel","buttonAriaLabel","buttonClassName","buttonIconClassName","stopCloseOnClickSelf","buttonRef","positionIsCalculated","setPositionIsCalculated","showDropDown","setShowDropDown","handleClose","button","dropDown","style","top","left","offsetLeft","handle","target","contains","document","addEventListener","removeEventListener","displayContainer","display","Fragment","position"],"sources":["DropDown.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 */\n\nimport type { ReactNode, RefObject } from \"react\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype DropDownContextType = {\n registerItem: (ref: React.RefObject<HTMLButtonElement>) => void;\n};\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null);\n\nexport function DropDownItem({\n children,\n className,\n onClick,\n title\n}: {\n children: React.ReactNode;\n className: string;\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n title?: string;\n}) {\n const ref = useRef<HTMLButtonElement>(null);\n\n const dropDownContext = React.useContext(DropDownContext);\n\n if (dropDownContext === null) {\n throw new Error(\"DropDownItem must be used within a DropDown\");\n }\n\n const { registerItem } = dropDownContext;\n\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n registerItem(ref as RefObject<HTMLButtonElement>);\n }, [ref, registerItem]);\n\n return (\n <button className={className} onClick={onClick} ref={ref} title={title} type=\"button\">\n {children}\n </button>\n );\n}\n\nfunction DropDownItems({\n children,\n dropDownRef,\n showScroll = true,\n onClose\n}: {\n children: React.ReactNode;\n dropDownRef?: React.Ref<HTMLDivElement>;\n showScroll?: boolean;\n onClose: () => void;\n}) {\n const [items, setItems] = useState<React.RefObject<HTMLButtonElement>[]>();\n const [highlightedItem, setHighlightedItem] = useState<React.RefObject<HTMLButtonElement>>();\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement>) => {\n setItems(prev => (prev ? [...prev, itemRef] : [itemRef]));\n },\n [setItems]\n );\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!items) {\n return;\n }\n\n const key = event.key;\n\n if ([\"Escape\", \"ArrowUp\", \"ArrowDown\", \"Tab\"].includes(key)) {\n event.preventDefault();\n }\n\n if (key === \"Escape\" || key === \"Tab\") {\n onClose();\n } else if (key === \"ArrowUp\") {\n setHighlightedItem(prev => {\n if (!prev) {\n return items[0];\n }\n const index = items.indexOf(prev) - 1;\n return items[index === -1 ? items.length - 1 : index];\n });\n } else if (key === \"ArrowDown\") {\n setHighlightedItem(prev => {\n if (!prev) {\n return items[0];\n }\n return items[items.indexOf(prev) + 1];\n });\n }\n };\n\n const contextValue = useMemo(\n () => ({\n registerItem\n }),\n [registerItem]\n );\n\n useEffect(() => {\n if (items && !highlightedItem) {\n setHighlightedItem(items[0]);\n }\n\n if (highlightedItem && highlightedItem.current) {\n highlightedItem.current.focus();\n }\n }, [items, highlightedItem]);\n\n return (\n <DropDownContext.Provider value={contextValue}>\n <div\n className={`lexical-dropdown ${showScroll ? \"\" : \"no-scroll\"}`}\n ref={dropDownRef}\n onKeyDown={handleKeyDown}\n >\n {children}\n </div>\n </DropDownContext.Provider>\n );\n}\n\nexport function DropDown({\n disabled = false,\n buttonLabel,\n buttonAriaLabel,\n buttonClassName,\n buttonIconClassName,\n children,\n stopCloseOnClickSelf,\n showScroll = true\n}: {\n disabled?: boolean;\n buttonAriaLabel?: string;\n buttonClassName: string;\n buttonIconClassName?: string;\n buttonLabel?: string;\n children: ReactNode;\n stopCloseOnClickSelf?: boolean;\n showScroll?: boolean;\n}): JSX.Element {\n const dropDownRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n // Used to prevent flickering of the dropdown while calculating the dropdown position.\n const [positionIsCalculated, setPositionIsCalculated] = useState(false);\n const [showDropDown, setShowDropDown] = useState(false);\n\n const handleClose = () => {\n setPositionIsCalculated(false);\n setShowDropDown(false);\n if (buttonRef && buttonRef.current) {\n buttonRef.current.focus();\n }\n };\n\n useEffect(() => {\n const button = buttonRef.current;\n const dropDown = dropDownRef.current;\n\n if (showDropDown && button && dropDown) {\n dropDown.style.top = \"44px\";\n dropDown.style.left = `${button.offsetLeft}px`;\n setPositionIsCalculated(true);\n }\n }, [dropDownRef, buttonRef, showDropDown]);\n\n useEffect(() => {\n const button = buttonRef.current;\n if (button && showDropDown) {\n const handle = (event: MouseEvent) => {\n const target = event.target;\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target as Node)) {\n return;\n }\n }\n\n if (!button.contains(target as Node)) {\n setShowDropDown(false);\n }\n };\n document.addEventListener(\"click\", handle);\n return () => {\n document.removeEventListener(\"click\", handle);\n };\n }\n return;\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);\n\n const displayContainer = useMemo(() => {\n // To prevent blinking, we show the container only when the dropdown position is calculated.\n // Without this, window would be visible first on left (0px), and after a millisecond on the right side.\n return positionIsCalculated ? { display: \"block\" } : { display: \"none\" };\n }, [positionIsCalculated]);\n\n return (\n <>\n <button\n style={{ position: \"relative\" }}\n disabled={disabled}\n aria-label={buttonAriaLabel || buttonLabel}\n className={buttonClassName}\n onClick={() => setShowDropDown(!showDropDown)}\n ref={buttonRef}\n >\n {buttonIconClassName && <span className={buttonIconClassName} />}\n {buttonLabel && <span className=\"text dropdown-button-text\">{buttonLabel}</span>}\n <i className=\"chevron-down\" />\n </button>\n {showDropDown && (\n <div className={\"lexical-dropdown-container\"} style={displayContainer}>\n <DropDownItems\n showScroll={showScroll}\n dropDownRef={dropDownRef}\n onClose={handleClose}\n >\n {children}\n </DropDownItems>\n </div>\n )}\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
package/ui/ImageResizer.d.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
/// <reference types="react" />
|
|
9
8
|
import type { LexicalEditor } from "lexical";
|
|
10
9
|
export declare function ImageResizer({ onResizeStart, onResizeEnd, buttonRef, imageRef, maxWidth, editor, showCaption, setShowCaption, captionsEnabled }: {
|
|
11
10
|
editor: LexicalEditor;
|
package/ui/ImageResizer.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.ImageResizer = ImageResizer;
|
|
8
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
-
var React = _react;
|
|
10
1
|
/**
|
|
11
2
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
12
3
|
*
|
|
@@ -15,31 +6,34 @@ var React = _react;
|
|
|
15
6
|
*
|
|
16
7
|
*/
|
|
17
8
|
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { useRef } from "react";
|
|
18
11
|
function clamp(value, min, max) {
|
|
19
12
|
return Math.min(Math.max(value, min), max);
|
|
20
13
|
}
|
|
21
|
-
|
|
14
|
+
const Direction = {
|
|
22
15
|
east: 1 << 0,
|
|
23
16
|
north: 1 << 3,
|
|
24
17
|
south: 1 << 1,
|
|
25
18
|
west: 1 << 2
|
|
26
19
|
};
|
|
27
|
-
function ImageResizer(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
20
|
+
export function ImageResizer({
|
|
21
|
+
onResizeStart,
|
|
22
|
+
onResizeEnd,
|
|
23
|
+
buttonRef,
|
|
24
|
+
imageRef,
|
|
25
|
+
maxWidth,
|
|
26
|
+
editor,
|
|
27
|
+
showCaption,
|
|
28
|
+
setShowCaption,
|
|
29
|
+
captionsEnabled
|
|
30
|
+
}) {
|
|
31
|
+
const controlWrapperRef = useRef(null);
|
|
32
|
+
const userSelect = useRef({
|
|
39
33
|
priority: "",
|
|
40
34
|
value: "default"
|
|
41
35
|
});
|
|
42
|
-
|
|
36
|
+
const positioningRef = useRef({
|
|
43
37
|
currentHeight: 0,
|
|
44
38
|
currentWidth: 0,
|
|
45
39
|
direction: 0,
|
|
@@ -50,28 +44,28 @@ function ImageResizer(_ref) {
|
|
|
50
44
|
startX: 0,
|
|
51
45
|
startY: 0
|
|
52
46
|
});
|
|
53
|
-
|
|
47
|
+
const editorRootElement = editor.getRootElement();
|
|
54
48
|
// Find max width, accounting for editor padding.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
const maxWidthContainer = maxWidth ? maxWidth : editorRootElement !== null ? editorRootElement.getBoundingClientRect().width - 20 : 100;
|
|
50
|
+
const maxHeightContainer = editorRootElement !== null ? editorRootElement.getBoundingClientRect().height - 20 : 100;
|
|
51
|
+
const minWidth = 100;
|
|
52
|
+
const minHeight = 100;
|
|
53
|
+
const setStartCursor = direction => {
|
|
54
|
+
const ew = direction === Direction.east || direction === Direction.west;
|
|
55
|
+
const ns = direction === Direction.north || direction === Direction.south;
|
|
56
|
+
const nwse = direction & Direction.north && direction & Direction.west || direction & Direction.south && direction & Direction.east;
|
|
57
|
+
const cursorDir = ew ? "ew" : ns ? "ns" : nwse ? "nwse" : "nesw";
|
|
64
58
|
if (editorRootElement !== null) {
|
|
65
|
-
editorRootElement.style.setProperty("cursor",
|
|
59
|
+
editorRootElement.style.setProperty("cursor", `${cursorDir}-resize`, "important");
|
|
66
60
|
}
|
|
67
61
|
if (document.body !== null) {
|
|
68
|
-
document.body.style.setProperty("cursor",
|
|
62
|
+
document.body.style.setProperty("cursor", `${cursorDir}-resize`, "important");
|
|
69
63
|
userSelect.current.value = document.body.style.getPropertyValue("-webkit-user-select");
|
|
70
64
|
userSelect.current.priority = document.body.style.getPropertyPriority("-webkit-user-select");
|
|
71
|
-
document.body.style.setProperty("-webkit-user-select",
|
|
65
|
+
document.body.style.setProperty("-webkit-user-select", `none`, "important");
|
|
72
66
|
}
|
|
73
67
|
};
|
|
74
|
-
|
|
68
|
+
const setEndCursor = () => {
|
|
75
69
|
if (editorRootElement !== null) {
|
|
76
70
|
editorRootElement.style.setProperty("cursor", "text");
|
|
77
71
|
}
|
|
@@ -80,17 +74,18 @@ function ImageResizer(_ref) {
|
|
|
80
74
|
document.body.style.setProperty("-webkit-user-select", userSelect.current.value, userSelect.current.priority);
|
|
81
75
|
}
|
|
82
76
|
};
|
|
83
|
-
|
|
77
|
+
const handlePointerDown = (event, direction) => {
|
|
84
78
|
if (!editor.isEditable()) {
|
|
85
79
|
return;
|
|
86
80
|
}
|
|
87
|
-
|
|
88
|
-
|
|
81
|
+
const image = imageRef.current;
|
|
82
|
+
const controlWrapper = controlWrapperRef.current;
|
|
89
83
|
if (image !== null && controlWrapper !== null) {
|
|
90
|
-
|
|
91
|
-
width
|
|
92
|
-
height
|
|
93
|
-
|
|
84
|
+
const {
|
|
85
|
+
width,
|
|
86
|
+
height
|
|
87
|
+
} = image.getBoundingClientRect();
|
|
88
|
+
const positioning = positioningRef.current;
|
|
94
89
|
positioning.startWidth = width;
|
|
95
90
|
positioning.startHeight = height;
|
|
96
91
|
positioning.ratio = width / height;
|
|
@@ -103,50 +98,50 @@ function ImageResizer(_ref) {
|
|
|
103
98
|
setStartCursor(direction);
|
|
104
99
|
onResizeStart();
|
|
105
100
|
controlWrapper.classList.add("image-control-wrapper--resizing");
|
|
106
|
-
image.style.height =
|
|
107
|
-
image.style.width =
|
|
101
|
+
image.style.height = `${height}px`;
|
|
102
|
+
image.style.width = `${width}px`;
|
|
108
103
|
document.addEventListener("pointermove", handlePointerMove);
|
|
109
|
-
document.addEventListener("pointerup",
|
|
104
|
+
document.addEventListener("pointerup", handlePointerUp);
|
|
110
105
|
}
|
|
111
106
|
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
107
|
+
const handlePointerMove = event => {
|
|
108
|
+
const image = imageRef.current;
|
|
109
|
+
const positioning = positioningRef.current;
|
|
110
|
+
const isHorizontal = positioning.direction & (Direction.east | Direction.west);
|
|
111
|
+
const isVertical = positioning.direction & (Direction.south | Direction.north);
|
|
117
112
|
if (image !== null && positioning.isResizing) {
|
|
118
113
|
// Corner cursor
|
|
119
114
|
if (isHorizontal && isVertical) {
|
|
120
|
-
|
|
115
|
+
let diff = Math.floor(positioning.startX - event.clientX);
|
|
121
116
|
diff = positioning.direction & Direction.east ? -diff : diff;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
image.style.width =
|
|
125
|
-
image.style.height =
|
|
117
|
+
const width = clamp(positioning.startWidth + diff, minWidth, maxWidthContainer);
|
|
118
|
+
const height = width / positioning.ratio;
|
|
119
|
+
image.style.width = `${width}px`;
|
|
120
|
+
image.style.height = `${height}px`;
|
|
126
121
|
positioning.currentHeight = height;
|
|
127
122
|
positioning.currentWidth = width;
|
|
128
123
|
} else if (isVertical) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
image.style.height =
|
|
133
|
-
positioning.currentHeight =
|
|
124
|
+
let diff = Math.floor(positioning.startY - event.clientY);
|
|
125
|
+
diff = positioning.direction & Direction.south ? -diff : diff;
|
|
126
|
+
const height = clamp(positioning.startHeight + diff, minHeight, maxHeightContainer);
|
|
127
|
+
image.style.height = `${height}px`;
|
|
128
|
+
positioning.currentHeight = height;
|
|
134
129
|
} else {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
image.style.width =
|
|
139
|
-
positioning.currentWidth =
|
|
130
|
+
let diff = Math.floor(positioning.startX - event.clientX);
|
|
131
|
+
diff = positioning.direction & Direction.east ? -diff : diff;
|
|
132
|
+
const width = clamp(positioning.startWidth + diff, minWidth, maxWidthContainer);
|
|
133
|
+
image.style.width = `${width}px`;
|
|
134
|
+
positioning.currentWidth = width;
|
|
140
135
|
}
|
|
141
136
|
}
|
|
142
137
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
138
|
+
const handlePointerUp = () => {
|
|
139
|
+
const image = imageRef.current;
|
|
140
|
+
const positioning = positioningRef.current;
|
|
141
|
+
const controlWrapper = controlWrapperRef.current;
|
|
147
142
|
if (image !== null && controlWrapper !== null && positioning.isResizing) {
|
|
148
|
-
|
|
149
|
-
|
|
143
|
+
const width = positioning.currentWidth;
|
|
144
|
+
const height = positioning.currentHeight;
|
|
150
145
|
positioning.startWidth = 0;
|
|
151
146
|
positioning.startHeight = 0;
|
|
152
147
|
positioning.ratio = 0;
|
|
@@ -159,7 +154,7 @@ function ImageResizer(_ref) {
|
|
|
159
154
|
setEndCursor();
|
|
160
155
|
onResizeEnd(width, height);
|
|
161
156
|
document.removeEventListener("pointermove", handlePointerMove);
|
|
162
|
-
document.removeEventListener("pointerup",
|
|
157
|
+
document.removeEventListener("pointerup", handlePointerUp);
|
|
163
158
|
}
|
|
164
159
|
};
|
|
165
160
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -167,47 +162,47 @@ function ImageResizer(_ref) {
|
|
|
167
162
|
}, !showCaption && captionsEnabled && /*#__PURE__*/React.createElement("button", {
|
|
168
163
|
className: "image-caption-button",
|
|
169
164
|
ref: buttonRef,
|
|
170
|
-
onClick:
|
|
165
|
+
onClick: () => {
|
|
171
166
|
setShowCaption(!showCaption);
|
|
172
167
|
}
|
|
173
168
|
}, "Add Caption"), /*#__PURE__*/React.createElement("div", {
|
|
174
169
|
className: "image-resizer image-resizer-n",
|
|
175
|
-
onPointerDown:
|
|
170
|
+
onPointerDown: event => {
|
|
176
171
|
handlePointerDown(event, Direction.north);
|
|
177
172
|
}
|
|
178
173
|
}), /*#__PURE__*/React.createElement("div", {
|
|
179
174
|
className: "image-resizer image-resizer-ne",
|
|
180
|
-
onPointerDown:
|
|
175
|
+
onPointerDown: event => {
|
|
181
176
|
handlePointerDown(event, Direction.north | Direction.east);
|
|
182
177
|
}
|
|
183
178
|
}), /*#__PURE__*/React.createElement("div", {
|
|
184
179
|
className: "image-resizer image-resizer-e",
|
|
185
|
-
onPointerDown:
|
|
180
|
+
onPointerDown: event => {
|
|
186
181
|
handlePointerDown(event, Direction.east);
|
|
187
182
|
}
|
|
188
183
|
}), /*#__PURE__*/React.createElement("div", {
|
|
189
184
|
className: "image-resizer image-resizer-se",
|
|
190
|
-
onPointerDown:
|
|
185
|
+
onPointerDown: event => {
|
|
191
186
|
handlePointerDown(event, Direction.south | Direction.east);
|
|
192
187
|
}
|
|
193
188
|
}), /*#__PURE__*/React.createElement("div", {
|
|
194
189
|
className: "image-resizer image-resizer-s",
|
|
195
|
-
onPointerDown:
|
|
190
|
+
onPointerDown: event => {
|
|
196
191
|
handlePointerDown(event, Direction.south);
|
|
197
192
|
}
|
|
198
193
|
}), /*#__PURE__*/React.createElement("div", {
|
|
199
194
|
className: "image-resizer image-resizer-sw",
|
|
200
|
-
onPointerDown:
|
|
195
|
+
onPointerDown: event => {
|
|
201
196
|
handlePointerDown(event, Direction.south | Direction.west);
|
|
202
197
|
}
|
|
203
198
|
}), /*#__PURE__*/React.createElement("div", {
|
|
204
199
|
className: "image-resizer image-resizer-w",
|
|
205
|
-
onPointerDown:
|
|
200
|
+
onPointerDown: event => {
|
|
206
201
|
handlePointerDown(event, Direction.west);
|
|
207
202
|
}
|
|
208
203
|
}), /*#__PURE__*/React.createElement("div", {
|
|
209
204
|
className: "image-resizer image-resizer-nw",
|
|
210
|
-
onPointerDown:
|
|
205
|
+
onPointerDown: event => {
|
|
211
206
|
handlePointerDown(event, Direction.north | Direction.west);
|
|
212
207
|
}
|
|
213
208
|
}));
|