@parameshdev/react-psh-image-editor-modal 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1224 @@
1
+ import React, { useRef, useState, useEffect } from 'react';
2
+
3
+ function _arrayLikeToArray(r, a) {
4
+ (null == a || a > r.length) && (a = r.length);
5
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
6
+ return n;
7
+ }
8
+ function _arrayWithHoles(r) {
9
+ if (Array.isArray(r)) return r;
10
+ }
11
+ function _arrayWithoutHoles(r) {
12
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
13
+ }
14
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
15
+ try {
16
+ var i = n[a](c),
17
+ u = i.value;
18
+ } catch (n) {
19
+ return void e(n);
20
+ }
21
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
22
+ }
23
+ function _asyncToGenerator(n) {
24
+ return function () {
25
+ var t = this,
26
+ e = arguments;
27
+ return new Promise(function (r, o) {
28
+ var a = n.apply(t, e);
29
+ function _next(n) {
30
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
31
+ }
32
+ function _throw(n) {
33
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
34
+ }
35
+ _next(void 0);
36
+ });
37
+ };
38
+ }
39
+ function _defineProperty(e, r, t) {
40
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
41
+ value: t,
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true
45
+ }) : e[r] = t, e;
46
+ }
47
+ function _iterableToArray(r) {
48
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
49
+ }
50
+ function _iterableToArrayLimit(r, l) {
51
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
52
+ if (null != t) {
53
+ var e,
54
+ n,
55
+ i,
56
+ u,
57
+ a = [],
58
+ f = true,
59
+ o = false;
60
+ try {
61
+ if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
62
+ } catch (r) {
63
+ o = true, n = r;
64
+ } finally {
65
+ try {
66
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
67
+ } finally {
68
+ if (o) throw n;
69
+ }
70
+ }
71
+ return a;
72
+ }
73
+ }
74
+ function _nonIterableRest() {
75
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
76
+ }
77
+ function _nonIterableSpread() {
78
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
79
+ }
80
+ function ownKeys(e, r) {
81
+ var t = Object.keys(e);
82
+ if (Object.getOwnPropertySymbols) {
83
+ var o = Object.getOwnPropertySymbols(e);
84
+ r && (o = o.filter(function (r) {
85
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
86
+ })), t.push.apply(t, o);
87
+ }
88
+ return t;
89
+ }
90
+ function _objectSpread2(e) {
91
+ for (var r = 1; r < arguments.length; r++) {
92
+ var t = null != arguments[r] ? arguments[r] : {};
93
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
94
+ _defineProperty(e, r, t[r]);
95
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
96
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
97
+ });
98
+ }
99
+ return e;
100
+ }
101
+ function _regenerator() {
102
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
103
+ var e,
104
+ t,
105
+ r = "function" == typeof Symbol ? Symbol : {},
106
+ n = r.iterator || "@@iterator",
107
+ o = r.toStringTag || "@@toStringTag";
108
+ function i(r, n, o, i) {
109
+ var c = n && n.prototype instanceof Generator ? n : Generator,
110
+ u = Object.create(c.prototype);
111
+ return _regeneratorDefine(u, "_invoke", function (r, n, o) {
112
+ var i,
113
+ c,
114
+ u,
115
+ f = 0,
116
+ p = o || [],
117
+ y = false,
118
+ G = {
119
+ p: 0,
120
+ n: 0,
121
+ v: e,
122
+ a: d,
123
+ f: d.bind(e, 4),
124
+ d: function (t, r) {
125
+ return i = t, c = 0, u = e, G.n = r, a;
126
+ }
127
+ };
128
+ function d(r, n) {
129
+ for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
130
+ var o,
131
+ i = p[t],
132
+ d = G.p,
133
+ l = i[2];
134
+ r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
135
+ }
136
+ if (o || r > 1) return a;
137
+ throw y = true, n;
138
+ }
139
+ return function (o, p, l) {
140
+ if (f > 1) throw TypeError("Generator is already running");
141
+ for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
142
+ i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
143
+ try {
144
+ if (f = 2, i) {
145
+ if (c || (o = "next"), t = i[o]) {
146
+ if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
147
+ if (!t.done) return t;
148
+ u = t.value, c < 2 && (c = 0);
149
+ } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
150
+ i = e;
151
+ } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
152
+ } catch (t) {
153
+ i = e, c = 1, u = t;
154
+ } finally {
155
+ f = 1;
156
+ }
157
+ }
158
+ return {
159
+ value: t,
160
+ done: y
161
+ };
162
+ };
163
+ }(r, o, i), true), u;
164
+ }
165
+ var a = {};
166
+ function Generator() {}
167
+ function GeneratorFunction() {}
168
+ function GeneratorFunctionPrototype() {}
169
+ t = Object.getPrototypeOf;
170
+ var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {
171
+ return this;
172
+ }), t),
173
+ u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
174
+ function f(e) {
175
+ return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
176
+ }
177
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine(u), _regeneratorDefine(u, o, "Generator"), _regeneratorDefine(u, n, function () {
178
+ return this;
179
+ }), _regeneratorDefine(u, "toString", function () {
180
+ return "[object Generator]";
181
+ }), (_regenerator = function () {
182
+ return {
183
+ w: i,
184
+ m: f
185
+ };
186
+ })();
187
+ }
188
+ function _regeneratorDefine(e, r, n, t) {
189
+ var i = Object.defineProperty;
190
+ try {
191
+ i({}, "", {});
192
+ } catch (e) {
193
+ i = 0;
194
+ }
195
+ _regeneratorDefine = function (e, r, n, t) {
196
+ function o(r, n) {
197
+ _regeneratorDefine(e, r, function (e) {
198
+ return this._invoke(r, n, e);
199
+ });
200
+ }
201
+ r ? i ? i(e, r, {
202
+ value: n,
203
+ enumerable: !t,
204
+ configurable: !t,
205
+ writable: !t
206
+ }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
207
+ }, _regeneratorDefine(e, r, n, t);
208
+ }
209
+ function _slicedToArray(r, e) {
210
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
211
+ }
212
+ function _toConsumableArray(r) {
213
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
214
+ }
215
+ function _toPrimitive(t, r) {
216
+ if ("object" != typeof t || !t) return t;
217
+ var e = t[Symbol.toPrimitive];
218
+ if (void 0 !== e) {
219
+ var i = e.call(t, r);
220
+ if ("object" != typeof i) return i;
221
+ throw new TypeError("@@toPrimitive must return a primitive value.");
222
+ }
223
+ return ("string" === r ? String : Number)(t);
224
+ }
225
+ function _toPropertyKey(t) {
226
+ var i = _toPrimitive(t, "string");
227
+ return "symbol" == typeof i ? i : i + "";
228
+ }
229
+ function _unsupportedIterableToArray(r, a) {
230
+ if (r) {
231
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
232
+ var t = {}.toString.call(r).slice(8, -1);
233
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
234
+ }
235
+ }
236
+
237
+ var UploadButton = function UploadButton(_ref) {
238
+ var onUpload = _ref.onUpload,
239
+ name = _ref.name;
240
+ var fileInputRef = useRef(null);
241
+ var handleFileChange = /*#__PURE__*/function () {
242
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {
243
+ var file, validTypes;
244
+ return _regenerator().w(function (_context) {
245
+ while (1) switch (_context.n) {
246
+ case 0:
247
+ file = e.target.files[0];
248
+ if (file) {
249
+ _context.n = 1;
250
+ break;
251
+ }
252
+ return _context.a(2);
253
+ case 1:
254
+ validTypes = ['image/png', 'image/jpg', 'image/jpeg', 'image/webp'];
255
+ if (validTypes.includes(file.type)) {
256
+ _context.n = 2;
257
+ break;
258
+ }
259
+ alert('Please upload a valid image file (.png, .jpg, .jpeg, .webp)');
260
+ return _context.a(2);
261
+ case 2:
262
+ onUpload(file);
263
+ case 3:
264
+ return _context.a(2);
265
+ }
266
+ }, _callee);
267
+ }));
268
+ return function handleFileChange(_x) {
269
+ return _ref2.apply(this, arguments);
270
+ };
271
+ }();
272
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("input", {
273
+ ref: fileInputRef,
274
+ type: "file",
275
+ accept: ".png,.jpg,.jpeg,.webp",
276
+ onChange: handleFileChange,
277
+ className: "hidden"
278
+ }), /*#__PURE__*/React.createElement("button", {
279
+ onClick: function onClick() {
280
+ var _fileInputRef$current;
281
+ return (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();
282
+ },
283
+ className: "px-6 py-3 text-lg font-semibold text-white bg-gradient-to-r from-purple-500 to-purple-700 rounded-lg shadow-lg hover:scale-105 transition-transform duration-200"
284
+ }, "".concat(name)));
285
+ };
286
+
287
+ var platformSizes = {
288
+ instagram: {
289
+ width: 1080,
290
+ height: 1080,
291
+ label: 'Instagram Post',
292
+ ratio: '1:1'
293
+ },
294
+ 'instagram-story': {
295
+ width: 1080,
296
+ height: 1920,
297
+ label: 'Instagram Story',
298
+ ratio: '9:16'
299
+ },
300
+ facebook: {
301
+ width: 1200,
302
+ height: 630,
303
+ label: 'Facebook Post',
304
+ ratio: '1.91:1'
305
+ },
306
+ linkedin: {
307
+ width: 1200,
308
+ height: 627,
309
+ label: 'LinkedIn Post',
310
+ ratio: '1.91:1'
311
+ },
312
+ youtube: {
313
+ width: 1280,
314
+ height: 720,
315
+ label: 'YouTube Thumbnail',
316
+ ratio: '16:9'
317
+ },
318
+ twitter: {
319
+ width: 1200,
320
+ height: 675,
321
+ label: 'Twitter Post',
322
+ ratio: '16:9'
323
+ },
324
+ custom: {
325
+ width: 800,
326
+ height: 800,
327
+ label: 'Custom Size',
328
+ ratio: 'Custom'
329
+ }
330
+ };
331
+
332
+ var SizeSelectorModal = function SizeSelectorModal(_ref) {
333
+ var onSelect = _ref.onSelect,
334
+ onCancel = _ref.onCancel;
335
+ return /*#__PURE__*/React.createElement("div", {
336
+ className: "fixed inset-0 bg-gradient-to-br from-gray-900 via-purple-900 to-gray-900 z-50 flex items-center justify-center p-5"
337
+ }, /*#__PURE__*/React.createElement("button", {
338
+ onClick: onCancel,
339
+ className: "fixed top-6 left-6 w-10 h-10 flex items-center justify-center bg-white bg-opacity-10 hover:bg-opacity-20 rounded-full transition-all"
340
+ }, /*#__PURE__*/React.createElement("svg", {
341
+ className: "w-6 h-6 text-white",
342
+ fill: "none",
343
+ stroke: "currentColor",
344
+ viewBox: "0 0 24 24"
345
+ }, /*#__PURE__*/React.createElement("path", {
346
+ strokeLinecap: "round",
347
+ strokeLinejoin: "round",
348
+ strokeWidth: 2,
349
+ d: "M15 19l-7-7 7-7"
350
+ }))), /*#__PURE__*/React.createElement("div", {
351
+ className: "w-full max-w-4xl bg-gray-800 bg-opacity-50 backdrop-blur-md rounded-2xl shadow-2xl p-8"
352
+ }, /*#__PURE__*/React.createElement("h2", {
353
+ className: "text-white text-3xl font-bold mb-8 text-center"
354
+ }, "Select Platform Size"), /*#__PURE__*/React.createElement("div", {
355
+ className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"
356
+ }, Object.entries(platformSizes).map(function (_ref2) {
357
+ var _ref3 = _slicedToArray(_ref2, 2),
358
+ key = _ref3[0],
359
+ _ref3$ = _ref3[1],
360
+ width = _ref3$.width,
361
+ height = _ref3$.height,
362
+ label = _ref3$.label,
363
+ ratio = _ref3$.ratio;
364
+ return /*#__PURE__*/React.createElement("div", {
365
+ key: key,
366
+ onClick: function onClick() {
367
+ return onSelect(key);
368
+ },
369
+ className: "p-6 bg-gradient-to-br from-purple-600 to-purple-800 border-2 border-purple-500 border-opacity-30 rounded-xl cursor-pointer text-center text-white transition-all hover:scale-105 hover:shadow-xl hover:border-opacity-100"
370
+ }, /*#__PURE__*/React.createElement("h3", {
371
+ className: "text-xl font-semibold mb-2"
372
+ }, label), /*#__PURE__*/React.createElement("p", {
373
+ className: "text-sm opacity-90"
374
+ }, width, " \xD7 ", height), /*#__PURE__*/React.createElement("p", {
375
+ className: "text-xs opacity-70 mt-1"
376
+ }, ratio));
377
+ }))));
378
+ };
379
+
380
+ // // utils/imageHelpers.js
381
+ // export const getCroppedImg = (imageSrc, pixelCrop) => {
382
+ // return new Promise((resolve, reject) => {
383
+ // const image = new Image();
384
+ // image.src = imageSrc;
385
+ // image.onload = () => {
386
+ // const canvas = document.createElement("canvas");
387
+ // canvas.width = pixelCrop.width;
388
+ // canvas.height = pixelCrop.height;
389
+ // const ctx = canvas.getContext("2d");
390
+
391
+ // ctx.drawImage(
392
+ // image,
393
+ // pixelCrop.x,
394
+ // pixelCrop.y,
395
+ // pixelCrop.width,
396
+ // pixelCrop.height,
397
+ // 0,
398
+ // 0,
399
+ // pixelCrop.width,
400
+ // pixelCrop.height
401
+ // );
402
+
403
+ // canvas.toBlob((blob) => {
404
+ // const file = new File([blob], "cropped_image.png", { type: "image/png" });
405
+ // resolve(URL.createObjectURL(file));
406
+ // }, "image/png");
407
+ // };
408
+ // image.onerror = reject;
409
+ // });
410
+ // };
411
+
412
+ // export const resizeImage = (imageSrc, width, height, format = "png") => {
413
+ // return new Promise((resolve, reject) => {
414
+ // const image = new Image();
415
+ // image.src = imageSrc;
416
+ // image.onload = () => {
417
+ // const canvas = document.createElement("canvas");
418
+ // canvas.width = width;
419
+ // canvas.height = height;
420
+ // const ctx = canvas.getContext("2d");
421
+ // ctx.drawImage(image, 0, 0, width, height);
422
+
423
+ // canvas.toBlob(
424
+ // (blob) => {
425
+ // const file = new File([blob], `resized_image.${format}`, { type: `image/${format}` });
426
+ // resolve(URL.createObjectURL(file));
427
+ // },
428
+ // `image/${format}`,
429
+ // 1
430
+ // );
431
+ // };
432
+ // image.onerror = reject;
433
+ // });
434
+ // };
435
+
436
+ // export const renderImageToCanvas = (canvas, image, settings) => {
437
+ // const ctx = canvas.getContext('2d');
438
+ // const { zoom, brightness, contrast, saturation, crop, dimensions } = settings;
439
+
440
+ // canvas.width = dimensions.width;
441
+ // canvas.height = dimensions.height;
442
+
443
+ // ctx.clearRect(0, 0, canvas.width, canvas.height);
444
+ // ctx.filter = `brightness(${brightness}%) contrast(${contrast}%) saturate(${saturation}%)`;
445
+
446
+ // // Calculate crop area
447
+ // const sx = (image.width * crop.x) / 100;
448
+ // const sy = (image.height * crop.y) / 100;
449
+ // const sWidth = (image.width * crop.width) / 100;
450
+ // const sHeight = (image.height * crop.height) / 100;
451
+
452
+ // // Calculate zoom positioning
453
+ // const scaledWidth = canvas.width * zoom;
454
+ // const scaledHeight = canvas.height * zoom;
455
+ // const offsetX = (canvas.width - scaledWidth) / 2;
456
+ // const offsetY = (canvas.height - scaledHeight) / 2;
457
+
458
+ // ctx.drawImage(image, sx, sy, sWidth, sHeight, offsetX, offsetY, scaledWidth, scaledHeight);
459
+ // };
460
+
461
+ // export const loadImageFromFile = (file) => {
462
+ // return new Promise((resolve, reject) => {
463
+ // const reader = new FileReader();
464
+ // reader.onload = (event) => {
465
+ // const img = new Image();
466
+ // img.onload = () => resolve({ img, dataUrl: event.target.result });
467
+ // img.onerror = reject;
468
+ // img.src = event.target.result;
469
+ // };
470
+ // reader.onerror = reject;
471
+ // reader.readAsDataURL(file);
472
+ // });
473
+ // };
474
+
475
+ var renderImageToCanvas = function renderImageToCanvas(canvas, image, settings) {
476
+ var ctx = canvas.getContext('2d');
477
+ settings.zoom;
478
+ var brightness = settings.brightness,
479
+ contrast = settings.contrast,
480
+ saturation = settings.saturation,
481
+ crop = settings.crop,
482
+ dimensions = settings.dimensions;
483
+ canvas.width = dimensions.width;
484
+ canvas.height = dimensions.height;
485
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
486
+
487
+ // Apply filters
488
+ ctx.filter = "brightness(".concat(brightness, "%) contrast(").concat(contrast, "%) saturate(").concat(saturation, "%)");
489
+
490
+ // Calculate the source crop area (what part of the original image to use)
491
+ var sx = image.width * crop.x / 100;
492
+ var sy = image.height * crop.y / 100;
493
+ var sWidth = image.width * crop.width / 100;
494
+ var sHeight = image.height * crop.height / 100;
495
+
496
+ // Draw the cropped portion to fill the entire canvas
497
+ ctx.drawImage(image, sx, sy, sWidth, sHeight,
498
+ // Source: cropped area from original image
499
+ 0, 0, canvas.width, canvas.height // Destination: fill entire canvas
500
+ );
501
+ };
502
+ var loadImageFromFile = function loadImageFromFile(file) {
503
+ return new Promise(function (resolve, reject) {
504
+ var reader = new FileReader();
505
+ reader.onload = function (event) {
506
+ var img = new Image();
507
+ img.onload = function () {
508
+ return resolve({
509
+ img: img,
510
+ dataUrl: event.target.result
511
+ });
512
+ };
513
+ img.onerror = reject;
514
+ img.src = event.target.result;
515
+ };
516
+ reader.onerror = reject;
517
+ reader.readAsDataURL(file);
518
+ });
519
+ };
520
+
521
+ var CanvasEditor = function CanvasEditor(_ref) {
522
+ var image = _ref.image,
523
+ settings = _ref.settings,
524
+ onCropChange = _ref.onCropChange;
525
+ var canvasRef = useRef(null);
526
+ var containerRef = useRef(null);
527
+ var dragStartRef = useRef({
528
+ x: 0,
529
+ y: 0
530
+ });
531
+ var cropStartRef = useRef(null);
532
+ var _useState = useState(false),
533
+ _useState2 = _slicedToArray(_useState, 2),
534
+ isDragging = _useState2[0],
535
+ setIsDragging = _useState2[1];
536
+ var _useState3 = useState(null),
537
+ _useState4 = _slicedToArray(_useState3, 2),
538
+ dragHandle = _useState4[0],
539
+ setDragHandle = _useState4[1];
540
+ var _useState5 = useState({
541
+ x: 10,
542
+ y: 10,
543
+ width: 80,
544
+ height: 80
545
+ }),
546
+ _useState6 = _slicedToArray(_useState5, 2),
547
+ cropBox = _useState6[0],
548
+ setCropBox = _useState6[1];
549
+ var _useState7 = useState({
550
+ width: 0,
551
+ height: 0
552
+ }),
553
+ _useState8 = _slicedToArray(_useState7, 2);
554
+ _useState8[0];
555
+ var setCanvasSize = _useState8[1];
556
+ useEffect(function () {
557
+ if (image && canvasRef.current) {
558
+ renderImageToCanvas(canvasRef.current, image, settings);
559
+ // Update canvas size for overlay positioning
560
+ var rect = canvasRef.current.getBoundingClientRect();
561
+ setCanvasSize({
562
+ width: rect.width,
563
+ height: rect.height
564
+ });
565
+ }
566
+ }, [image, settings]);
567
+ useEffect(function () {
568
+ setCropBox({
569
+ x: settings.crop.x,
570
+ y: settings.crop.y,
571
+ width: settings.crop.width,
572
+ height: settings.crop.height
573
+ });
574
+ }, [settings.crop]);
575
+
576
+ // const handleMouseDown = (e, handle) => {
577
+ // e.preventDefault();
578
+ // e.stopPropagation();
579
+ // setIsDragging(true);
580
+ // setDragHandle(handle);
581
+ // };
582
+ var handleMouseDown = function handleMouseDown(e, handle) {
583
+ e.preventDefault();
584
+ e.stopPropagation();
585
+ var rect = canvasRef.current.getBoundingClientRect();
586
+ dragStartRef.current = {
587
+ x: (e.clientX - rect.left) / rect.width * 100,
588
+ y: (e.clientY - rect.top) / rect.height * 100
589
+ };
590
+ cropStartRef.current = _objectSpread2({}, cropBox);
591
+ setIsDragging(true);
592
+ setDragHandle(handle);
593
+ };
594
+ var handleMouseMove = function handleMouseMove(e) {
595
+ if (!isDragging || !canvasRef.current) return;
596
+ var rect = canvasRef.current.getBoundingClientRect();
597
+ var mouseX = (e.clientX - rect.left) / rect.width * 100;
598
+ var mouseY = (e.clientY - rect.top) / rect.height * 100;
599
+ var dx = mouseX - dragStartRef.current.x;
600
+ var dy = mouseY - dragStartRef.current.y;
601
+ var newCrop = _objectSpread2({}, cropStartRef.current);
602
+ if (dragHandle === 'move') {
603
+ newCrop.x = Math.min(100 - newCrop.width, Math.max(0, cropStartRef.current.x + dx));
604
+ newCrop.y = Math.min(100 - newCrop.height, Math.max(0, cropStartRef.current.y + dy));
605
+ }
606
+ if (dragHandle === 'nw') {
607
+ newCrop.x = Math.max(0, cropStartRef.current.x + dx);
608
+ newCrop.y = Math.max(0, cropStartRef.current.y + dy);
609
+ newCrop.width = cropStartRef.current.width - dx;
610
+ newCrop.height = cropStartRef.current.height - dy;
611
+ }
612
+ if (dragHandle === 'ne') {
613
+ newCrop.y = Math.max(0, cropStartRef.current.y + dy);
614
+ newCrop.width = cropStartRef.current.width + dx;
615
+ newCrop.height = cropStartRef.current.height - dy;
616
+ }
617
+ if (dragHandle === 'sw') {
618
+ newCrop.x = Math.max(0, cropStartRef.current.x + dx);
619
+ newCrop.width = cropStartRef.current.width - dx;
620
+ newCrop.height = cropStartRef.current.height + dy;
621
+ }
622
+ if (dragHandle === 'se') {
623
+ newCrop.width = cropStartRef.current.width + dx;
624
+ newCrop.height = cropStartRef.current.height + dy;
625
+ }
626
+
627
+ // ✅ Minimum size + bounds
628
+ if (newCrop.width >= 10 && newCrop.height >= 10 && newCrop.x + newCrop.width <= 100 && newCrop.y + newCrop.height <= 100) {
629
+ setCropBox(newCrop);
630
+ onCropChange(newCrop);
631
+ }
632
+ };
633
+ var handleMouseUp = function handleMouseUp() {
634
+ setIsDragging(false);
635
+ setDragHandle(null);
636
+ };
637
+ useEffect(function () {
638
+ if (isDragging) {
639
+ window.addEventListener('mousemove', handleMouseMove);
640
+ window.addEventListener('mouseup', handleMouseUp);
641
+ return function () {
642
+ window.removeEventListener('mousemove', handleMouseMove);
643
+ window.removeEventListener('mouseup', handleMouseUp);
644
+ };
645
+ }
646
+ }, [isDragging]);
647
+ return /*#__PURE__*/React.createElement("div", {
648
+ className: "relative w-full h-full flex items-center justify-center"
649
+ }, /*#__PURE__*/React.createElement("div", {
650
+ ref: containerRef,
651
+ className: "relative inline-block"
652
+ }, /*#__PURE__*/React.createElement("canvas", {
653
+ ref: canvasRef,
654
+ className: "max-w-full max-h-full rounded-lg shadow-2xl block relative",
655
+ style: {
656
+ position: 'relative',
657
+ zIndex: 1
658
+ }
659
+ }), /*#__PURE__*/React.createElement("div", {
660
+ className: "absolute border-2 border-purple-400 cursor-move",
661
+ style: {
662
+ left: "".concat(cropBox.x, "%"),
663
+ top: "".concat(cropBox.y, "%"),
664
+ width: "".concat(cropBox.width, "%"),
665
+ height: "".concat(cropBox.height, "%"),
666
+ boxShadow: '0 0 0 9999px rgba(0,0,0,0.6)',
667
+ zIndex: 10
668
+ },
669
+ onMouseDown: function onMouseDown(e) {
670
+ return handleMouseDown(e, 'move');
671
+ }
672
+ }, /*#__PURE__*/React.createElement("div", {
673
+ className: "absolute w-6 h-6 bg-white border-3 border-purple-500 rounded-full cursor-nw-resize shadow-lg",
674
+ style: {
675
+ left: '-12px',
676
+ top: '-12px',
677
+ zIndex: 100
678
+ },
679
+ onMouseDown: function onMouseDown(e) {
680
+ return handleMouseDown(e, 'nw');
681
+ }
682
+ }), /*#__PURE__*/React.createElement("div", {
683
+ className: "absolute w-6 h-6 bg-white border-3 border-purple-500 rounded-full cursor-ne-resize shadow-lg",
684
+ style: {
685
+ right: '-12px',
686
+ top: '-12px',
687
+ zIndex: 100
688
+ },
689
+ onMouseDown: function onMouseDown(e) {
690
+ return handleMouseDown(e, 'ne');
691
+ }
692
+ }), /*#__PURE__*/React.createElement("div", {
693
+ className: "absolute w-6 h-6 bg-white border-3 border-purple-500 rounded-full cursor-sw-resize shadow-lg",
694
+ style: {
695
+ left: '-12px',
696
+ bottom: '-12px',
697
+ zIndex: 100
698
+ },
699
+ onMouseDown: function onMouseDown(e) {
700
+ return handleMouseDown(e, 'sw');
701
+ }
702
+ }), /*#__PURE__*/React.createElement("div", {
703
+ className: "absolute w-6 h-6 bg-white border-3 border-purple-500 rounded-full cursor-se-resize shadow-lg",
704
+ style: {
705
+ right: '-12px',
706
+ bottom: '-12px',
707
+ zIndex: 100
708
+ },
709
+ onMouseDown: function onMouseDown(e) {
710
+ return handleMouseDown(e, 'se');
711
+ }
712
+ }), /*#__PURE__*/React.createElement("div", {
713
+ className: "absolute inset-0 grid grid-cols-3 grid-rows-3 pointer-events-none"
714
+ }, _toConsumableArray(Array(9)).map(function (_, i) {
715
+ return /*#__PURE__*/React.createElement("div", {
716
+ key: i,
717
+ className: "border border-white border-opacity-40"
718
+ });
719
+ })))));
720
+ };
721
+
722
+ var RightToolbar = function RightToolbar(_ref) {
723
+ var settings = _ref.settings,
724
+ onSettingsChange = _ref.onSettingsChange,
725
+ imageData = _ref.imageData;
726
+ var zoom = settings.zoom,
727
+ brightness = settings.brightness,
728
+ contrast = settings.contrast,
729
+ saturation = settings.saturation,
730
+ crop = settings.crop,
731
+ dimensions = settings.dimensions;
732
+ var _useState = useState('no-change'),
733
+ _useState2 = _slicedToArray(_useState, 2),
734
+ resizeMode = _useState2[0],
735
+ setResizeMode = _useState2[1];
736
+ var _useState3 = useState(''),
737
+ _useState4 = _slicedToArray(_useState3, 2),
738
+ customWidth = _useState4[0],
739
+ setCustomWidth = _useState4[1];
740
+ var _useState5 = useState(''),
741
+ _useState6 = _slicedToArray(_useState5, 2),
742
+ customHeight = _useState6[0],
743
+ setCustomHeight = _useState6[1];
744
+ var handleChange = function handleChange(key, value) {
745
+ onSettingsChange(_objectSpread2(_objectSpread2({}, settings), {}, _defineProperty({}, key, value)));
746
+ };
747
+ var handleCropChange = function handleCropChange(key, value) {
748
+ onSettingsChange(_objectSpread2(_objectSpread2({}, settings), {}, {
749
+ crop: _objectSpread2(_objectSpread2({}, crop), {}, _defineProperty({}, key, value))
750
+ }));
751
+ };
752
+ var handleResizeChange = function handleResizeChange(mode) {
753
+ setResizeMode(mode);
754
+ var newDimensions = _objectSpread2({}, dimensions);
755
+ if (mode === 'no-change') {
756
+ newDimensions = imageData ? {
757
+ width: imageData.width,
758
+ height: imageData.height
759
+ } : dimensions;
760
+ } else if (mode === '25-smaller') {
761
+ newDimensions = {
762
+ width: Math.round(dimensions.width * 0.75),
763
+ height: Math.round(dimensions.height * 0.75)
764
+ };
765
+ } else if (mode === '50-smaller') {
766
+ newDimensions = {
767
+ width: Math.round(dimensions.width * 0.5),
768
+ height: Math.round(dimensions.height * 0.5)
769
+ };
770
+ } else if (mode === '75-smaller') {
771
+ newDimensions = {
772
+ width: Math.round(dimensions.width * 0.25),
773
+ height: Math.round(dimensions.height * 0.25)
774
+ };
775
+ } else if (mode === 'fit-800') {
776
+ var maxDim = 800;
777
+ var ratio = Math.min(maxDim / dimensions.width, maxDim / dimensions.height);
778
+ newDimensions = {
779
+ width: Math.round(dimensions.width * ratio),
780
+ height: Math.round(dimensions.height * ratio)
781
+ };
782
+ }
783
+ onSettingsChange(_objectSpread2(_objectSpread2({}, settings), {}, {
784
+ dimensions: newDimensions
785
+ }));
786
+ };
787
+ var handleCustomResize = function handleCustomResize() {
788
+ var width = parseInt(customWidth) || dimensions.width;
789
+ var height = parseInt(customHeight) || dimensions.height;
790
+ onSettingsChange(_objectSpread2(_objectSpread2({}, settings), {}, {
791
+ dimensions: {
792
+ width: width,
793
+ height: height
794
+ }
795
+ }));
796
+ };
797
+ var SliderControl = function SliderControl(_ref2) {
798
+ var label = _ref2.label,
799
+ value = _ref2.value,
800
+ _onChange = _ref2.onChange,
801
+ _ref2$min = _ref2.min,
802
+ min = _ref2$min === void 0 ? 0 : _ref2$min,
803
+ _ref2$max = _ref2.max,
804
+ max = _ref2$max === void 0 ? 200 : _ref2$max,
805
+ _ref2$step = _ref2.step,
806
+ step = _ref2$step === void 0 ? 1 : _ref2$step,
807
+ _ref2$unit = _ref2.unit,
808
+ unit = _ref2$unit === void 0 ? '%' : _ref2$unit;
809
+ return /*#__PURE__*/React.createElement("div", {
810
+ className: "mb-5"
811
+ }, /*#__PURE__*/React.createElement("label", {
812
+ className: "block text-sm font-semibold mb-2 text-white"
813
+ }, label, ": ", /*#__PURE__*/React.createElement("span", {
814
+ className: "text-purple-300 font-bold"
815
+ }, value, unit)), /*#__PURE__*/React.createElement("input", {
816
+ type: "range",
817
+ min: min,
818
+ max: max,
819
+ step: step,
820
+ value: value,
821
+ onChange: function onChange(e) {
822
+ return _onChange(parseFloat(e.target.value));
823
+ },
824
+ className: "w-full h-2 bg-gray-600 rounded-lg appearance-none cursor-pointer accent-purple-500"
825
+ }));
826
+ };
827
+ var originalDimensions = imageData ? {
828
+ width: imageData.width,
829
+ height: imageData.height
830
+ } : dimensions;
831
+ var croppedWidth = Math.round(originalDimensions.width * crop.width / 100);
832
+ var croppedHeight = Math.round(originalDimensions.height * crop.height / 100);
833
+ return /*#__PURE__*/React.createElement("div", {
834
+ className: "flex-1 overflow-y-auto p-6 bg-slate-800"
835
+ }, /*#__PURE__*/React.createElement("h3", {
836
+ className: "text-white text-xl font-bold mb-6 pb-3 border-b border-gray-600"
837
+ }, "Edit Controls"), /*#__PURE__*/React.createElement("div", {
838
+ className: "mb-6 pb-6 border-b border-gray-600"
839
+ }, /*#__PURE__*/React.createElement("h4", {
840
+ className: "text-white text-base font-bold mb-3"
841
+ }, "Resize Image"), /*#__PURE__*/React.createElement("label", {
842
+ className: "block text-sm font-semibold mb-2 text-white"
843
+ }, "Select new size:"), /*#__PURE__*/React.createElement("select", {
844
+ value: resizeMode,
845
+ onChange: function onChange(e) {
846
+ return handleResizeChange(e.target.value);
847
+ },
848
+ className: "w-full p-2.5 bg-gray-700 text-white rounded-lg border-2 border-gray-600 focus:border-purple-400 focus:ring-2 focus:ring-purple-400 focus:outline-none mb-3 text-sm font-medium"
849
+ }, /*#__PURE__*/React.createElement("option", {
850
+ value: "no-change"
851
+ }, "No change"), /*#__PURE__*/React.createElement("option", {
852
+ value: "25-smaller"
853
+ }, "25% smaller"), /*#__PURE__*/React.createElement("option", {
854
+ value: "50-smaller"
855
+ }, "50% smaller"), /*#__PURE__*/React.createElement("option", {
856
+ value: "75-smaller"
857
+ }, "75% smaller"), /*#__PURE__*/React.createElement("option", {
858
+ value: "fit-800"
859
+ }, "Fit to screen: 800 resolution"), /*#__PURE__*/React.createElement("option", {
860
+ value: "custom"
861
+ }, "Custom Size...")), resizeMode === 'custom' && /*#__PURE__*/React.createElement("div", {
862
+ className: "space-y-2"
863
+ }, /*#__PURE__*/React.createElement("div", {
864
+ className: "flex gap-2"
865
+ }, /*#__PURE__*/React.createElement("input", {
866
+ type: "number",
867
+ placeholder: "Width",
868
+ value: customWidth,
869
+ onChange: function onChange(e) {
870
+ return setCustomWidth(e.target.value);
871
+ },
872
+ className: "flex-1 p-2 bg-gray-700 text-white text-sm rounded-lg border-2 border-gray-600 focus:border-purple-400 focus:ring-2 focus:ring-purple-400 focus:outline-none font-medium"
873
+ }), /*#__PURE__*/React.createElement("span", {
874
+ className: "text-white self-center text-sm font-bold"
875
+ }, "\xD7"), /*#__PURE__*/React.createElement("input", {
876
+ type: "number",
877
+ placeholder: "Height",
878
+ value: customHeight,
879
+ onChange: function onChange(e) {
880
+ return setCustomHeight(e.target.value);
881
+ },
882
+ className: "flex-1 p-2 bg-gray-700 text-white text-sm rounded-lg border-2 border-gray-600 focus:border-purple-400 focus:ring-2 focus:ring-purple-400 focus:outline-none font-medium"
883
+ })), /*#__PURE__*/React.createElement("button", {
884
+ onClick: handleCustomResize,
885
+ className: "w-full px-4 py-2 bg-purple-600 text-white text-sm font-bold rounded-lg hover:bg-purple-700 transition-colors"
886
+ }, "Apply Custom Size")), /*#__PURE__*/React.createElement("div", {
887
+ className: "mt-3 text-xs bg-slate-900 rounded-lg p-3 border border-gray-700"
888
+ }, /*#__PURE__*/React.createElement("div", {
889
+ className: "grid grid-cols-3 gap-2"
890
+ }, /*#__PURE__*/React.createElement("div", {
891
+ className: "font-bold text-white"
892
+ }, "Your Image"), /*#__PURE__*/React.createElement("div", {
893
+ className: "text-center font-bold text-white"
894
+ }, "Width(px)"), /*#__PURE__*/React.createElement("div", {
895
+ className: "text-center font-bold text-white"
896
+ }, "Height(px)"), /*#__PURE__*/React.createElement("div", {
897
+ className: "text-gray-300 font-semibold"
898
+ }, "Original"), /*#__PURE__*/React.createElement("div", {
899
+ className: "text-center text-white font-semibold"
900
+ }, originalDimensions.width), /*#__PURE__*/React.createElement("div", {
901
+ className: "text-center text-white font-semibold"
902
+ }, originalDimensions.height), /*#__PURE__*/React.createElement("div", {
903
+ className: "text-gray-300 font-semibold"
904
+ }, "Cropped"), /*#__PURE__*/React.createElement("div", {
905
+ className: "text-center text-white font-semibold"
906
+ }, croppedWidth), /*#__PURE__*/React.createElement("div", {
907
+ className: "text-center text-white font-semibold"
908
+ }, croppedHeight), /*#__PURE__*/React.createElement("div", {
909
+ className: "text-green-400 font-bold"
910
+ }, "Final"), /*#__PURE__*/React.createElement("div", {
911
+ className: "text-center text-green-400 font-bold"
912
+ }, dimensions.width), /*#__PURE__*/React.createElement("div", {
913
+ className: "text-center text-green-400 font-bold"
914
+ }, dimensions.height)))), /*#__PURE__*/React.createElement(SliderControl, {
915
+ label: "Zoom",
916
+ value: zoom,
917
+ onChange: function onChange(val) {
918
+ return handleChange('zoom', val);
919
+ },
920
+ min: 0.5,
921
+ max: 3,
922
+ step: 0.1,
923
+ unit: "x"
924
+ }), /*#__PURE__*/React.createElement(SliderControl, {
925
+ label: "Brightness",
926
+ value: brightness,
927
+ onChange: function onChange(val) {
928
+ return handleChange('brightness', val);
929
+ }
930
+ }), /*#__PURE__*/React.createElement(SliderControl, {
931
+ label: "Contrast",
932
+ value: contrast,
933
+ onChange: function onChange(val) {
934
+ return handleChange('contrast', val);
935
+ }
936
+ }), /*#__PURE__*/React.createElement(SliderControl, {
937
+ label: "Saturation",
938
+ value: saturation,
939
+ onChange: function onChange(val) {
940
+ return handleChange('saturation', val);
941
+ }
942
+ }), /*#__PURE__*/React.createElement("div", {
943
+ className: "border-t border-gray-600 pt-4 mt-4"
944
+ }, /*#__PURE__*/React.createElement("h4", {
945
+ className: "text-white text-base font-bold mb-4"
946
+ }, "Crop Position"), /*#__PURE__*/React.createElement(SliderControl, {
947
+ label: "Crop X",
948
+ value: crop.x,
949
+ onChange: function onChange(val) {
950
+ return handleCropChange('x', val);
951
+ },
952
+ max: 50
953
+ }), /*#__PURE__*/React.createElement(SliderControl, {
954
+ label: "Crop Y",
955
+ value: crop.y,
956
+ onChange: function onChange(val) {
957
+ return handleCropChange('y', val);
958
+ },
959
+ max: 50
960
+ })));
961
+ };
962
+
963
+ var BottomActions = function BottomActions(_ref) {
964
+ var onSubmit = _ref.onSubmit,
965
+ onDownload = _ref.onDownload;
966
+ return /*#__PURE__*/React.createElement("div", {
967
+ className: "flex justify-end gap-3"
968
+ }, /*#__PURE__*/React.createElement("button", {
969
+ onClick: onDownload,
970
+ className: "px-4 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700 transition-all shadow-lg hover:shadow-xl"
971
+ }, "\u2B07 Download"), /*#__PURE__*/React.createElement("button", {
972
+ onClick: onSubmit,
973
+ className: "px-4 py-2 bg-green-600 text-white text-sm font-medium rounded-lg hover:bg-green-700 transition-all shadow-lg hover:shadow-xl"
974
+ }, "\u2713 Submit"));
975
+ };
976
+
977
+ // export const canvasToBlob = (canvas, format = 'image/png', quality = 1) => {
978
+ // return new Promise((resolve) => {
979
+ // canvas.toBlob((blob) => {
980
+ // const file = new File([blob], `psh-edited-${Date.now()}.png`, { type: format });
981
+ // resolve(file);
982
+ // }, format, quality);
983
+ // });
984
+ // };
985
+
986
+ // export const downloadFromCanvas = (canvas, filename = `psh-image-${Date.now()}.png`) => {
987
+ // const link = document.createElement('a');
988
+ // link.download = filename;
989
+ // link.href = canvas.toDataURL('image/png');
990
+ // link.click();
991
+ // };
992
+
993
+ var canvasToBlob = function canvasToBlob(canvas) {
994
+ var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'image/png';
995
+ var quality = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
996
+ return new Promise(function (resolve) {
997
+ canvas.toBlob(function (blob) {
998
+ var file = new File([blob], "psh-edited-".concat(Date.now(), ".png"), {
999
+ type: format
1000
+ });
1001
+ resolve(file);
1002
+ }, format, quality);
1003
+ });
1004
+ };
1005
+ var downloadFromCanvas = function downloadFromCanvas(canvas) {
1006
+ var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "psh-image-".concat(Date.now(), ".png");
1007
+ var link = document.createElement('a');
1008
+ link.download = filename;
1009
+ link.href = canvas.toDataURL('image/png');
1010
+ link.click();
1011
+ };
1012
+
1013
+ var ImageEditorModal = function ImageEditorModal(_ref) {
1014
+ var image = _ref.image,
1015
+ settings = _ref.settings,
1016
+ onSettingsChange = _ref.onSettingsChange,
1017
+ onSubmit = _ref.onSubmit,
1018
+ onCancel = _ref.onCancel,
1019
+ onBackToSizeSelector = _ref.onBackToSizeSelector;
1020
+ useRef(null);
1021
+ var handleCropChange = function handleCropChange(newCrop) {
1022
+ onSettingsChange(_objectSpread2(_objectSpread2({}, settings), {}, {
1023
+ crop: newCrop
1024
+ }));
1025
+ };
1026
+ var handleSubmit = /*#__PURE__*/function () {
1027
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1028
+ var canvas, file;
1029
+ return _regenerator().w(function (_context) {
1030
+ while (1) switch (_context.n) {
1031
+ case 0:
1032
+ canvas = document.querySelector('canvas');
1033
+ if (!canvas) {
1034
+ _context.n = 2;
1035
+ break;
1036
+ }
1037
+ _context.n = 1;
1038
+ return canvasToBlob(canvas);
1039
+ case 1:
1040
+ file = _context.v;
1041
+ onSubmit(file);
1042
+ case 2:
1043
+ return _context.a(2);
1044
+ }
1045
+ }, _callee);
1046
+ }));
1047
+ return function handleSubmit() {
1048
+ return _ref2.apply(this, arguments);
1049
+ };
1050
+ }();
1051
+ var handleDownload = function handleDownload() {
1052
+ var canvas = document.querySelector('canvas');
1053
+ if (canvas) {
1054
+ downloadFromCanvas(canvas);
1055
+ }
1056
+ };
1057
+ return /*#__PURE__*/React.createElement("div", {
1058
+ className: "fixed inset-0 bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 z-50 flex items-center justify-center p-5"
1059
+ }, /*#__PURE__*/React.createElement("button", {
1060
+ onClick: onBackToSizeSelector,
1061
+ className: "fixed top-6 left-6 w-10 h-10 flex items-center justify-center bg-white bg-opacity-10 hover:bg-opacity-20 rounded-full transition-all z-10"
1062
+ }, /*#__PURE__*/React.createElement("svg", {
1063
+ className: "w-6 h-6 text-white",
1064
+ fill: "none",
1065
+ stroke: "currentColor",
1066
+ viewBox: "0 0 24 24"
1067
+ }, /*#__PURE__*/React.createElement("path", {
1068
+ strokeLinecap: "round",
1069
+ strokeLinejoin: "round",
1070
+ strokeWidth: 2,
1071
+ d: "M15 19l-7-7 7-7"
1072
+ }))), /*#__PURE__*/React.createElement("div", {
1073
+ className: "w-full max-w-6xl h-[90vh] bg-slate-800 bg-opacity-60 backdrop-blur-lg rounded-2xl shadow-2xl overflow-hidden flex"
1074
+ }, /*#__PURE__*/React.createElement("div", {
1075
+ className: "flex-1 flex items-center justify-center p-8 bg-gradient-to-br from-gray-900 to-gray-800"
1076
+ }, /*#__PURE__*/React.createElement(CanvasEditor, {
1077
+ image: image,
1078
+ settings: settings,
1079
+ onCropChange: handleCropChange
1080
+ })), /*#__PURE__*/React.createElement("div", {
1081
+ className: "w-80 flex z-10 flex-col bg-slate-800 border-l border-gray-700 shadow-2xl"
1082
+ }, /*#__PURE__*/React.createElement(RightToolbar, {
1083
+ settings: settings,
1084
+ onSettingsChange: onSettingsChange,
1085
+ imageData: image
1086
+ }), /*#__PURE__*/React.createElement("div", {
1087
+ className: "p-4 bg-slate-900 border-t border-gray-700"
1088
+ }, /*#__PURE__*/React.createElement(BottomActions, {
1089
+ onSubmit: handleSubmit,
1090
+ onDownload: handleDownload,
1091
+ onCancel: onCancel
1092
+ })))));
1093
+ };
1094
+
1095
+ var PSHImageEditor = function PSHImageEditor(_ref) {
1096
+ var onSubmit = _ref.onSubmit,
1097
+ name = _ref.name;
1098
+ _ref.width;
1099
+ _ref.height;
1100
+ var _useState = useState(null),
1101
+ _useState2 = _slicedToArray(_useState, 2);
1102
+ _useState2[0];
1103
+ var setUploadedFile = _useState2[1];
1104
+ var _useState3 = useState(null),
1105
+ _useState4 = _slicedToArray(_useState3, 2),
1106
+ imageData = _useState4[0],
1107
+ setImageData = _useState4[1];
1108
+ var _useState5 = useState(false),
1109
+ _useState6 = _slicedToArray(_useState5, 2),
1110
+ showSizeSelector = _useState6[0],
1111
+ setShowSizeSelector = _useState6[1];
1112
+ var _useState7 = useState(false),
1113
+ _useState8 = _slicedToArray(_useState7, 2),
1114
+ showEditor = _useState8[0],
1115
+ setShowEditor = _useState8[1];
1116
+ var _useState9 = useState({
1117
+ zoom: 1,
1118
+ brightness: 100,
1119
+ contrast: 100,
1120
+ saturation: 100,
1121
+ crop: {
1122
+ x: 0,
1123
+ y: 0,
1124
+ width: 100,
1125
+ height: 100
1126
+ },
1127
+ dimensions: {
1128
+ width: 800,
1129
+ height: 800
1130
+ }
1131
+ }),
1132
+ _useState0 = _slicedToArray(_useState9, 2),
1133
+ settings = _useState0[0],
1134
+ setSettings = _useState0[1];
1135
+ var handleUpload = /*#__PURE__*/function () {
1136
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(file) {
1137
+ var _yield$loadImageFromF, img, _t;
1138
+ return _regenerator().w(function (_context) {
1139
+ while (1) switch (_context.p = _context.n) {
1140
+ case 0:
1141
+ _context.p = 0;
1142
+ _context.n = 1;
1143
+ return loadImageFromFile(file);
1144
+ case 1:
1145
+ _yield$loadImageFromF = _context.v;
1146
+ img = _yield$loadImageFromF.img;
1147
+ _yield$loadImageFromF.dataUrl;
1148
+ setUploadedFile(file);
1149
+ setImageData(img);
1150
+ setShowSizeSelector(true);
1151
+ _context.n = 3;
1152
+ break;
1153
+ case 2:
1154
+ _context.p = 2;
1155
+ _t = _context.v;
1156
+ console.error('Error loading image:', _t);
1157
+ alert('Failed to load image. Please try again.');
1158
+ case 3:
1159
+ return _context.a(2);
1160
+ }
1161
+ }, _callee, null, [[0, 2]]);
1162
+ }));
1163
+ return function handleUpload(_x) {
1164
+ return _ref2.apply(this, arguments);
1165
+ };
1166
+ }();
1167
+ var handleSizeSelect = function handleSizeSelect(platformKey) {
1168
+ var size = platformSizes[platformKey];
1169
+ setSettings(_objectSpread2(_objectSpread2({}, settings), {}, {
1170
+ dimensions: {
1171
+ width: size.width,
1172
+ height: size.height
1173
+ }
1174
+ }));
1175
+ setShowSizeSelector(false);
1176
+ setShowEditor(true);
1177
+ };
1178
+ var handleBackToSizeSelector = function handleBackToSizeSelector() {
1179
+ setShowEditor(false);
1180
+ setShowSizeSelector(true);
1181
+ };
1182
+ var handleEditorSubmit = function handleEditorSubmit(file) {
1183
+ onSubmit(file);
1184
+ resetEditor();
1185
+ };
1186
+ var resetEditor = function resetEditor() {
1187
+ setUploadedFile(null);
1188
+ setImageData(null);
1189
+ setShowSizeSelector(false);
1190
+ setShowEditor(false);
1191
+ setSettings({
1192
+ zoom: 1,
1193
+ brightness: 100,
1194
+ contrast: 100,
1195
+ saturation: 100,
1196
+ crop: {
1197
+ x: 0,
1198
+ y: 0,
1199
+ width: 100,
1200
+ height: 100
1201
+ },
1202
+ dimensions: {
1203
+ width: 800,
1204
+ height: 800
1205
+ }
1206
+ });
1207
+ };
1208
+ return /*#__PURE__*/React.createElement(React.Fragment, null, !showSizeSelector && !showEditor && /*#__PURE__*/React.createElement(UploadButton, {
1209
+ onUpload: handleUpload,
1210
+ name: name
1211
+ }), showSizeSelector && /*#__PURE__*/React.createElement(SizeSelectorModal, {
1212
+ onSelect: handleSizeSelect,
1213
+ onCancel: resetEditor
1214
+ }), showEditor && imageData && /*#__PURE__*/React.createElement(ImageEditorModal, {
1215
+ image: imageData,
1216
+ settings: settings,
1217
+ onSettingsChange: setSettings,
1218
+ onSubmit: handleEditorSubmit,
1219
+ onCancel: resetEditor,
1220
+ onBackToSizeSelector: handleBackToSizeSelector
1221
+ }));
1222
+ };
1223
+
1224
+ export { PSHImageEditor as default };