@solostylist/image-editor 1.0.20 → 1.0.22
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/lib/components/app/index.d.ts.map +1 -1
- package/lib/components/app/index.js +16 -20
- package/lib/components/feedback-popup/index.d.ts.map +1 -1
- package/lib/components/feedback-popup/index.js +1 -1
- package/lib/components/main-canvas/image-context-menu.d.ts +13 -0
- package/lib/components/main-canvas/image-context-menu.d.ts.map +1 -0
- package/lib/components/main-canvas/image-context-menu.js +108 -0
- package/lib/components/main-canvas/index.d.ts.map +1 -1
- package/lib/components/main-canvas/index.js +84 -3
- package/lib/components/tabs/index.d.ts.map +1 -1
- package/lib/components/tabs/index.js +51 -80
- package/lib/components/tabs/nav-items.d.ts +6 -0
- package/lib/components/tabs/nav-items.d.ts.map +1 -0
- package/lib/components/tabs/nav-items.js +19 -0
- package/lib/components/tabs/tab-nav-link.d.ts +5 -0
- package/lib/components/tabs/tab-nav-link.d.ts.map +1 -0
- package/lib/components/tabs/tab-nav-link.js +27 -0
- package/lib/components/tools/image/image-options.d.ts.map +1 -1
- package/lib/components/tools/image/image-options.js +2 -1
- package/lib/components/tools/watermark/watermark.d.ts.map +1 -1
- package/lib/components/tools/watermark/watermark.js +5 -2
- package/lib/components/tools-bar/tools-bar-item-button.d.ts.map +1 -1
- package/lib/components/tools-bar/tools-bar-item-button.js +6 -2
- package/lib/context/default-config.d.ts.map +1 -1
- package/lib/context/default-config.js +3 -1
- package/lib/context/default-translations.d.ts.map +1 -1
- package/lib/context/default-translations.js +61 -29
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +2 -1
- package/lib/hooks/use-feedback-handler.d.ts +11 -0
- package/lib/hooks/use-feedback-handler.d.ts.map +1 -0
- package/lib/hooks/use-feedback-handler.js +43 -0
- package/lib/hooks/use-image-editor-actions.d.ts.map +1 -1
- package/lib/hooks/use-image-editor-actions.js +6 -11
- package/lib/hooks/use-transformed-img-data.d.ts +1 -1
- package/lib/hooks/use-transformed-img-data.d.ts.map +1 -1
- package/lib/hooks/use-transformed-img-data.js +6 -3
- package/lib/types/actions.d.ts +1 -0
- package/lib/types/actions.d.ts.map +1 -1
- package/lib/types/annotations.d.ts +1 -0
- package/lib/types/annotations.d.ts.map +1 -1
- package/lib/types/config.d.ts +4 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/state.d.ts +1 -1
- package/lib/types/state.d.ts.map +1 -1
- package/lib/utils/constants.d.ts +2 -0
- package/lib/utils/constants.d.ts.map +1 -1
- package/lib/utils/constants.js +2 -0
- package/lib/utils/file.d.ts +4 -0
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +110 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/app/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/app/index.tsx"],"names":[],"mappings":";AA8aA,wBAAyB"}
|
|
@@ -9,14 +9,14 @@ import { SFlexBox } from '@solostylist/ui-kit/s-flex-box';
|
|
|
9
9
|
import SFileDropzone from '@solostylist/ui-kit/s-file-dropzone';
|
|
10
10
|
import { memo, useCallback, useEffect, useRef, useState } from 'react';
|
|
11
11
|
import { Box, CircularProgress } from '@mui/material';
|
|
12
|
-
import { HIDE_LOADER, RESET,
|
|
12
|
+
import { HIDE_LOADER, RESET, SET_ORIGINAL_IMAGE, SET_SHOWN_TABS_MENU, SHOW_LOADER, UPDATE_STATE } from "../../actions";
|
|
13
13
|
import FeedbackPopup from "../feedback-popup";
|
|
14
14
|
import MainCanvas from "../main-canvas";
|
|
15
15
|
import Tabs from "../tabs";
|
|
16
16
|
import STabsDrawer from "../tabs-drawer";
|
|
17
17
|
import ToolsBar from "../tools-bar";
|
|
18
18
|
import Topbar from "../topbar";
|
|
19
|
-
import { usePhoneScreen, useResizeObserver, useStore, useTransformedImgData } from "../../hooks";
|
|
19
|
+
import { useFeedbackHandler, usePhoneScreen, useResizeObserver, useStore, useTransformedImgData } from "../../hooks";
|
|
20
20
|
import useUpdateEffect from "../../hooks/use-update-effect";
|
|
21
21
|
import { ROOT_CONTAINER_CLASS_NAME } from "../../utils/constants";
|
|
22
22
|
import filterStrToClass from "../../utils/filter-str-to-class";
|
|
@@ -47,7 +47,8 @@ var App = function App() {
|
|
|
47
47
|
toolbarHeight = config.toolbarHeight,
|
|
48
48
|
rootSx = config.rootSx,
|
|
49
49
|
rootClassName = config.rootClassName,
|
|
50
|
-
renderEmptyState = config.renderEmptyState
|
|
50
|
+
renderEmptyState = config.renderEmptyState,
|
|
51
|
+
dropzoneAccept = config.dropzoneAccept;
|
|
51
52
|
var showTabsDrawer = window.matchMedia('(max-width: 760px)').matches;
|
|
52
53
|
var _useResizeObserver = useResizeObserver(),
|
|
53
54
|
_useResizeObserver2 = _slicedToArray(_useResizeObserver, 2),
|
|
@@ -61,6 +62,8 @@ var App = function App() {
|
|
|
61
62
|
rootSize = _useState2[0],
|
|
62
63
|
setRootSize = _useState2[1];
|
|
63
64
|
var isPhoneScreen = usePhoneScreen();
|
|
65
|
+
var _useFeedbackHandler = useFeedbackHandler(),
|
|
66
|
+
handleError = _useFeedbackHandler.handleError;
|
|
64
67
|
var pluginRootRef = useRef(null);
|
|
65
68
|
var uploadInputRef = useRef(null);
|
|
66
69
|
var imageBeingLoadedSrc = useRef(null);
|
|
@@ -74,17 +77,6 @@ var App = function App() {
|
|
|
74
77
|
}
|
|
75
78
|
});
|
|
76
79
|
}, []);
|
|
77
|
-
var setError = useCallback(function (newError) {
|
|
78
|
-
dispatch({
|
|
79
|
-
type: SET_FEEDBACK,
|
|
80
|
-
payload: {
|
|
81
|
-
feedback: {
|
|
82
|
-
message: typeof newError === 'string' ? newError : newError.message,
|
|
83
|
-
duration: 0
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}, []);
|
|
88
80
|
var loadAndSetOriginalImage = function loadAndSetOriginalImage(imgToLoad) {
|
|
89
81
|
return new Promise(function (resolve) {
|
|
90
82
|
var imgSrc = imgToLoad instanceof HTMLImageElement ? imgToLoad === null || imgToLoad === void 0 ? void 0 : imgToLoad.src : imgToLoad;
|
|
@@ -105,7 +97,11 @@ var App = function App() {
|
|
|
105
97
|
imageBeingLoadedSrc.current = imgSrc;
|
|
106
98
|
setTimeout(function () {
|
|
107
99
|
if (typeof imgToLoad === 'string') {
|
|
108
|
-
loadImage(imgToLoad, defaultSavedImageName, noCrossOrigin).then(setNewOriginalImage)["catch"](
|
|
100
|
+
loadImage(imgToLoad, defaultSavedImageName, noCrossOrigin).then(setNewOriginalImage)["catch"](function (error) {
|
|
101
|
+
return handleError(error, t('invalidImageError'), {
|
|
102
|
+
persistent: true
|
|
103
|
+
});
|
|
104
|
+
})["finally"](triggerResolve);
|
|
109
105
|
} else if (imgToLoad instanceof HTMLImageElement) {
|
|
110
106
|
if (!imgToLoad.title && defaultSavedImageName) {
|
|
111
107
|
imgToLoad.title = defaultSavedImageName;
|
|
@@ -120,7 +116,9 @@ var App = function App() {
|
|
|
120
116
|
setNewOriginalImage(imgToLoad);
|
|
121
117
|
triggerResolve();
|
|
122
118
|
} else {
|
|
123
|
-
|
|
119
|
+
handleError(t('invalidImageError'), t('invalidImageError'), {
|
|
120
|
+
persistent: true
|
|
121
|
+
});
|
|
124
122
|
triggerResolve();
|
|
125
123
|
}
|
|
126
124
|
}, 0);
|
|
@@ -188,9 +186,7 @@ var App = function App() {
|
|
|
188
186
|
maxWidth: 600
|
|
189
187
|
},
|
|
190
188
|
children: _jsx(SFileDropzone, {
|
|
191
|
-
accept:
|
|
192
|
-
'image/*': []
|
|
193
|
-
},
|
|
189
|
+
accept: dropzoneAccept,
|
|
194
190
|
maxFiles: 1,
|
|
195
191
|
multiple: false,
|
|
196
192
|
onDrop: function onDrop(acceptedFiles) {
|
|
@@ -352,7 +348,7 @@ var App = function App() {
|
|
|
352
348
|
ref: pluginRootRef,
|
|
353
349
|
className: rootClassName ? "".concat(ROOT_CONTAINER_CLASS_NAME, " ").concat(rootClassName) : ROOT_CONTAINER_CLASS_NAME,
|
|
354
350
|
sx: _objectSpread({
|
|
355
|
-
backgroundColor: 'var(--
|
|
351
|
+
backgroundColor: 'var(--working-background, var(--s-palette-background-default))',
|
|
356
352
|
backgroundImage: 'radial-gradient(circle at 1px 1px, var(--s-palette-divider) 1px, transparent 0)',
|
|
357
353
|
backgroundSize: '12px 12px',
|
|
358
354
|
flexDirection: 'column',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback-popup/index.tsx"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback-popup/index.tsx"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAoBlE,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED,QAAA,MAAM,aAAa,GAAI,mBAEpB,kBAAkB,mDA+BpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -9,7 +9,7 @@ var defaultAnchorOrigin = {
|
|
|
9
9
|
horizontal: 'center',
|
|
10
10
|
vertical: 'bottom'
|
|
11
11
|
};
|
|
12
|
-
var ERROR_TO_SEVERITY = _defineProperty(_defineProperty({}, FEEDBACK_STATUSES.ERROR, 'error'), FEEDBACK_STATUSES.WARNING, 'warning');
|
|
12
|
+
var ERROR_TO_SEVERITY = _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, FEEDBACK_STATUSES.SUCCESS, 'success'), FEEDBACK_STATUSES.INFO, 'info'), FEEDBACK_STATUSES.ERROR, 'error'), FEEDBACK_STATUSES.WARNING, 'warning');
|
|
13
13
|
var FeedbackPopup = function FeedbackPopup(_ref) {
|
|
14
14
|
var _feedback$duration, _feedback$status;
|
|
15
15
|
var _ref$anchorOrigin = _ref.anchorOrigin,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ImageContextMenuProps {
|
|
2
|
+
anchorPosition: {
|
|
3
|
+
top: number;
|
|
4
|
+
left: number;
|
|
5
|
+
} | null;
|
|
6
|
+
isActionPending?: boolean;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
onCopy: () => void;
|
|
9
|
+
onDownload: () => void;
|
|
10
|
+
}
|
|
11
|
+
declare const ImageContextMenu: ({ anchorPosition, isActionPending, onClose, onCopy, onDownload, }: ImageContextMenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default ImageContextMenu;
|
|
13
|
+
//# sourceMappingURL=image-context-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-context-menu.d.ts","sourceRoot":"","sources":["../../../src/components/main-canvas/image-context-menu.tsx"],"names":[],"mappings":"AAMA,UAAU,qBAAqB;IAC7B,cAAc,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,QAAA,MAAM,gBAAgB,GAAI,mEAMvB,qBAAqB,4CAmGvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import ContentCopyOutlined from '@mui/icons-material/ContentCopyOutlined';
|
|
2
|
+
import DownloadOutlined from '@mui/icons-material/DownloadOutlined';
|
|
3
|
+
import { ListItemIcon, ListItemText, Menu, MenuItem } from '@mui/material';
|
|
4
|
+
import { useStore } from "../../hooks";
|
|
5
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
+
var ImageContextMenu = function ImageContextMenu(_ref) {
|
|
7
|
+
var anchorPosition = _ref.anchorPosition,
|
|
8
|
+
_ref$isActionPending = _ref.isActionPending,
|
|
9
|
+
isActionPending = _ref$isActionPending === void 0 ? false : _ref$isActionPending,
|
|
10
|
+
onClose = _ref.onClose,
|
|
11
|
+
onCopy = _ref.onCopy,
|
|
12
|
+
onDownload = _ref.onDownload;
|
|
13
|
+
var _useStore = useStore(),
|
|
14
|
+
t = _useStore.t;
|
|
15
|
+
return _jsxs(Menu, {
|
|
16
|
+
open: Boolean(anchorPosition),
|
|
17
|
+
onClose: onClose,
|
|
18
|
+
onContextMenu: function onContextMenu(event) {
|
|
19
|
+
return event.preventDefault();
|
|
20
|
+
},
|
|
21
|
+
anchorReference: "anchorPosition",
|
|
22
|
+
anchorPosition: anchorPosition !== null && anchorPosition !== void 0 ? anchorPosition : undefined,
|
|
23
|
+
slotProps: {
|
|
24
|
+
paper: {
|
|
25
|
+
sx: {
|
|
26
|
+
overflow: 'hidden',
|
|
27
|
+
borderRadius: 'var(--s-shape-borderRadius, 8px)',
|
|
28
|
+
border: '1px solid',
|
|
29
|
+
borderColor: 'divider',
|
|
30
|
+
backgroundColor: 'var(--s-palette-background-paper)',
|
|
31
|
+
boxShadow: 'var(--s-palette-baseShadow)',
|
|
32
|
+
mt: 0.5,
|
|
33
|
+
'& .MuiList-root': {
|
|
34
|
+
py: 0.5
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
children: [_jsxs(MenuItem, {
|
|
40
|
+
onClick: onCopy,
|
|
41
|
+
disabled: isActionPending,
|
|
42
|
+
sx: {
|
|
43
|
+
minHeight: 44,
|
|
44
|
+
px: 1.5,
|
|
45
|
+
py: 1,
|
|
46
|
+
gap: 1,
|
|
47
|
+
color: 'var(--s-palette-text-primary)',
|
|
48
|
+
'&:hover': {
|
|
49
|
+
backgroundColor: 'var(--s-palette-action-hover)'
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
children: [_jsx(ListItemIcon, {
|
|
53
|
+
sx: {
|
|
54
|
+
minWidth: 28,
|
|
55
|
+
color: 'var(--s-palette-text-primary)'
|
|
56
|
+
},
|
|
57
|
+
children: _jsx(ContentCopyOutlined, {
|
|
58
|
+
fontSize: "small"
|
|
59
|
+
})
|
|
60
|
+
}), _jsx(ListItemText, {
|
|
61
|
+
primary: t('copyImage'),
|
|
62
|
+
slotProps: {
|
|
63
|
+
primary: {
|
|
64
|
+
sx: {
|
|
65
|
+
fontSize: 14,
|
|
66
|
+
fontWeight: 500,
|
|
67
|
+
color: 'var(--s-palette-text-primary)'
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})]
|
|
72
|
+
}), _jsxs(MenuItem, {
|
|
73
|
+
onClick: onDownload,
|
|
74
|
+
disabled: isActionPending,
|
|
75
|
+
sx: {
|
|
76
|
+
minHeight: 44,
|
|
77
|
+
px: 1.5,
|
|
78
|
+
py: 1,
|
|
79
|
+
gap: 1,
|
|
80
|
+
color: 'var(--s-palette-text-primary)',
|
|
81
|
+
'&:hover': {
|
|
82
|
+
backgroundColor: 'var(--s-palette-action-hover)'
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
children: [_jsx(ListItemIcon, {
|
|
86
|
+
sx: {
|
|
87
|
+
minWidth: 28,
|
|
88
|
+
color: 'var(--s-palette-text-primary)'
|
|
89
|
+
},
|
|
90
|
+
children: _jsx(DownloadOutlined, {
|
|
91
|
+
fontSize: "small"
|
|
92
|
+
})
|
|
93
|
+
}), _jsx(ListItemText, {
|
|
94
|
+
primary: t('download'),
|
|
95
|
+
slotProps: {
|
|
96
|
+
primary: {
|
|
97
|
+
sx: {
|
|
98
|
+
fontSize: 14,
|
|
99
|
+
fontWeight: 500,
|
|
100
|
+
color: 'var(--s-palette-text-primary)'
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
})]
|
|
105
|
+
})]
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
export default ImageContextMenu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/main-canvas/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/main-canvas/index.tsx"],"names":[],"mappings":"AAeA,QAAA,MAAM,UAAU,+CAwMf,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -1,16 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
5
|
import { Box } from '@mui/material';
|
|
3
6
|
import { SET_CANVAS_SIZE } from "../../actions";
|
|
4
7
|
import { DesignLayer, TransformersLayer } from "../layers";
|
|
5
8
|
import NodeControls from "../node-controls";
|
|
6
9
|
import { AppProviderOverridenValue } from "../../context";
|
|
7
|
-
import { useStore } from "../../hooks";
|
|
10
|
+
import { useFeedbackHandler, useStore, useTransformedImgData } from "../../hooks";
|
|
11
|
+
import { copyImageDataToClipboard, downloadImageData } from "../../utils/file";
|
|
8
12
|
import CanvasNode from "./canvas-node";
|
|
13
|
+
import ImageContextMenu from "./image-context-menu";
|
|
9
14
|
import OriginalPreviewLayer from "./original-preview-layer";
|
|
10
15
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
16
|
var MainCanvas = function MainCanvas() {
|
|
12
17
|
var providedAppContext = useStore();
|
|
13
18
|
var canvasContainerRef = useRef(null);
|
|
19
|
+
var _useState = useState(null),
|
|
20
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
21
|
+
anchorPosition = _useState2[0],
|
|
22
|
+
setAnchorPosition = _useState2[1];
|
|
23
|
+
var _useState3 = useState(false),
|
|
24
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
25
|
+
isContextActionPending = _useState4[0],
|
|
26
|
+
setIsContextActionPending = _useState4[1];
|
|
27
|
+
var transformImgFn = useTransformedImgData();
|
|
28
|
+
var _useFeedbackHandler = useFeedbackHandler(),
|
|
29
|
+
handleError = _useFeedbackHandler.handleError,
|
|
30
|
+
handleSuccess = _useFeedbackHandler.handleSuccess;
|
|
14
31
|
var contextRef = useRef(providedAppContext);
|
|
15
32
|
useEffect(function () {
|
|
16
33
|
contextRef.current = providedAppContext;
|
|
@@ -55,7 +72,10 @@ var MainCanvas = function MainCanvas() {
|
|
|
55
72
|
cropTopOffset = _providedAppContext$c.cropTopOffset,
|
|
56
73
|
defaultToolId = _providedAppContext$c.defaultToolId,
|
|
57
74
|
toolId = providedAppContext.toolId,
|
|
58
|
-
originalImage = providedAppContext.originalImage
|
|
75
|
+
originalImage = providedAppContext.originalImage,
|
|
76
|
+
isLoadingGlobally = providedAppContext.isLoadingGlobally,
|
|
77
|
+
textIdOfEditableContent = providedAppContext.textIdOfEditableContent,
|
|
78
|
+
t = providedAppContext.t;
|
|
59
79
|
var lastToolIdRef = useRef(toolId !== null && toolId !== void 0 ? toolId : null);
|
|
60
80
|
useEffect(function () {
|
|
61
81
|
if (toolId) {
|
|
@@ -69,6 +89,60 @@ var MainCanvas = function MainCanvas() {
|
|
|
69
89
|
}
|
|
70
90
|
}, [originalImage, defaultToolId, toolId]);
|
|
71
91
|
var cropOffset = cropTopOffset !== null && cropTopOffset !== void 0 ? cropTopOffset : 56;
|
|
92
|
+
var handleCloseContextMenu = useCallback(function () {
|
|
93
|
+
setAnchorPosition(null);
|
|
94
|
+
}, []);
|
|
95
|
+
var handleCanvasContextMenu = useCallback(function (event) {
|
|
96
|
+
var target = event.target;
|
|
97
|
+
if (!originalImage || isLoadingGlobally || isContextActionPending || textIdOfEditableContent || target.tagName.toLowerCase() !== 'canvas') {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
setAnchorPosition({
|
|
102
|
+
top: event.clientY + 2,
|
|
103
|
+
left: event.clientX + 2
|
|
104
|
+
});
|
|
105
|
+
}, [isContextActionPending, isLoadingGlobally, originalImage, textIdOfEditableContent]);
|
|
106
|
+
var runContextAction = useCallback(function () {
|
|
107
|
+
var _ref3 = _asyncToGenerator(_regeneratorRuntime.mark(function _callee(action, successMessage, errorMessage) {
|
|
108
|
+
var transformedData, _t;
|
|
109
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
110
|
+
while (1) switch (_context.prev = _context.next) {
|
|
111
|
+
case 0:
|
|
112
|
+
handleCloseContextMenu();
|
|
113
|
+
setIsContextActionPending(true);
|
|
114
|
+
_context.prev = 1;
|
|
115
|
+
transformedData = transformImgFn(undefined, false, false, false);
|
|
116
|
+
_context.next = 2;
|
|
117
|
+
return action(transformedData.imageData);
|
|
118
|
+
case 2:
|
|
119
|
+
handleSuccess(successMessage);
|
|
120
|
+
_context.next = 4;
|
|
121
|
+
break;
|
|
122
|
+
case 3:
|
|
123
|
+
_context.prev = 3;
|
|
124
|
+
_t = _context["catch"](1);
|
|
125
|
+
handleError(_t, errorMessage);
|
|
126
|
+
case 4:
|
|
127
|
+
_context.prev = 4;
|
|
128
|
+
setIsContextActionPending(false);
|
|
129
|
+
return _context.finish(4);
|
|
130
|
+
case 5:
|
|
131
|
+
case "end":
|
|
132
|
+
return _context.stop();
|
|
133
|
+
}
|
|
134
|
+
}, _callee, null, [[1, 3, 4, 5]]);
|
|
135
|
+
}));
|
|
136
|
+
return function (_x, _x2, _x3) {
|
|
137
|
+
return _ref3.apply(this, arguments);
|
|
138
|
+
};
|
|
139
|
+
}(), [handleCloseContextMenu, handleError, handleSuccess, transformImgFn]);
|
|
140
|
+
var handleCopyImage = useCallback(function () {
|
|
141
|
+
void runContextAction(copyImageDataToClipboard, t('copySuccess'), t('copyFailed'));
|
|
142
|
+
}, [runContextAction, t]);
|
|
143
|
+
var handleDownloadImage = useCallback(function () {
|
|
144
|
+
void runContextAction(downloadImageData, t('downloadSuccess'), t('downloadFailed'));
|
|
145
|
+
}, [runContextAction, t]);
|
|
72
146
|
return _jsx(Box, {
|
|
73
147
|
height: canvasAreaHeight !== null && canvasAreaHeight !== void 0 ? canvasAreaHeight : '100%',
|
|
74
148
|
minHeight: 0,
|
|
@@ -84,6 +158,7 @@ var MainCanvas = function MainCanvas() {
|
|
|
84
158
|
position: "relative",
|
|
85
159
|
flexGrow: 1,
|
|
86
160
|
ref: canvasContainerRef,
|
|
161
|
+
onContextMenu: handleCanvasContextMenu,
|
|
87
162
|
width: '100%',
|
|
88
163
|
children: [!providedAppContext.textIdOfEditableContent && !providedAppContext.isShowOriginalImage && _jsx(NodeControls, {}), _jsx(CanvasNode, {
|
|
89
164
|
children: _jsx(AppProviderOverridenValue, {
|
|
@@ -92,6 +167,12 @@ var MainCanvas = function MainCanvas() {
|
|
|
92
167
|
children: [_jsx(DesignLayer, {}), _jsx(TransformersLayer, {})]
|
|
93
168
|
})
|
|
94
169
|
})
|
|
170
|
+
}), _jsx(ImageContextMenu, {
|
|
171
|
+
anchorPosition: anchorPosition,
|
|
172
|
+
isActionPending: isContextActionPending,
|
|
173
|
+
onClose: handleCloseContextMenu,
|
|
174
|
+
onCopy: handleCopyImage,
|
|
175
|
+
onDownload: handleDownloadImage
|
|
95
176
|
})]
|
|
96
177
|
})
|
|
97
178
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/index.tsx"],"names":[],"mappings":"AAeA,UAAU,SAAS;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,QAAA,MAAM,IAAI,GAAI,oBAAoB,SAAS,mDAkL1C,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -4,12 +4,15 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
|
|
|
4
4
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
5
|
import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
|
|
6
6
|
import ChevronRightIcon from '@mui/icons-material/ChevronRight';
|
|
7
|
-
import { Box,
|
|
7
|
+
import { Box, Typography } from '@mui/material';
|
|
8
8
|
import { SIconButton } from '@solostylist/ui-kit/s-icon-button';
|
|
9
|
+
import { SNavItems } from '@solostylist/ui-kit/s-nav-item';
|
|
9
10
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
10
11
|
import { SELECT_TAB } from "../../actions";
|
|
11
12
|
import { useStore } from "../../hooks";
|
|
12
13
|
import { AVAILABLE_TABS } from "./tabs.constants";
|
|
14
|
+
import { buildTabNavItems } from "./nav-items";
|
|
15
|
+
import { createTabNavLink } from "./tab-nav-link";
|
|
13
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
17
|
var Tabs = function Tabs(_ref) {
|
|
15
18
|
var toggleMainMenu = _ref.toggleMainMenu;
|
|
@@ -35,6 +38,9 @@ var Tabs = function Tabs(_ref) {
|
|
|
35
38
|
});
|
|
36
39
|
toggleMainMenu === null || toggleMainMenu === void 0 || toggleMainMenu(false);
|
|
37
40
|
}, [dispatch, toggleMainMenu]);
|
|
41
|
+
var TabNavLink = useMemo(function () {
|
|
42
|
+
return createTabNavLink(selectTab);
|
|
43
|
+
}, [selectTab]);
|
|
38
44
|
var chosenTabsConfig = useMemo(function () {
|
|
39
45
|
var tabs = [];
|
|
40
46
|
var tabsIdsArray = Array.isArray(tabsIds) ? tabsIds : Object.keys(tabsIds !== null && tabsIds !== void 0 ? tabsIds : {});
|
|
@@ -52,6 +58,9 @@ var Tabs = function Tabs(_ref) {
|
|
|
52
58
|
return Boolean(tab);
|
|
53
59
|
});
|
|
54
60
|
}, [tabsIds]);
|
|
61
|
+
var navItems = useMemo(function () {
|
|
62
|
+
return buildTabNavItems(chosenTabsConfig, t);
|
|
63
|
+
}, [chosenTabsConfig, t]);
|
|
55
64
|
useEffect(function () {
|
|
56
65
|
var width = open ? 240 : 64;
|
|
57
66
|
document.documentElement.style.setProperty('--s-image-editor-tabs-width', "".concat(width, "px"));
|
|
@@ -98,7 +107,7 @@ var Tabs = function Tabs(_ref) {
|
|
|
98
107
|
});
|
|
99
108
|
},
|
|
100
109
|
sx: {
|
|
101
|
-
marginLeft: open ? 'auto' :
|
|
110
|
+
marginLeft: open ? 'auto' : 0.5,
|
|
102
111
|
width: 32,
|
|
103
112
|
height: 32
|
|
104
113
|
},
|
|
@@ -114,94 +123,56 @@ var Tabs = function Tabs(_ref) {
|
|
|
114
123
|
overflowX: 'hidden',
|
|
115
124
|
flex: 1
|
|
116
125
|
},
|
|
117
|
-
children:
|
|
126
|
+
children: _jsxs(Box, {
|
|
118
127
|
sx: {
|
|
119
|
-
p:
|
|
128
|
+
p: 1,
|
|
120
129
|
display: 'flex',
|
|
121
130
|
flexDirection: 'column'
|
|
122
131
|
},
|
|
123
|
-
children: chosenTabsConfig.map(function (tab) {
|
|
132
|
+
children: [!open && chosenTabsConfig.map(function (tab) {
|
|
124
133
|
var Icon = tab.icon;
|
|
125
134
|
var isActive = currentTabId === tab.id;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return selectTab(tab.id);
|
|
130
|
-
},
|
|
131
|
-
tooltipOptions: {
|
|
132
|
-
title: t(tab.labelKey),
|
|
133
|
-
placement: 'right'
|
|
134
|
-
},
|
|
135
|
-
sx: _objectSpread(_objectSpread({
|
|
136
|
-
width: '40px',
|
|
137
|
-
height: '40px',
|
|
138
|
-
mb: '4px',
|
|
139
|
-
borderRadius: '8px',
|
|
140
|
-
color: isActive ? 'var(--s-palette-text-primary)' : 'var(--s-palette-text-secondary)'
|
|
141
|
-
}, isActive && {
|
|
142
|
-
bgcolor: 'var(--s-palette-action-selected)'
|
|
143
|
-
}), {}, {
|
|
144
|
-
'&:hover': {
|
|
145
|
-
bgcolor: isActive ? 'var(--s-palette-action-selected)' : 'var(--s-palette-action-hover)'
|
|
146
|
-
}
|
|
147
|
-
}),
|
|
148
|
-
children: _jsx(Icon, {
|
|
149
|
-
sx: {
|
|
150
|
-
fontSize: '18px',
|
|
151
|
-
color: 'inherit'
|
|
152
|
-
}
|
|
153
|
-
})
|
|
154
|
-
}, tab.id);
|
|
155
|
-
}
|
|
156
|
-
return _jsx(ListItem, {
|
|
157
|
-
disablePadding: true,
|
|
158
|
-
sx: {
|
|
159
|
-
mb: 0.5
|
|
135
|
+
return _jsx(SIconButton, {
|
|
136
|
+
onClick: function onClick() {
|
|
137
|
+
return selectTab(tab.id);
|
|
160
138
|
},
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
139
|
+
tooltipOptions: {
|
|
140
|
+
title: t(tab.labelKey),
|
|
141
|
+
placement: 'right'
|
|
142
|
+
},
|
|
143
|
+
sx: _objectSpread(_objectSpread({
|
|
144
|
+
width: '40px',
|
|
145
|
+
height: '40px',
|
|
146
|
+
minWidth: '40px',
|
|
147
|
+
minHeight: '40px',
|
|
148
|
+
mb: '4px',
|
|
149
|
+
mx: 'auto',
|
|
150
|
+
p: 0,
|
|
151
|
+
borderRadius: '8px',
|
|
152
|
+
display: 'flex',
|
|
153
|
+
alignItems: 'center',
|
|
154
|
+
justifyContent: 'center',
|
|
155
|
+
color: isActive ? 'var(--s-palette-text-primary)' : 'var(--s-palette-text-secondary)'
|
|
156
|
+
}, isActive && {
|
|
157
|
+
bgcolor: 'var(--s-palette-action-selected)'
|
|
158
|
+
}), {}, {
|
|
159
|
+
'&:hover': {
|
|
160
|
+
bgcolor: isActive ? 'var(--s-palette-action-selected)' : 'var(--s-palette-action-hover)'
|
|
161
|
+
}
|
|
162
|
+
}),
|
|
163
|
+
children: _jsx(Icon, {
|
|
166
164
|
sx: {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
minHeight: '40px',
|
|
172
|
-
backgroundColor: isActive ? 'var(--s-palette-action-selected) !important' : 'transparent',
|
|
173
|
-
color: isActive ? 'var(--s-palette-text-primary)' : 'var(--s-palette-text-secondary)',
|
|
174
|
-
'&:hover': {
|
|
175
|
-
bgcolor: isActive ? 'var(--s-palette-action-selected)' : 'var(--s-palette-action-hover)',
|
|
176
|
-
color: 'var(--s-palette-text-primary)'
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
children: [_jsx(ListItemIcon, {
|
|
180
|
-
sx: {
|
|
181
|
-
minWidth: 'auto',
|
|
182
|
-
color: 'inherit'
|
|
183
|
-
},
|
|
184
|
-
children: _jsx(Icon, {
|
|
185
|
-
sx: {
|
|
186
|
-
fontSize: '20px',
|
|
187
|
-
color: 'inherit'
|
|
188
|
-
}
|
|
189
|
-
})
|
|
190
|
-
}), _jsx(ListItemText, {
|
|
191
|
-
primary: _jsx(Typography, {
|
|
192
|
-
variant: "body2",
|
|
193
|
-
noWrap: true,
|
|
194
|
-
sx: {
|
|
195
|
-
color: 'inherit',
|
|
196
|
-
fontWeight: 500,
|
|
197
|
-
lineHeight: '28px'
|
|
198
|
-
},
|
|
199
|
-
children: t(tab.labelKey)
|
|
200
|
-
})
|
|
201
|
-
})]
|
|
165
|
+
fontSize: '18px',
|
|
166
|
+
color: 'inherit',
|
|
167
|
+
display: 'block'
|
|
168
|
+
}
|
|
202
169
|
})
|
|
203
170
|
}, tab.id);
|
|
204
|
-
})
|
|
171
|
+
}), open && _jsx(SNavItems, {
|
|
172
|
+
pathname: currentTabId,
|
|
173
|
+
items: navItems,
|
|
174
|
+
component: TabNavLink
|
|
175
|
+
})]
|
|
205
176
|
})
|
|
206
177
|
})]
|
|
207
178
|
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SNavItemConfig } from '@solostylist/ui-kit/s-nav-item';
|
|
2
|
+
import type { TabConfig } from './tabs.constants';
|
|
3
|
+
type TranslateFn = (key: string) => string;
|
|
4
|
+
export declare const buildTabNavItems: (tabs: TabConfig[], t: TranslateFn) => SNavItemConfig[];
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=nav-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-items.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/nav-items.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AAE3C,eAAO,MAAM,gBAAgB,GAC3B,MAAM,SAAS,EAAE,EACjB,GAAG,WAAW,KACb,cAAc,EAmBb,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export var buildTabNavItems = function buildTabNavItems(tabs, t) {
|
|
3
|
+
return tabs.map(function (tab) {
|
|
4
|
+
var Icon = tab.icon;
|
|
5
|
+
return {
|
|
6
|
+
key: tab.id,
|
|
7
|
+
title: t(tab.labelKey),
|
|
8
|
+
href: tab.id,
|
|
9
|
+
icon: function icon(active) {
|
|
10
|
+
return _jsx(Icon, {
|
|
11
|
+
sx: {
|
|
12
|
+
fontSize: '20px',
|
|
13
|
+
color: active ? 'var(--s-palette-text-primary)' : 'var(--s-palette-text-secondary)'
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AnchorHTMLAttributes } from 'react';
|
|
2
|
+
export declare const createTabNavLink: (onSelect: (href: string) => void) => import("react").ForwardRefExoticComponent<AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
3
|
+
onSelect?: (href: string) => void;
|
|
4
|
+
} & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
5
|
+
//# sourceMappingURL=tab-nav-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-nav-link.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/tab-nav-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAc,MAAM,OAAO,CAAC;AAMzD,eAAO,MAAM,gBAAgB,GAAI,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;eAHpD,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;qDA0BlC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
var _excluded = ["href", "onClick"];
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
+
import { forwardRef } from 'react';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
export var createTabNavLink = function createTabNavLink(onSelect) {
|
|
9
|
+
var Component = forwardRef(function TabNavLinkComponent(_ref, ref) {
|
|
10
|
+
var href = _ref.href,
|
|
11
|
+
_onClick = _ref.onClick,
|
|
12
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
13
|
+
return _jsx("a", _objectSpread(_objectSpread({}, props), {}, {
|
|
14
|
+
ref: ref,
|
|
15
|
+
href: href,
|
|
16
|
+
onClick: function onClick(event) {
|
|
17
|
+
event.preventDefault();
|
|
18
|
+
_onClick === null || _onClick === void 0 || _onClick(event);
|
|
19
|
+
if (href) {
|
|
20
|
+
onSelect(href);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
});
|
|
25
|
+
Component.displayName = 'TabNavLink';
|
|
26
|
+
return Component;
|
|
27
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-options.d.ts","sourceRoot":"","sources":["../../../../src/components/tools/image/image-options.tsx"],"names":[],"mappings":"AAgBA,QAAA,MAAM,YAAY,+
|
|
1
|
+
{"version":3,"file":"image-options.d.ts","sourceRoot":"","sources":["../../../../src/components/tools/image/image-options.tsx"],"names":[],"mappings":"AAgBA,QAAA,MAAM,YAAY,+CAwLjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -153,7 +153,8 @@ var ImageOptions = function ImageOptions() {
|
|
|
153
153
|
ref: uploadImgsInput,
|
|
154
154
|
onChange: isLoading ? undefined : importImages,
|
|
155
155
|
disabled: isLoading,
|
|
156
|
-
multiple: true
|
|
156
|
+
multiple: true,
|
|
157
|
+
accept: imageConfig.acceptedImageTypes
|
|
157
158
|
}), isGalleryEnabled && _jsx(ImagesGallery, {
|
|
158
159
|
gallery: imageConfig.gallery,
|
|
159
160
|
onSelect: importImgFromGallery,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watermark.d.ts","sourceRoot":"","sources":["../../../../src/components/tools/watermark/watermark.tsx"],"names":[],"mappings":"AAwBA,QAAA,MAAM,SAAS,+
|
|
1
|
+
{"version":3,"file":"watermark.d.ts","sourceRoot":"","sources":["../../../../src/components/tools/watermark/watermark.tsx"],"names":[],"mappings":"AAwBA,QAAA,MAAM,SAAS,+CAuQd,CAAC;AAEF,eAAe,SAAS,CAAC"}
|