@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.
Files changed (53) hide show
  1. package/lib/components/app/index.d.ts.map +1 -1
  2. package/lib/components/app/index.js +16 -20
  3. package/lib/components/feedback-popup/index.d.ts.map +1 -1
  4. package/lib/components/feedback-popup/index.js +1 -1
  5. package/lib/components/main-canvas/image-context-menu.d.ts +13 -0
  6. package/lib/components/main-canvas/image-context-menu.d.ts.map +1 -0
  7. package/lib/components/main-canvas/image-context-menu.js +108 -0
  8. package/lib/components/main-canvas/index.d.ts.map +1 -1
  9. package/lib/components/main-canvas/index.js +84 -3
  10. package/lib/components/tabs/index.d.ts.map +1 -1
  11. package/lib/components/tabs/index.js +51 -80
  12. package/lib/components/tabs/nav-items.d.ts +6 -0
  13. package/lib/components/tabs/nav-items.d.ts.map +1 -0
  14. package/lib/components/tabs/nav-items.js +19 -0
  15. package/lib/components/tabs/tab-nav-link.d.ts +5 -0
  16. package/lib/components/tabs/tab-nav-link.d.ts.map +1 -0
  17. package/lib/components/tabs/tab-nav-link.js +27 -0
  18. package/lib/components/tools/image/image-options.d.ts.map +1 -1
  19. package/lib/components/tools/image/image-options.js +2 -1
  20. package/lib/components/tools/watermark/watermark.d.ts.map +1 -1
  21. package/lib/components/tools/watermark/watermark.js +5 -2
  22. package/lib/components/tools-bar/tools-bar-item-button.d.ts.map +1 -1
  23. package/lib/components/tools-bar/tools-bar-item-button.js +6 -2
  24. package/lib/context/default-config.d.ts.map +1 -1
  25. package/lib/context/default-config.js +3 -1
  26. package/lib/context/default-translations.d.ts.map +1 -1
  27. package/lib/context/default-translations.js +61 -29
  28. package/lib/hooks/index.d.ts +1 -0
  29. package/lib/hooks/index.d.ts.map +1 -1
  30. package/lib/hooks/index.js +2 -1
  31. package/lib/hooks/use-feedback-handler.d.ts +11 -0
  32. package/lib/hooks/use-feedback-handler.d.ts.map +1 -0
  33. package/lib/hooks/use-feedback-handler.js +43 -0
  34. package/lib/hooks/use-image-editor-actions.d.ts.map +1 -1
  35. package/lib/hooks/use-image-editor-actions.js +6 -11
  36. package/lib/hooks/use-transformed-img-data.d.ts +1 -1
  37. package/lib/hooks/use-transformed-img-data.d.ts.map +1 -1
  38. package/lib/hooks/use-transformed-img-data.js +6 -3
  39. package/lib/types/actions.d.ts +1 -0
  40. package/lib/types/actions.d.ts.map +1 -1
  41. package/lib/types/annotations.d.ts +1 -0
  42. package/lib/types/annotations.d.ts.map +1 -1
  43. package/lib/types/config.d.ts +4 -0
  44. package/lib/types/config.d.ts.map +1 -1
  45. package/lib/types/state.d.ts +1 -1
  46. package/lib/types/state.d.ts.map +1 -1
  47. package/lib/utils/constants.d.ts +2 -0
  48. package/lib/utils/constants.d.ts.map +1 -1
  49. package/lib/utils/constants.js +2 -0
  50. package/lib/utils/file.d.ts +4 -0
  51. package/lib/utils/file.d.ts.map +1 -0
  52. package/lib/utils/file.js +110 -0
  53. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/app/index.tsx"],"names":[],"mappings":";AAubA,wBAAyB"}
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, SET_FEEDBACK, SET_ORIGINAL_IMAGE, SET_SHOWN_TABS_MENU, SHOW_LOADER, UPDATE_STATE } from "../../actions";
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"](setError)["finally"](triggerResolve);
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
- setError(t('invalidImageError'));
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(--s-palette-background-default, var(--working-background))',
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;AAkBlE,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED,QAAA,MAAM,aAAa,GAAI,mBAEpB,kBAAkB,mDA+BpB,CAAC;AAEF,eAAe,aAAa,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":"AAaA,QAAA,MAAM,UAAU,+CA+Gf,CAAC;AAEF,eAAe,UAAU,CAAC"}
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 { useCallback, useEffect, useRef } from 'react';
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":"AAmBA,UAAU,SAAS;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,QAAA,MAAM,IAAI,GAAI,oBAAoB,SAAS,mDAiM1C,CAAC;AAEF,eAAe,IAAI,CAAC"}
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, ListItem, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material';
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' : '0',
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: _jsx(Box, {
126
+ children: _jsxs(Box, {
118
127
  sx: {
119
- p: '8px',
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
- if (!open) {
127
- return _jsx(SIconButton, {
128
- onClick: function onClick() {
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
- children: _jsxs(ListItemButton, {
162
- selected: isActive,
163
- onClick: function onClick() {
164
- return selectTab(tab.id);
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
- py: 0.75,
168
- px: 1.5,
169
- gap: 1.5,
170
- borderRadius: 1,
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,+CAuLjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
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,+CAmQd,CAAC;AAEF,eAAe,SAAS,CAAC"}
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"}